请大家指点一下:怎样将文件写入有文件头代表的列数组?

请大家指点一下:怎样将文件写入有文件头代表的列数组?

seconds      Primitive        Delta    Count - Type
167265        SATA_SOF        252      Host -> Dev
167290         SATA_SOF        286      Host -> Dev
167294         SATA_SOF        115      Host -> Dev
167409         SATA_SOF        131      Host -> Dev
167542         SATA_SOF        194      Host -> Dev
167737        SATA_SOF        183      Host -> Dev
167921         SATA_SOF        134      Host -> Dev
怎样将上述文件写入数组@seconds      @Primitive        @Delta    @Count - Type中?
即用列来表示。


[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
#
open FH, "data" or die "open 'data': $!";

while (<FH>) {
    chomp;

    if ($. == 1) {
        @col = (split)[0 .. 3, 5];
        next;
    }

    $i = $. - 2;
    ($col[0]->[$i], $col[1]->[$i], $col[2]->[$i], $col[3]->[$i], $col[4]->[$i]) = (split)[0 .. 3, 5];
}

print join("\t", @col), "\n";
for (0 .. $i) {
    printf ("%s\t%s\t%s\t%s\t%s\t\n",
               $seconds[$_],
               $Primitive[$_],
               $Delta[$_],
               $Count[$_],
               $Type[$_],
           );
}

print "-" x 60, "\n";
for $n (0 .. $i) {
    printf ("%s\t%s\t%s\t%s\t%s\t\n",
               $col[0]->[$n],
               $col[1]->[$n],
               $col[2]->[$n],
               $col[3]->[$n],
               $col[4]->[$n],
           );
}

close FH;

__END__
print "-" x 60, "\n";
seek FH, 0, 0;
while (<FH>) {
    print && next if $. == 1;
    chomp;

    $i = $. - 2;
    ($seconds[$i], $Primitive[$i], $Delta[$i], $Count[$i], $Type[$i]) = (split)[0 .. 3, 5];
}
for (0 .. $i) {
    printf ("%s\t%s\t%s\t%s\t%s\t\n",
               $seconds[$_],
               $Primitive[$_],
               $Delta[$_],
               $Count[$_],
               $Type[$_],
           );
}
close FH;

楼上辛苦了!不过还想问一下
$i = $. - 2;
    ($col[0]->[$i], $col[1]->[$i], $col[2]->[$i], $col[3]->[$i], $col[4]->[$i]) = (split)[0 .. 3, 5];
)是什么意思?为什么是[0 .. 3, 5];而不是0..4.?其中Count - Type是一个单元,我想一起放在$col[3]->[$i]中, 但是去掉$col[4]->[$i]也不行,该怎样改程序?




QUOTE:
原帖由 qinyu2008 于 2008-12-3 22:47 发表
楼上辛苦了!不过还想问一下
$i = $. - 2;
    ($col[0]->[$i], $col[1]->[$i], $col[2]->[$i], $col[3]->[$i], $col[4]->[$i]) = (split)[0 .. 3, 5];
)是什么意思?为什么是[0 .. 3, 5];而不是0..4.?其中 ...

我看你贴的内容Count - Type中-前后各有一个空格,split默认使用/\s+/切分字段。所以(split)[4]的内容是->,代码中忽略了。

如果Count - Type 中-前后有空格吧?

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
#
open FH, "data" or die "open 'data': $!";

while (<FH>) {
    chomp;

    @fields = split;
    if ($. == 1) {
        @col = (@fields[0 .. 2], "$fields[3]$fields[5]");
        next;
    }

    $i = $. - 2;
    ($col[0]->[$i], $col[1]->[$i], $col[2]->[$i], $col[3]->[$i]) = (@fields[0..2], "@fields[3..5]");
}

print join("\t", @col), "\n";
for $n (0 .. $i) {
    printf ("%s\t%s\t%s\t%s\t\n",
            $col[0]->[$n],
            $col[1]->[$n],
            $col[2]->[$n],
            $col[3]->[$n],
           );
}
#print "-" x 60, "\n";
#for (0 .. $i) {
#    printf ("%s\t%s\t%s\t%s\t%s\t\n",
#            $seconds[$_],
#            $Primitive[$_],
#            $Delta[$_],
#            $CountType[$_],
#           );
#}
#
close FH;

其中 $col[0]->[$i]  写成 ${col[0]}[$i]  可以吗
请教

#!/usr/bin/perl -w
use warnings;

my @array1;
my @seconds;
open (han1,"list") or die ("Can't open the file.");

while(<han1>){
push @array1,[ split ];
}
print "-------------------------\n";
foreach (@array1){
print "@$_\n";
}
print "-------------------------\n";
for(my $i=0;$i<6;$i++){
@seconds=$array1[$i][0];       为什么不能通过这样给一个数据
}
#print "$array1[2][0]\n";
print "$seconds[0]\n";
print "$seconds[1]\n";


QUOTE:
原帖由 bitterness 于 2008-12-4 10:33 发表
请教

#!/usr/bin/perl -w
use warnings;

my @array1;
my @seconds;
open (han1,"list") or die ("Can't open the file.");

while(){
push @array1,[ split ];
}
print "----------------------- ...

不能这么给数组赋值。
@seconds=$array1[$i][0];   相当于 @seconds= ( $array1[$i][0] );#只有一个元素的列表

数组赋值:
$array[@array] = value;
@array = ( list );
push @array, list,
引用等方式


QUOTE:
原帖由 machine 于 2008-12-4 09:29 发表
其中 $col[0]->[$i]  写成 ${col[0]}[$i]  可以吗

可以啊。
代码写的太漂亮了