加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 23:27:39 所属栏目:大数据 来源:网络整理
导读:我很快就记下了一个Perl脚本,它只用几列数字来平均一些文件.它涉及从一组文件句柄中读取.这是脚本: #!/usr/local/bin/perluse strict;use warnings;use Symbol;die "Usage: $0 file1 [file2 ...]n" unless scalar(@ARGV);my @fhs;foreach(@ARGV){ my $fh =
我很快就记下了一个Perl脚本,它只用几列数字来平均一些文件.它涉及从一组文件句柄中读取.这是脚本:

#!/usr/local/bin/perl

use strict;
use warnings;

use Symbol;

die "Usage: $0 file1 [file2 ...]n" unless scalar(@ARGV);

my @fhs;

foreach(@ARGV){
    my $fh = gensym;
    open $fh,$_ or die "Unable to open "$_"";
    push(@fhs,$fh);
}

while (scalar(@fhs)){
    my ($result,$n,$a,$i) = (0,0);
    while ($i <= $#fhs){
        if ($a = <$fhs[$i]>){
            $result += $a;
            $n++;
            $i++;
        }
        else{
            $fhs[$i]->close;
            splice(@fhs,$i,1);
        }
    }
    if ($n){ print $result/$n . "n"; }
}

这不起作用.如果我调试脚本,在初始化@fhs后,它看起来像这样:

DB<1> x @fhs
0  GLOB(0x10443d80)
   -> *Symbol::GEN0
         FileHandle({*Symbol::GEN0}) => fileno(6)
1  GLOB(0x10443e60)
   -> *Symbol::GEN1
         FileHandle({*Symbol::GEN1}) => fileno(7)

到现在为止还挺好.但它在我尝试从文件中读取的部分失败了:

DB<3> x $fhs[$i]
0  GLOB(0x10443d80)
   -> *Symbol::GEN0
         FileHandle({*Symbol::GEN0}) => fileno(6)
  DB<4> x $a
0  'GLOB(0x10443d80)'

$a填充了这个字符串,而不是从glob中读取的东西.我做错了什么?

解决方法

你只能在<>里面使用一个简单的标量变量从文件句柄中读取. < $FOO>作品. < $foo的[0]>不读取文件句柄;它实际上相当于glob($foo [0]).您必须使用readline builtin,临时变量或使用 IO::File和OO表示法.

$text = readline($foo[0]);
# or
my $fh = $foo[0];  $text = <$fh>;
# or
$text = $foo[0]->getline;  # If using IO::File

如果您没有从循环内的数组中删除元素,则可以通过将while循环更改为foreach循环来轻松使用临时变量.

就个人而言,我认为使用gensym创建文件句柄是一个丑陋的黑客.您应该使用IO :: File,或者将未定义的变量传递给open(至少需要Perl 5.6.0,但现在已经快10年了). (只要说我的$fh;而不是我的$fh = gensym;,并且Perl将自动创建一个新的文件句柄,并在调用open时将其存储在$fh中.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读