首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么每次读取两行时会收到未初始化的值警告?

为什么每次读取两行时会收到未初始化的值警告?
EN

Stack Overflow用户
提问于 2015-10-12 18:52:29
回答 4查看 214关注 0票数 0

我试着用while循环一次读两行,但是得到了这个错误:

代码语言:javascript
复制
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 ....

剧本:

代码语言:javascript
复制
#!/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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-10-12 19:35:42

从耗尽的文件句柄(在标量句柄中)读取时,readline操作符<HANDLE>返回undef。因此,第一个警告出现在while循环的第二次迭代中,当您从DATA读取(缺少)第4行时。接下来的两个警告来自第三次迭代,当您在一个耗尽的文件句柄上调用两次<DATA>时。

您可以通过使用不为undef的表达式来修复此问题。因为您使用perl >=v5.16,所以可以使用

代码语言:javascript
复制
while (my $line = (<DATA> // '') . (<DATA> // '')) { ...
票数 3
EN

Stack Overflow用户

发布于 2015-10-12 19:45:12

这不是一个真正的错误,它只是一个警告。您应该在偶数行号文件上得到两个警告,在奇数文件上得到三个警告。当它第一次通过while表达式时,它从第一次读取很好,然后当它第二次读取时,文件句柄是空的,并打印警告。因为它第一次返回了一些内容,所以它将执行while循环的内容。最后一次,它将对filestream进行两次评估,得到任何信息并中止循环,但是警告两次它都试图将空读连接起来。如果你需要一个while循环,我会做的

代码语言:javascript
复制
while ( my $first_lines = <DATA> ) {
    if (my $second_line = <DATA> ){
         print $first_lines . $second_line;
    }else{
        print $first_lines
        break;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2015-10-13 01:14:02

readline,又名<$fh>返回undef以指示文件的结束(或错误)。你没在查这个。修正:

代码语言:javascript
复制
while (1) {
   defined( my $line1 = <DATA> )
      or last;
   defined( my $line2 = <DATA> )
      or die("Premature end of file\n");

   print($line1 . $line2);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33088227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档