2014-07-22 1 views
1

J'ai un tableau. Comment puis-je effectuer une recherche dans le tableau de sorte que chaque élément de tableau correspondant à la sous-chaîne /DT|DATE|DTE/ soit converti en char(array_data).rechercher un tableau pour la sous-chaîne en perl

Avant l'exécution:

@word = qw{STA_DATA1 STA_DT STR_DATE TMP_DTE VAL1}; 

sur l'exécution de tout élément de réseau ayant substing comme /DT|DATE|DTE/ doit être convertie et enregistrée dans le nouveau tableau comme ci-dessous

@converted_word = qw{STA_DATA1 char(STA_DT) char(STR_DATE) char(TMP_DTE) VAL1}; 

Répondre

0

Chris Doyle vous a montré comment faire avec map. Si vous ne souhaitez pas utiliser map, vous pouvez le faire avec une boucle for régulière aussi:

#! /usr/bin/env perl 
use warnings; 
use strict; 
use Data::Dumper; 
use feature qw(say); 

my @wordsn= qw(STA_DATA1 STA_DT STR_DATE TMP_DTE VAL1); 

my @converted_words = @words; 

say Dumper \@words; 
for my $word (@converted_words) { 
    my $converted_word = @words; 
    if ($word =~ /DT|DATE|DTE/) { 
     $converted_word = "char($word)"; 
    } 
} 
say Dumper \@converted_words; 

Lorsque vous utilisez une boucle for sur un tableau, l'élément utilisé dans la boucle est un alias à l'élément dans le tableau lui-même. Ainsi, changer $word change l'élément dans la boucle elle-même.

MISE À JOUR: Je mis à jour ce programme parce que Chris a fait remarquer que le tableau modifié est supposé être dans un nouveau tableau. Le plus simple est de copier l'ancien tableau dans le nouveau tableau avant de le modifier. Bien sûr, c'est où map fonctionne bien: Avec map Chris peut mettre à jour le tableau pendant qu'il est copié. Ici, je dois copier l'ensemble du tableau dans @converted_words et puis parcourir à nouveau le tableau pour convertir chacun d'eux.

J'utilise map mais j'ai constaté que de nombreux développeurs ne le comprennent pas. Malheureusement, le Perldoc pour la carte n'est pas très utile.

+0

La boucle sera également. Cependant, la question dit ** Lors de l'exécution, tout élément de tableau ayant une sous-séquence comme DTorDATEorDTE devrait être converti et sauvegardé dans un nouveau tableau comme ci-dessous **. vous devez donc mettre à jour la boucle for pour placer les données dans un nouveau tableau plutôt que de mettre à jour les données dans le tableau existant. –

+0

Vous avez raison. Le moyen le plus simple consiste à simplement copier le tableau dans le nouveau et à faire une boucle dans le nouveau. C'est là que 'map' entre assez bien (modifiez comme vous le faites.Le problème est que' map' peut être très difficile à comprendre pour certaines personnes.Avec une boucle 'for', vous devez faire attention de ne pas toucher à l'élément d'index. –

0

Essayez ceci:

map{s/$_/char\($_\)/ if /DT|DATE|DTE/} @word; 
1

vous pouvez y parvenir avec le code ci-dessous.

my @word = qw /STA_DATA1 STA_DT STR_DATE TMP_DTE VAL1/; 
my @converted_word = map {/DT|DATE|DTE/ ? "char($_)" : $_} @word; 

Cela lire chaque élément du tableau @word et si l'élément contient DT ou DATE ou DTE il se terminera avec « char() » et placez-le dans le tableau @converted_word. sinon, il placera simplement la chaîne telle qu'elle est dans le tableau @converted_word.

sous l'exemple de code pour le montrer travailler.

use strict; 
use Data::Dumper; 

my @word = qw /STA_DATA1 STA_DT STR_DATE TMP_DTE VAL1/; 
my @converted_word = map {/DT|DATE|DTE/ ? "char($_)" : $_} @word; 


print Dumper(\@word,\@converted_word); 

sortie

$VAR1 = [ 
      'STA_DATA1', 
      'STA_DT', 
      'STR_DATE', 
      'TMP_DTE', 
      'VAL1' 
     ]; 
$VAR2 = [ 
      'STA_DATA1', 
      'char(STA_DT)', 
      'char(STR_DATE)', 
      'char(TMP_DTE)', 
      'VAL1' 

    ]; 
0

Pour éviter la conversion de STR_DTA vous pouvez utiliser char(STR_DTA):

my @word = qw /STA_DATA1 STA_DT STR_DATE STR_DTA TMP_DTE VAL1/; 
my @converted_word = map {/_(?:DT|DATE|DTE)\b/ ? "char($_)" : $_} @word; 
say Dumper\@converted_word; 

Sortie:

$VAR1 = [ 
     'STA_DATA1', 
     'char(STA_DT)', 
     'char(STR_DATE)', 
     'STR_DTA', 
     'char(TMP_DTE)', 
     'VAL1' 
    ]; 
Questions connexes