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