我正在尝试阅读文件,
while($line = $file_handle)
当我运行此代码时,程序挂起。
我注意到使用文件句柄读取文件,我们需要使用<>
while($line = <file_handle>)
后来的代码显然已经运行了。
现在我知道了运营商&lt;&gt;是逐行读取文件,我想知道当我不提供&lt;&gt;时究竟发生了什么运营商? 它无法找到该行的结尾吗?或者?
三江源
答案 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你得到一个无限循环。