我有一个数组。如何搜索数组,使每个数组项匹配子串/DT|DATE|DTE/
应转换为char(array_data)
。
执行前:
@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};
答案 0 :(得分: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,它将用" char()"包装它。并将其放在@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'
];
答案 1 :(得分:0)
试试这个:
map{s/$_/char\($_\)/ if /DT|DATE|DTE/} @word;
答案 2 :(得分: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
会更改循环本身中的元素。
UPDATED :我更新了这个程序,因为Chris指出修改后的数组假设是在一个新数组中。最简单的方法是在修改之前将旧数组复制到新数组中。当然,这是map很好用的地方:使用map
Chris可以在复制时更新数组。在这里,我必须将整个数组复制到@converted_words
,然后再次遍历数组以转换每个数组。
我使用map
但我发现很多开发人员都不理解它。不幸的是,地图的Perldoc没那么有用。
答案 3 :(得分: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'
];