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

时间:2014-06-27 20:34:00

标签: perl file-io

我的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 =>

我使用的是perl v5.18.2

3 个答案:

答案 0 :(得分:3)

使用readline代替<>

perlop说:

  

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

答案 1 :(得分:3)

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

使用以下内容明确指定您的意图:

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

答案 2 :(得分:2)

[不是答案,但评论不适合作为评论]

始终使用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]"; 
}