在Perl中“ [0]”是什么意思?

时间:2018-12-29 03:04:03

标签: perl

此代码中[0]的作用是什么:

select((select(LOG_FILE),$!=1)[0]);

2 个答案:

答案 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, ...