String 在Perl中使用裸词有哪些陷阱? P>我明白,在引用操作符(Q//Q//Q//)、散列键等方面,裸字可以用作字符串。我个人对此并不太激动,因为我不能克服字串引用的心理预期,如C、C++。然而,如果我要混合使用引用字符串和裸词,我希望确保我不会意外地击中自己的脚,因为裸词在运行时不会正确运行

String 在Perl中使用裸词有哪些陷阱? P>我明白,在引用操作符(Q//Q//Q//)、散列键等方面,裸字可以用作字符串。我个人对此并不太激动,因为我不能克服字串引用的心理预期,如C、C++。然而,如果我要混合使用引用字符串和裸词,我希望确保我不会意外地击中自己的脚,因为裸词在运行时不会正确运行,string,perl,quotes,bareword,String,Perl,Quotes,Bareword,请排除“use strict”将在编译时捕获为错误的用例。我总是启用“严格”模式,所以我不关心这些情况 以下是基于提供的答案和评论的代码说明: #!/usr/bin/perl use strict; use constant SIZE => "const_size"; sub size { return "getsize"; } my $href = { size => 1, getsize => 2, const_size =>

请排除“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

似乎对于散列键,裸字在所有情况下的行为都与预期一致。要覆盖该行为,我们需要明确地消除歧义。

是的,你可以通过不正确引用内容来打击自己的脚:

$ 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”将在编译时捕获为错误的用例

使用严格完全阻止使用。允许赤裸裸的文字会让打字错误以非常安静和/或微妙的方式失败

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


也就是说,我想你实际上是想谈论自动引用的散列键。可能会产生混淆,因为人们可能会编写
$hash{foo}
,期望它等同于
$hash{foo()}
。但是不仅仅是
foo
(与
foo()
)一开始调用sub是一种奇怪的方式,没有人会想首先编写
$hash{foo()}
。(当然需要一个论点。)


防止代码被错误解释的可能性极小的唯一方法是将常量用作散列键<代码>$hash{CONSTANT}
将失败。你需要使用
$hash{(常量)}
$hash{+CONSTANT}
,或其他形式的消歧方法。

如果它在
q
qq
内,它会被引用,所以你不能称之为空话。(
q
完全等同于单引号,
qq
完全等同于双引号)。@thisSuitesBlacknot,我称之为q//中的裸字,因为它们的外观。是的,我在问运行时错误。另一个例子出现在。所以。。。嗯。。。在你看来,如果不引用其内容,引用操作员会做什么?你的评论“我称它为
q/
中的裸词,因为它们的外观”让我担心。你能解释一下它们的外观是什么意思,以及它与
'
'
的外观有什么不同吗?如果你说的是
qw/
,我就可以开始理解了,但即使是这样,情况也大不相同。我认为你在某种程度上误导了自己,我无法理解你的思路。当我运行上述代码时,我没有得到“模糊使用-bar”这一行。我的Perl版本是:这是为cygwin多线程构建的Perl5,版本22,Subversion2(v5.22.2)。您的(%h{foo bar})示例是我正在寻找的一个用例。还有其他案例吗?@Ltf4an警告是虚假的,确实如此。不过,这不是重要的部分。@ltf4是的,fat逗号运算符也有类似的缺陷:
perl-Mstrict-MData::Dumper-e'sub foo{1}sub bar{1}my%h=(foo.bar=>1);打印转储程序\%h'
根据您上面的评论,我已经更新了描述,使用了“陷阱”一词。我认为这更能说明我在寻找什么。您上次编写
sub foo.bar{…}
是什么时候?唯一真正的问题是
$hash{CONSTANT}