我的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]";
}