我有一个带有几个键的哈希,每个键有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
答案 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");
}
您可以使用
创建文件来写入文件而不是STDOUTopen(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