0

我正在尝试打开一个文件并将其传递给一个函数并读取 100 行块。为此,我做了:

open my $fh, '<', $file or die "Unable to open the file: $!";
#get the header out
my $header = <$fh>;
my @columns =  get_column_headers($header);
getData($fh, 100);

...

sub getData {
  my $fh = shift;
  my $maxLines = shift;
  my $count = 0;
  while (my $line = <$fh> && $count < $maxLines) {
        print "line is : $line \n"; 
  }
}

此打印行是: 1
如果我在打开后在 $fh 上执行打印引用,并且当我将其传递给 getData 时,它会打印出 GLOB。我如何实际检索剩余的行而不是“1”,我假设它是读取的行数?我究竟做错了什么?

4

2 回答 2

5

只是一个优先级问题。

my $line = <$fh> && $count < $maxLines

方法

my $line = ( <$fh> && $count < $maxLines )

所以添加括号

( my $line = <$fh> ) && $count < $maxLines

哦,你忘了递增$count

( my $line = <$fh> ) && ++$count <= $maxLines
于 2013-10-22T01:43:11.637 回答
2

阅读http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity

(my $line = <$fh> && $count < $maxLines)被解释为(my $line = (<$fh> && $count < $maxLines)),向 $line 返回一个真值 (1)。

最好写成 (my $line = <$fh> and $count < $maxLines)or ((my $line = <$fh>) && ($count < $maxLines))

于 2013-10-22T01:52:53.440 回答