2

我知道在引用运算符(q//、qq//)、哈希键等中可以将裸词用作字符串。我个人对此并不太兴奋,因为我无法克服对文字的心理期望字符串应该被引用,就像在 C、C++ 中一样。但是,如果我要混合使用带引号的字符串和裸词,我想确保我不会意外地在裸词在运行时无法正常运行的情况下误伤自己。

请排除“use strict”会在编译时将它们作为错误捕获的用例。我总是启用“严格”模式,所以我不关心这些情况。

以下是基于提供的答案和评论的代码说明:

#!/usr/bin/perl

use strict;

use constant SIZE => "const_size";

sub size {
    return "getsize";
}

my $href = {
    size => 1,
    getsize => 2,
    const_size => "CONST_SIZE",
    SIZE => "LARGE",
};

print "constant SIZE:", SIZE, "\n";
print "1. \$href->{size}:", $href->{size}, "\n";
print "1a. \$href->{size()}:", $href->{size()}, "\n";
print "2. \$href->{getsize}:", $href->{getsize}, "\n";
print "3. \$href->{SIZE}:", $href->{SIZE}, "\n";
print "3a. \$href->{(SIZE)}:", $href->{(SIZE)}, "\n";

输出:

$ ./bare_word.pl
constant SIZE:const_size
1. $href->{size}:1
1a. $href->{size()}:2
2. $href->{getsize}:2
3. $href->{SIZE}:LARGE
3a. $href->{(SIZE)}:CONST_SIZE

看来,关于hash keys,在所有情况下,裸词的行为都符合预期。要覆盖该行为,我们需要明确消除歧义。

4

2 回答 2

6

请排除“use strict”会在编译时将它们作为错误捕获的用例。

use strict;完全防止使用裸词。允许使用裸词可以让拼写错误非常安静和/或巧妙地失败。

该文档声称小写裸字可能会被误解为 Perl 未来版本中的函数调用,但事实并非如此。需要启用新功能,例如say.


也就是说,我认为您实际上是在谈论自动引用的哈希键。可能会造成混淆,因为人们可能会$hash{foo}期望它等同于$hash{foo()}. 但不仅是foo(而不是foo())一种奇怪的方式来调用 sub 首先,没有人会想要写$hash{foo()}在首位。(肯定需要论证。)

唯一能防止代码被误解的可能性很小的就是常量被用作哈希键的可能性。$hash{CONSTANT}会失败。需要使用$hash{(CONSTANT)},$hash{+CONSTANT}或其他某种形式的消歧。

于 2016-12-19T00:30:16.337 回答
5

是的,你可以通过不正确地引用事情来打自己的脚:

$ perl -MData::Dumper -e'
    my %h;
    $h{"foo-bar"} = 1;
    print Dumper \%h
'
$VAR1 = {
          'foo-bar' => 1
        };

$ perl -MData::Dumper -e'
    my %h;
    $h{foo-bar} = 1;
    print Dumper \%h
'
$VAR1 = {
          '0' => 1  # oops!
        };

但是,严格模式会将其从未捕获的逻辑错误转变为语法错误:

$ perl -Mstrict -MData::Dumper -e'
    my %h; 
    $h{foo-bar} = 1; 
    print Dumper \%h
'
Bareword "foo" not allowed while "strict subs" in use at -e line 1.
Bareword "bar" not allowed while "strict subs" in use at -e line 1.
Execution of -e aborted due to compilation errors.

...除非:

$ perl -Mstrict -MData::Dumper -e'
    sub foo { 1 }
    sub bar { 1 }

    my %h;
    $h{foo-bar} = 1;
    print Dumper \%h
'
Ambiguous use of -bar resolved as -&bar() at -e line 1.
$VAR1 = {
          '1' => 1  # oops!
        };

故事的道德启示?总是use strict;,并且总是引用不是标识符的哈希键(标识符只包含字母、数字和下划线,并且第一个字符不能是数字)。

于 2016-12-18T03:32:22.360 回答