2014-07-22 45 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' 
    ];