Arrays 在perl中搜索数组中的子字符串

Arrays 在perl中搜索数组中的子字符串,arrays,regex,perl,substr,Arrays,Regex,Perl,Substr,我有一个数组。如何搜索数组,使每个数组项都匹配子字符串/DT | DATE | DTE/ 应转换为字符(数组\u数据) 执行前: @word = qw{STA_DATA1 STA_DT STR_DATE TMP_DTE VAL1}; 执行时,任何子字符串为/DT | DATE | DTE/的数组元素都应转换并保存在新数组中,如下所示 @converted_word = qw{STA_DATA1 char(STA_DT) char(STR_DATE) char(TMP_DTE) VAL1};

我有一个数组。如何搜索数组,使每个数组项都匹配子字符串
/DT | DATE | DTE/
应转换为
字符(数组\u数据)

执行前:

@word = qw{STA_DATA1 STA_DT STR_DATE TMP_DTE VAL1};
执行时,任何子字符串为
/DT | DATE | DTE/
的数组元素都应转换并保存在新数组中,如下所示

@converted_word = qw{STA_DATA1 char(STA_DT) char(STR_DATE) char(TMP_DTE) VAL1};
试试这个:

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

您可以通过以下代码实现这一点

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,它将用“char()”将其包装,并将其放置在@converted_单词数组中。否则,它只会将字符串原样放入@converted_单词数组中

下面的代码示例显示它的工作原理

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'

     ];
向您展示了如何使用。如果不想使用
映射
,也可以使用常规的
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
会更改循环中的元素本身

更新了:我更新了这个程序,因为Chris指出修改后的数组应该在一个新数组中。最简单的方法是在修改之前将旧数组复制到新数组中。当然,这是很好的解决方法:通过
map
Chris可以在复制数组时更新数组。在这里,我必须将整个数组复制到
@converted_words
中,然后再次遍历数组以转换每个单词


我使用
map
,但我发现许多开发人员不理解它。不幸的是,映射的Perldoc没有那么大帮助。

为了避免将
STR\u DTA
转换为
char(STR\u 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'
    ];

for循环也可以工作。然而,问题是,在执行时,任何子字符串为DTorDATEorDTE的数组元素都应该转换并保存在新数组中,如下所示。因此,您应该更新for循环以将数据放入新数组,而不是更新现有数组中的数据。您是对的。最简单的方法是将数组复制到新数组中,然后循环新数组。这就是
map
很好地发挥作用的地方(复制时进行修改)。问题是
map
对某些人来说可能很难理解。对于
for
循环,你必须小心不要触摸索引项。