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
循环,你必须小心不要触摸索引项。