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

时间:2014-07-22 11:15:52

标签: arrays regex perl substr

我有一个数组。如何搜索数组,使每个数组项匹配子串/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};

4 个答案:

答案 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'
    ];