我尝试使用while
循环一次读取两行但是收到此错误:
line 1
line 2
line 3
Use of uninitialized value in concatenation (.) or string at ....
Use of uninitialized value in concatenation (.) or string at ....
Use of uninitialized value in concatenation (.) or string at ....
脚本:
#!/usr/bin/perl
use warnings;
use strict;
my $count = 1;
while ( my $two_lines = <DATA> . <DATA> ) {
print $two_lines;
}
__DATA__
line 1
line 2
line 3
答案 0 :(得分:3)
readline运算符<HANDLE>
在从耗尽的文件句柄(标量句柄)中读取时返回undef。因此,当您从while
读取(缺失的)第4行时,第一次警告会出现在DATA
循环的第二次迭代中。
接下来的两个警告来自第三次迭代,当您在耗尽的文件句柄上调用<DATA>
两次。
您可以使用不是undef
的表达式来解决此问题。由于您使用的是perl&gt; = v5.16,因此您可以使用
while (my $line = (<DATA> // '') . (<DATA> // '')) { ...
答案 1 :(得分:2)
这不是一个错误,它只是一个警告。您应该在偶数行文件上收到2个警告,在奇数编号文件上收到3个警告。当第一次通过while表达式时,它从第一次读取时很好,然后当它第二次读取时,文件句柄为空,并打印警告。因为它第一次返回一些东西,它将执行while循环的内容。最后一次,它将评估文件流两次,什么都不做并中止循环,但警告它两次尝试连接空读。如果你需要一个while循环我会做
while ( my $first_lines = <DATA> ) {
if (my $second_line = <DATA> ){
print $first_lines . $second_line;
}else{
print $first_lines
break;
}
}
答案 2 :(得分:1)
readline
又名<$fh>
返回undef来表示文件的结尾(或错误)。你没有检查。修正:
while (1) {
defined( my $line1 = <DATA> )
or last;
defined( my $line2 = <DATA> )
or die("Premature end of file\n");
print($line1 . $line2);
}
答案 3 :(得分:0)
您可能不知道的是
while ( my $line = <DATA> ){ ... }
是
的缩写while ( defined( my $line = <DATA> ) ){ ... }
这种转换只发生在像这样的简单结构上。
如果它没有检查defined
ness,那么它可以跳过最后一行,如果它除了0
之外什么都没有。
(其他行也保证有行分隔符,因此它们可以继续正常工作。)
让它一次以一行或两行的方式工作的方法是:
# take advantage of the built-in transformation
while ( my $two_lines = <DATA> ) {
$two_lines .= <DATA> // '';
... # your code here
}