2014-07-22 43 views
1

我有一个数组。我该如何搜索数组,以便每个数组项匹配的子串/DT|DATE|DTE/ 应该转换为char(array_data)在perl中搜索数组的子串

之前执行:

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

在执行任何阵列元素具有substing作为/DT|DATE|DTE/应该如下

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

回答

0

Chris Doyle展示了如何用map做到这一点。如果你不希望使用map,你可以做到这一点用常规for环太:

#! /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; 

当您使用for遍历数组,在循环使用的元素的别名元素在阵列本身。因此,更改$word会更改循环本身中的元素。

修订:我更新了这个计划,因为克里斯指出,修改后的数组被假设是在一个新的数组。最简单的方法是在修改之前将旧数组复制到新数组中。当然,这是map可以很好地工作:与map克里斯可以更新数组,因为它被复制。在这里,我必须将整个数组复制到@converted_words,然后再次遍历数组以转换每个数组。我使用map但我发现许多开发人员不理解它。不幸的是,Perldoc for map并不是那么有用。

+0

for循环也可以工作。然而,问题说**执行任何数组元素具有替代作为DTorDATE或DTE应该被转换并保存在新的数组如下**。所以你应该更新for循环以将数据放入新数组中而不是更新现有数组中的数据。 –

+0

你说得对。最简单的方法就是将数组复制到新数组并循环到新数组中。这就是'map'非常好的地方(在复制的时候进行修改)问题在于map对于某些人来说可能很难理解,使用'for'循环时,必须小心不要触及索引项。 –

0

被转换和保存在新的数组试试:

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

你可以用下面的代码来实现。

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

这将会读取@word数组的每个元素,并且如果元素包含DT或DATE或DTE它将与包装它“炭()”并将其放置在@converted_word阵列英寸否则它只会将字符串放入@converted_word数组中。

下面的代码示例来显示它的工作。

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); 

输出

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

    ]; 
0

为了避免STR_DTA转化为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; 

输出:

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