数据.txt
Name:xyz
ID:1
Value: 1 2 3 4 5 6 7 8 9 ...
ID:2
Value: 9 8 7 6 5 4 3 2 1..
ID:3
Value: 90 89 88....
Name:abc
ID:11
value:...
初始文件.txt
## Header
..
data
data
data
..
最终预期的 file.txt
## Header xyz_1,xyz_2,xyz_3,abc_11,...
..
data 1 9 90
data 2 8 89
data 3 7 88
data 4 6
..
当前输出文件.txt
## Header xyz_1,xyz_2,xyz_3,abc_11,...
...
data, 1 2 3 4 5 6 7 8 9 ..,9 8 7 6 5 4 3 2 1 ..,90 89 88
data
data
...
代码
#!/usr/local/bin/perl
use diagnostics;
use strict;
use warnings;
use Tie::File;
my @name_id;
my %test;
#local $/ = '';
open my $fh, '<', 'data.txt' or die "failed: $!";
my %var;
while (<$fh>) {
chomp;
if (m/^([A-Z:]+):\s*(.*)/) {
$var{$1} = $2;
if (exists($var{Name}) && exists($var{ID}) && exists($var{value}) && $1 eq 'value') {
my $var_name = "$var{Name}_$var{ID}";
push @name_id, $var_name;
$test{$var_name} = $var{value};
}
}
}
# print join "\n\t", @test{@name_id};
my $match = "## Header";
tie my @lines, 'Tie::File', 'file.txt' or die "failed : $!";
for my $line (@lines) {
if ($line =~ /^($match.*)/) {
$line = $1 . "," . join ',', @name_id;
}
}
untie @lines;
my $match = "data";
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] } @name_id);
$i++;
}
}
untie @lines;
这条线有问题, $line = $1 . "," . join (',', map { $test{$_}->[$i]} @name_id);
它会抛出错误
不能使用字符串 ("1 2 3 4 5 6 7 8 9 .."...) 作为数组引用,而在 test.pl 第 46 行第 80 行使用“严格引用”。在 test.pl 第 46 行
我认为我拥有的 hash( %test
) 值是一个字符串,我不能将它拆分为一个数组。请让我知道如何将其转换为数组。我试过这样做$test{$var_name} = [qw($var{value})];
没有用。