在Perl中使用裸字有什么缺陷?

时间:2016-12-18 02:56:26

标签: string perl quotes bareword

据我所知,在引用运算符(q //,qq //),哈希键等时,可以将单词用作字符串。我个人对此并不太兴奋,因为我无法获得超出心理上的期望,应引用文字字符串,如C,C ++。但是,如果我采用引用字符串和简单字词的混合使用,我想确保我不会意外地在脚中射击自己,在运行时裸字不能正常运行。

请排除使用严格'的用例。会在编译时将它们视为错误。我总是启用严格的'模式,所以我不关心这些情况。

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

#!/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

对于哈希键,似乎裸字在所有情况下都表现得如预期。要覆盖行为,我们需要明确消除歧义。

2 个答案:

答案 0 :(得分:6)

  

请排除使用严格'的用例。会在编译时将它们视为错误。

use strict;完全阻止使用barewords。允许使用裸字允许拼写错误非常安静和/或巧妙地失败。

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

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

防止代码被误解的可能性的唯一因素是无限小是将常量用作散列键的可能性。 $hash{CONSTANT}会失败。一个人需要使用$hash{(CONSTANT)}$hash{+CONSTANT}或其他形式的消歧。

答案 1 :(得分: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;,并且始终引用不是identifiers的哈希键(标识符只包含字母,数字和下划线,第一个字符不能是数字)。