【问题标题】:Perl how to read a line from a file handle that is an array elementPerl如何从作为数组元素的文件句柄中读取一行
【发布时间】:2023-04-04 12:17:01
【问题描述】:

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

【问题讨论】:

    标签: perl file-io


    【解决方案1】:

    使用readline 而不是&lt;&gt;

    perlop 说:

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

    【讨论】:

      【解决方案2】:

      您的&lt;&gt; 被解释为文件glob 而不是readline

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 感谢您对严格/警告的建议!我现在将开始使用它们。这个 sn-p 是一个更大的脚本的一部分,其目的是合并/排序几个文件。我有几十个文件,每个文件都超过 100 Mb。我分别对每个文件进行排序。然后我读取每个文件的第一行,然后我选择“最低”行,打印它,然后从该文件中读取下一行,重复直到打印所有行。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多