使用tie在新行中打印哈希值

时间:2013-06-03 23:08:56

标签: perl

我有一个带有几个键的哈希,每个键有20个值。

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

@values= {a,b,..}

我想将此哈希中的值绑定到另一个文件,如下所示

我的输入文件.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 

3 个答案:

答案 0 :(得分:1)

我对你的问题感到有点困惑......

你有一些模板文件在(n)行的开头只包含ID吗?

您希望按$key迭代每个$test->{$key}[$line_count]吗?

这里似乎有点可疑(我想你一定要留下一些东西)。这个设计会有很多方法出错...

无论如何,我认为这就是你想要的:

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  

答案 1 :(得分: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将输出重定向到文件。

答案 2 :(得分: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