2017-05-29 60 views
-1

我正在處理一個C++文件。最初我使用反引號將終端結果存儲到一個數組中。我的終端結果如下所示,取決於C文件。在這種情況下,我只有3個TAP前綴:TAP1TAP2TAP3。對於某些C++文件,TAP計數可能超過10(這是非確定性的)。如何動態創建名稱由源數據生成的數組?

TAP1= 0 
TAP1= 0 
TAP1= 0 
TAP2= 0 
TAP1= 0 
TAP3= 0 
TAP1= 0 
TAP1= 0 
TAP2= 0 
TAP1= 144 
TAP1= 1300 
TAP3= 2795 
TAP1= 2963 
TAP1= 3031 
TAP2= 3291 
TAP3= 16395 
TAP1= 16699 
TAP1= 16711 
TAP2= 71 
TAP1= 36 
TAP2= 2994 
TAP1= 6634 
TAP2= 6769 
TAP1= 6837 
TAP1= 7233 
TAP2= 10985 
TAP1= 1103 

對於上面的情況我的數組是@tap = (TAP1, TAP2, TAP3)

my @store_taps; 

foreach my $a (@lines) { 
    if ($a =~ m/(.*)=(.*)/g) { 
     push(@store_taps, $1); 
    } 
} 

我的問題是如何聲明爲每個TAP陣列並自動存儲的各值:這是如下自動存儲。 @TAP1 = (0, 0, 0, 144, 1300, ...)@TAP2 = (0, 0, 3291, 71, ...)@TAP3 = (0, 0, 2795, ...)。我不知道如何自動生成這些數組。

回答

-1

您可能需要一個散列,其中的鍵是TAPn,值是數組引用。

use strict; 
use warnings; 

use Data::Dumper; 

my %data; 

while (<DATA>) { 
    chomp; 
    my ($key, $val) = split/\s*=\s*/; 
    push(@{$data{$key}}, $val); 
} 

print Dumper(\%data); 

__DATA__ 
TAP1= 0 
TAP1= 0 
TAP1= 0 
TAP2= 0 
TAP1= 0 
TAP3= 0 
TAP1= 0 
TAP1= 0 
TAP2= 0 
TAP1= 144 
TAP1= 1300 
TAP3= 2795 
TAP1= 2963 
TAP1= 3031 
TAP2= 3291 
TAP3= 16395 
TAP1= 16699 
TAP1= 16711 
TAP2= 71 
TAP1= 36 
TAP2= 2994 
TAP1= 6634 
TAP2= 6769 
TAP1= 6837 
TAP1= 7233 
TAP2= 10985 
TAP1= 1103 

輸出:

$VAR1 = { 
      'TAP2' => [ 
         '0', 
         '0', 
         '3291', 
         '71', 
         '2994', 
         '6769', 
         '10985' 
        ], 
      'TAP3' => [ 
         '0', 
         '2795', 
         '16395' 
        ], 
      'TAP1' => [ 
         '0', 
         '0', 
         '0', 
         '0', 
         '0', 
         '0', 
         '144', 
         '1300', 
         '2963', 
         '3031', 
         '16699', 
         '16711', 
         '36', 
         '6634', 
         '6837', 
         '7233', 
         '1103' 
        ] 

    }; 
+0

非常感謝@Matt Jacob。我還有一個繼續問題。我如何真正比較你生成的兩個哈希值?將這些值存儲在哈希值中後,我將更改測試用例並再次運行該程序。這次它將生成相同數量的輸出(Tap),但是具有相同和不同的輸出值。我需要存儲第二次生成的獨特輸出。 –

+0

@nandeeshv這聽起來像是值得一個單獨的問題,但有很多好的模塊可以幫助,例如,[數據::比較](https://metacpan.org/pod/Data::Compare)。 –

+0

感謝鏈接@Matt Jacob –

0

不,你需要散列。

my %tap_for; for my $l (@lines) { chomp $l; # if you haven't already my ($tap, $val) = split /=/, $l, 2; push @{$tap_for{$tap}}, $val; }

你可以做到這一切在一個單一的通行證。比您要查找的方法簡單得多,並且您不必創建需要動態查找名稱的任意變量。

+0

非常感謝@Tanktalus –

+0

我有一個更持續的問題。我如何真正比較你生成的兩個哈希值?將這些值存儲在哈希值中後,我將編譯更改測試用例並再次運行該程序。這次它將生成相同數量的輸出(Tap),但是具有相同和不同的輸出值。我需要存儲第二次生成的獨特輸出。 –