pyt*_*hor 4 arrays perl filehandle
我很快就记下了一个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,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"; }
}
Run Code Online (Sandbox Code Playgroud)
这不起作用.如果我调试脚本,在初始化@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)
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但它在我尝试从文件中读取的部分失败了:
DB<3> x $fhs[$i]
0 GLOB(0x10443d80)
-> *Symbol::GEN0
FileHandle({*Symbol::GEN0}) => fileno(6)
DB<4> x $a
0 'GLOB(0x10443d80)'
Run Code Online (Sandbox Code Playgroud)
$ a填充了这个字符串,而不是从glob中读取的东西.我做错了什么?
cjm*_*cjm 12
你只能在里面使用一个简单的标量变量<>来读取文件句柄. <$foo>作品. <$foo[0]>不读取文件句柄; 它实际上相当于glob($foo[0]).您必须使用readline内置,临时变量或使用IO :: File和OO表示法.
$text = readline($foo[0]);
# or
my $fh = $foo[0]; $text = <$fh>;
# or
$text = $foo[0]->getline; # If using IO::File
Run Code Online (Sandbox Code Playgroud)
如果您没有从循环内的数组中删除元素,则可以通过将while循环更改为循环来轻松使用临时变量foreach.
就个人而言,我认为使用gensym创建文件句柄是一个丑陋的黑客.您应该使用IO :: File,或者将未定义的变量传递给open(至少需要Perl 5.6.0,但现在已经差不多10年了).(只是说my $fh;而不是my $fh = gensym;,Perl会自动创建一个新的文件句柄并在$fh你打电话时存储它open.)