此代码中[0]的作用是什么:
select((select(LOG_FILE),$!=1)[0]);
答案 0 :(得分:3)
更新:我十年前回答了! What does “select((select(s),$|=1)[0])” do in Perl?
您正在查看对列表的单个元素访问。括号中的表达式产生某种列表,[0]
从列表中选择一项。
这段代码是一个非常古老的习惯用法,用于设置每个文件句柄kinda-global变量。我认为您可能是指$|
(自动刷新设置)而不是$!
。
首先,请记住Perl具有“默认文件句柄”的概念。最初是作为标准输出,但是您可以更改它。 select
就是这样做的。
接下来,意识到每个文件句柄都知道自己对各种事物的设置;这些由特殊变量表示,例如$|
(请参见perlvar's section on "Variables related to Filehandles")。当您更改这些变量时,它们将应用于当前的默认文件句柄。
因此,在这个惯用语中看到的是内部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);
答案 1 :(得分:2)
( LIST1 )[ LIST2 ]
是列表切片。在列表上下文中,它求值为LIST1
指定的LIST2
的元素。
在这种情况下,它返回select
的结果。
select((select(LOG_FILE),$!=1)[0]);
应该是
select((select(LOG_FILE),$|=1)[0]);
后者为LOG_FILE
文件句柄启用自动刷新。可以更清楚地写成如下:
use IO::Handle (); # Only needed in older versions of Perl.
LOG_FILE->autoflush(1);
顺便说一句,您不应该使用这样的全局变量。代替
open LOG_FILE, ...
您应该使用
open my $LOG_FILE, ...