这段代码中的[0]在做什么:
select((select(LOG_FILE),$!=1)[0]);
更新:我十年前回答了!在Perl中“ select((select,$ | = 1)[0])”是做什么的?
您正在查看对列表的单个元素访问。括号中的表达式产生某种列表,然后[0]
从列表中选择一项。
此代码段是设置每个文件句柄kinda-global变量的非常古老的习惯用法。我认为您可能是指$|
(自动刷新设置)而不是$!
。
首先,请记住Perl具有“默认文件句柄”的概念。最初是标准输出,但是您可以更改它。那就是这样select
做的。
接下来,意识到每个文件句柄都知道自己对各种事物的设置;这些由特殊变量表示,例如$|
(请参见perlvar的“与文件句柄相关的变量”的部分)。当您更改这些变量时,它们将应用于当前的默认文件句柄。
因此,您在这个习惯用法中看到的是一个内部组件select
,它可以更改默认文件句柄。您更改默认值,然后将其设置$|
为所需的任何值。看起来有些奇怪,因为您有两个用逗号而不是用分号分隔的表达式,即use语句分隔符:
(select(LOG_FILE), $|=1)
从这个角度来看,成语希望得到结果select
;那是先前的默认文件句柄。为了得到那个,你想要那个列表中的第一项。那是在索引0中:
(select(LOG_FILE), $|=1)[0]
整个表达式的结果是先前要恢复的默认文件句柄。用外部做select
:
select((select(LOG_FILE), $|=1)[0]);
您可以使用中间变量来编写该代码:
my $previous = select LOG_FILE;
$| = 1;
select($previous);
如果您自己编写新内容,则可以对文件句柄使用标量变量,然后调用其autoflush
方法:
open my $log_file_fh, '>', $log_filename or die ...;
$log_file_fh->autoflush(1);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句