0

我有一个带有几个键的散列,每个键有 20 个值。

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

@values= {a,b,..}

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

我的输入文件.txt

ID
ID
ID
...

预期文件.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 
4

3 回答 3

1

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

您有一些仅包含ID在 (n) 行开头的模板文件?

你想遍历$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  
于 2013-06-04T00:05:31.107 回答
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

于 2013-06-04T00:02:18.800 回答
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;

输出(文件.txt):

ID,10,56
ID,14,67
ID,34,89
ID,56,66
于 2013-06-04T00:10:20.780 回答