切换时,文件测试在给定的...中使用`$ _`或`_`?

时间:2011-03-30 21:35:23

标签: perl

使用file test operators时,stat()结果会缓存在_中,因此如果您要执行多项测试,则无需进行更多系统调用。

if (-f $file_) {
  say 'readable' if -r _;
  say 'writable' if -w _;
}

如果我在given…when中使用它们,他们会使用_还是$_

given ($file) {
  when (! -f) {}
  when (-r) {say 'readable';continue}
  when (-w) {say 'writable';continue}
  ....
}

我的印象是这将使用$_。真的吗?另外,因为given…when没有默认值,所以有必要使用continue来查看其他匹配项。

使用if可能更好地解决了这种情况,并且使用的排序少于given…when方法。但是,在重构软件时,看起来是否适合given…when太诱人了。 ; - )

2 个答案:

答案 0 :(得分:5)

这就是它所摒弃的:

sub {
    use warnings;
    use strict 'refs';
    BEGIN {
        $^H{'feature_unicode'} = q(1);
        $^H{'feature_say'} = q(1);
        $^H{'feature_state'} = q(1);
        $^H{'feature_switch'} = q(1);
    }
    my $file = shift @_;
    given ($file) {
        when (not -f $_) {
            ();
        }
        when (-r $_) {
            say 'readable';
            continue;
        }
        when (-w $_) {
            say 'writable';
            continue;
        }
    }
}

因此它不会在操作码中显示智能匹配。

答案 1 :(得分:0)

虚拟文件句柄_永远不是文件测试操作符的默认参数(不计算所有操作同一文件的堆栈文件测试,因为只有其中一个文件具有参数)。您必须明确地使用它来告诉文件测试使用上一个文件stat中的值。

$_是大多数其他文件测试运算符的默认值,但不是全部。