2011-09-09 82 views
1

例如,從perl數組中獲取多個值的最佳方式是什麼?

首先,我得到dataRecord成這樣的陣列,

my @dataRecord = split(/\n/); 

接下來,我在陣列的數據記錄,以獲得測試線這樣過濾,

@dataRecord = grep(/test_names/,@dataRecord); 

接下來,我需要從測試線像這樣得到測試名稱,

my ($test1_name,$test2_name,$test3_name) = getTestName(@dataRecord); 

    sub getTestName 
    { 
     my $str = shift @_; 
     # testing the str for data and 
     print str,"\n"; # This test point works in that I see the whole test line. 
     $str =~ m{/^test1 (.*), test2 (.*), test3 (.)/}; 
     print $1, "\n"; # This test point does not work. 
     return ($1,$2,$3); 
    } 

有沒有更好的方法來完成這個任務?

+0

你期待什麼樣的價值觀去取回? –

回答

4

您可以將操作鏈接在一起,同時減少所需的語法。這具有強調程序的重要部分同時減少語法噪聲的優點。

my @test = map m{/^test1 (.*), test2 (.*), test3 (.)/}, 
      grep /test_names/, 
      split /\n/; 

# use $test[0], $test[1], $test[2] here 

如果您正試圖調試問題,地圖和grep可以採取塊,因此很容易插入錯誤校驗碼:

my @test = map { 
       if (my @match = m{/^test1 (.*), test2 (.*), test3 (.)/}) { 
        @match 
       } else { 
        die "regex did not match for: $_" 
       } 
      } # no comma here 
      grep /test_names/, 
      split /\n/; 

下面是從一個數組分配幾個不同的方法不直接關係到你的問題,但可能是有用的:

my ($zero, $one, $two) = @array; 
my (undef, $one, $two) = @array; 
my (undef, undef, $two) = @array; # better written `my $two = $array[2];` 

my ($one, $two) = @array[1, 2]; # note that 'array' is prefixed with a @ 
my ($one, $two) = @array[1 .. 2]; # indicating that you are requesting a list 
            # in turn, the [subscript] sees list context 
my @slice = @array[$start .. $stop]; # which lets you select ranges 

要解壓縮的參數傳遞給一個子程序:

my ($first, $second, @rest) = @_; 

在這種需要name => value雙的方法:通過其返回值賦給變量的列表

my ($self, %pairs) = @_; 
+0

謝謝埃裏克,我怎樣才能確保沒有空值進入@測試數組? –

+0

什麼類型的null?該值可能是未定義的,在這種情況下'grep defined,...'。價值可能沒有長度,'grep長度,...'。該值可以爲零,'grep $ _!= 0,...'。或者它可能是錯誤的,'grep $ _,...'。將這些中的任何一個添加到出現錯誤值的位置處的處理堆棧中。 –

+0

再次感謝埃裏克,我正在使用模式匹配(m //)錯誤中的未初始化值$ str,這聽起來像該值未定義。這是一個奇怪的錯誤,因爲我認爲grep只會捕獲您告訴它通過每個數據記錄捕獲的過濾器數據。 –

0

您可以通過在列表環境中m//運營商處獲得匹配的子表達式的一個列表,例如(就像你現在使用子程序調用一樣)。所以,你可以用更簡單的結構取代子程序:

my $str = shift @dataRecord; 
my ($test1_name, $test2_name, $test3_name) = 
    $str =~ m/^test1 (.*), test2 (.*), test3 (.)/; 

或者,for循環,如果你想爲@dataRecord陣列中的每個元素做到這一點:

for my $str (@dataRecord) { 
    my ($test1_name, $test2_name, $test3_name) = 
     $str =~ m/^test1 (.*), test2 (.*), test3 (.)/; 
} 
相關問題