2013-06-03 30 views
0

我有一個有少量鍵的散列,每個鍵有20個值。使用領帶在新行中打印散列值

%test={ 
a=> 10 14 34 56 .... 
b=> 56 67 89 66 ... 
.. 
} 

@values= {a,b,..} 

我想從這個散列值綁到另一個文件如下圖所示

我輸入file.txt的

ID 
ID 
ID 
... 

file.txt的

ID ,10 ,56 
ID ,14, 67 
ID ,34, 89 
ID ,56, 66 
.. 

我的代碼預期現在將所有的值綁定到我的文件的第一行。請幫助格式化它。

my $match = "ID"; 

tie my @lines, 'Tie::File', 'file.txt' or die "failed : $!"; 

for my $line (@lines) { 

    while ($line =~ /^($match.*)/) { 
     $line = $1 . "," . join ',',@test{@values}; 
    } 
} 
untie @lines; 

現在我的輸出是

file.txt 
ID ,10 ,14, 34, 56,... 56, 67, 89, 66.... 
ID 
ID 
ID 
+0

能否請您提供您所期望的輸出? – ikegami

+0

我剛剛更新了我的當前輸出。我只想格式化它,如file.txt所示 – user2441289

+0

如果file.txt是您的預期輸出,請提供用作輸入的文件。 – ikegami

回答

1

我有點您的問題困惑......

你有一些模板文件,該文件只包含ID在(N)線的開始?

而你想遍歷每個?

這裏有些東西似乎很腥(我認爲你必須留下一些東西)。還有的將是一個相當一些方法去錯了這種設計...

不管怎麼說,我覺得這是你要什麼:

my $match = "ID"; 
my $test = { 
    a => [ qw(1 3 5) ], 
    b => [ qw(2 4 6) ], 
}; 

tie my @lines, 'Tie::File', 'file.txt' or die "failed : $!"; 

my $i = 0; 
for my $line (@lines) { 
    if($line =~ /^($match.*)/) { 
     my @stuff =(); 
     for my $key (keys %$test) { 
      push @stuff, $test->{$key}[$i]; 
     } 
     $line = $1 . ", " . join(', ', @stuff); 
     $i++; 
    } 
} 
untie @lines; 

假設這是你有什麼/想:

$ cat file.txt 
ID 
ID 
ID 
$ test.pl 
$ !cat 
cat file.txt 
ID, 1, 2 
ID, 3, 4 
ID, 5, 6 
+0

我應該如何使用@values作爲鍵來更改代碼。我在哈希鍵是錯誤的順序。 – user2441289

+0

如果'(sort keys%$ test)'不能解決問題。所有你必須改變的是內部'for'爲'我的$ key(@values){'。您必須確保'array'中的每個元素都存在於散列中的'key'中。 – chrsblck

0

你只是想

my %test = (
    a => [ 10, 14, 34, 56, ... ], 
    b => [ 56, 67, 89, 66, ... ], 
); 

for (0..$#{ $test{a} }) { 
    print(join(',', 'ID', $test{a}[$_], $test{b}[$_]), "\n"); 
} 

您可以通過創建使用

文件寫入到文件,而不是STDOUT
open(my $fh, '>', 'file.txt') 
    or die("Can't create file.txt: $!\n"); 

,然後使用

print($fh ...); 

,但它是更好地讓用戶輸出重定向到使用>file.txt文件。

0

這是我拿,雖然領帶似乎是多餘的對我說:

use strict; 
use warnings; 
use Tie::File; 
my %test=(
    a=> [qw(10 14 34 56)], 
    b=> [qw(56 67 89 66)] 
); 
my @values= qw(a b); 
my $match = "ID"; 
tie my @lines, 'Tie::File', 'file.txt' or die "failed : $!"; 
my $i = 0; 
for my $line (@lines) { 
    if ($line =~ /^($match.*)/) { 
     $line = $1 . "," . join(',', map { $test{$_}->[$i]} @values); 
     $i++; 
    } 
} 
untie @lines; 

輸出(file.txt的):

ID,10,56 
ID,14,67 
ID,34,89 
ID,56,66 
+0

它顯示警告 - 在測試時,不能使用字符串(「16 15 0.15 0.015 0。」...)作爲ARRAY ref,而在test.pl 48行,<$fh> 81行使用「strict refs」。 pl line 48 – user2441289

+0

複製並粘貼上面的代碼,而不是修改自己的代碼。這聽起來像是你在'%test =(....'part – perreal

+0

部分做錯了事情。但輸出文件就像ID 10 14 34 56 56 67 89 66 ID 10 14 34 56 56 67 89 66 ID 10 14 34 56 56 67 89 66 ......而不是我想要的東西它打印所有第 – user2441289