操作员使用文件句柄读取文件

时间:2016-06-01 20:42:33

标签: perl

我正在尝试阅读文件,

    while($line = $file_handle)

当我运行此代码时,程序挂起。

我注意到使用文件句柄读取文件,我们需要使用<>

   while($line = <file_handle>)

后来的代码显然已经运行了。

现在我知道了运营商&lt;&gt;是逐行读取文件,我想知道当我不提供&lt;&gt;时究竟发生了什么运营商? 它无法找到该行的结尾吗?或者?

三江源

3 个答案:

答案 0 :(得分:3)

鉴于此代码:

$x

在调试器中运行时,您可以看到GLOB现在包含$x(文件句柄的副本)。在每次迭代中,while(1){...将整个句柄作为赋值,并导致无限循环,因为该语句始终为true。因为你总是分配一个真值(句柄),所以while语句实际上与写perl -d script.pl main::(x.pl:4): open my $fh, '<', 'in.txt' or die $!; DB<1> s main::(x.pl:6): while (my $x = $fh){ DB<1> s main::(x.pl:7): $DB::single=1; DB<1> x $x 0 GLOB(0xbfdae8) -> *main::$fh FileHandle({*main::$fh}) => fileno(6) DB<2> s main::(x.pl:7): $DB::single=1; DB<2> x $x 0 GLOB(0xbfdae8) -> *main::$fh FileHandle({*main::$fh}) => fileno(6) 没什么不同。

<$fh>

undef本质上从文件句柄中提取一行,当命中EOF(或发生错误)时,返回undef,这将终止循环(因为<div class="container"> <form action="" class="form-inline"> <div class="form-group"> <select class="form-control"><option>Select option</option></select> </div> <div class="form-group">vs</div> <div class="form-group"> <select class="form-control"><option>Select option</option></select> </div> </form> </div> 为false )。

答案 1 :(得分:1)

文件由<>运算符读取,因此如果没有它,它只是一个赋值,因此是无限循环。

while (...) { ... }检查()内的条件,如果为true,则执行块{}中的主体。它一直这样做,直到()中的条件评估为错误(通常为0'0'''undef)。这就是运算符<>提供的内容,例如,我们有一个成语

while (my $line = <$file_handle>) { ... }

<>运算符在与$file_handle关联的资源的每次迭代中读取一行,当它到达文件结尾时,它返回undef,因此循环终止并且程序执行在循环后的下一个语句处继续。 菱形运算符 <>是函数readline的运算符形式。见I/O Operators in perlop。为了实现这一切,$file_handle必须是可以检索数据的有效资源。

如果没有<>运算符,则无需从任何地方读取任何内容,但只有一个赋值。代码执行以下操作。它将变量$file_handle复制到变量$line中。 Perl中该操作的返回值是以$line结尾的值,如果这是'truthy'值,则执行正文{ ... }$file_handle明确地评估为'true',否则循环体甚至不执行一次,程序将继续。因此$line也是如此。因此,如果$file_handle在循环体{...}中没有变化,则条件始终为真。

然后身体中的任何东西都会被执行,没有循环终止的原因,因此它永远不会将控制权返回给程序。这是一个无限循环,程序出现挂起。

请注意,这有时会被故意使用,您可能会看到类似

的代码
while (1) {
    # Compute what is needed
    # Recalculate the condition for when to stop
    last if $condition_to_terminate;
}

这种方法虽然风险很大,但由于条件会变得越来越复杂,并且错误可能会进入,在这种情况下,我们最终会遇到无限循环。通常有更清晰的方法来控制循环。

一个完全不同的例子是事件循环,其中输入无限循环至关重要,这样我们就可以等待某种类型的事件。指出采取了特定的行动。这就是GUI的工作方式,例如,以及许多其他系统。

答案 2 :(得分:0)

对于&#39; hung&#39;:

的例子
while($line = $file_handle)

元素$line = $file_handle纯粹是一项任务。此时,您的while只是检查分配是否真实,即$line不是数字0,字符串0,空字符串或undef,当然它是&#39;不是 - &gt; hense你得到一个无限循环。