选择undef,undef,undef .XX

011*_*112 1 perl

几年前,当我最初学习Perl时,我发现自己想要说出类似的话:

sleep .07;
Run Code Online (Sandbox Code Playgroud)

但这实际上并不奏效.

有人教我使用:

select undef, undef, undef, .07;
Run Code Online (Sandbox Code Playgroud)

代替.

我一直想知道:这意味着什么,为什么它有效?

Mil*_*ler 9

这使用了记录的第三种形式select:

select RBITS,WBITS,EBITS,TIMEOUT
Run Code Online (Sandbox Code Playgroud)

这会select(2)使用指定的位掩码调用syscall

....
Run Code Online (Sandbox Code Playgroud)

这样可以实现250毫秒的睡眠:

    select(undef, undef, undef, 0.25);
Run Code Online (Sandbox Code Playgroud)

实现此功能的更好方法是使用 Time::HiRes qw(usleep)

use Time::HiRes qw(usleep);

usleep($microseconds);
Run Code Online (Sandbox Code Playgroud)

  • 因为稍后阅读代码的人不一定要问它该做什么.</ snark> :) (10认同)

TLP*_*TLP 5

文档中select,它描述如下:

...
select RBITS,WBITS,EBITS,TIMEOUT
        This calls the select(2) syscall with the bit masks specified,
        which can be constructed using "fileno" and "vec", along these
        lines:

            $rin = $win = $ein = '';
            vec($rin, fileno(STDIN),  1) = 1;
            vec($win, fileno(STDOUT), 1) = 1;
            $ein = $rin | $win;
...
Run Code Online (Sandbox Code Playgroud)

据推测,这只是一个具有超时精度的任意命令sleep.这就是它的原因.这也在文档中进一步提到:

You can effect a sleep of 250 milliseconds this way:

    select(undef, undef, undef, 0.25);
Run Code Online (Sandbox Code Playgroud)

TL; DR:这是一种通过select超时调用函数的方法.