Perl如何从作为数组元素的文件句柄中读取一行



我的perl脚本接受任意数量的文件,打开它们,并从每个文件中读取一行。但这行不通。这是我的代码。

#!/bin/perl
$numfile = scalar @ARGV;
for ($i = 0; $i < $numfile; ++$i)
{
    open $fh[$i],"<",$ARGV[$i];
    $line[$i] = <$fh[$i]>;
}
for ($i = 0; $i < $numfile; ++$i) 
{ 
    print  "$i => $line[$i]"; 
}

知道为什么这不起作用吗?在数组中存储文件句柄是非法的吗?

我希望它打印每个文件的第一行。而是得到

0 => GLOB(0x36d190)1 =>

readline代替<>

perlop说:

如果尖括号内的内容既不是文件句柄,也不是包含文件句柄名称的简单标量变量,则typeglob,或typeglob引用,它被解释为一个文件名模式,将被环球化

您的<>被解释为文件glob而不是readline

使用以下语句来明确指定你的意图:

$line[$i] = readline $fh[$i];

[不是答案,而是不适合作为注释的注释]

始终使用use strict; use warnings;。没有他们,你会严重妨碍你自己。

你不需要使用多个句柄,因为你永远不需要同时使用多个句柄。

其他一些清理:

#!/bin/perl
use strict;
use warnings;
my @first_lines;
for my $qfn (@ARGV)
{
    open(my $fh, '<', $qfn)
        or die("Can't open $qfn: $!n");
    push @first_lines, scalar( <$fh> );
}
for my $i (0..$#first_lines)
{ 
    print  "$i => $first_lines[$i]"; 
}

最新更新