在Perl中使用哈希时引用密钥是个好主意吗?
我正在研究一个非常大的遗留Perl代码库,并尝试采用Damian Conway在Perl Best Practices中提出的许多最佳实践。我知道最佳实践总是总是一个程序员的敏感主题,但希望我能在没有开始火焰战争的情况下得到一些好的答案。我也知道这可能是很多人不会争论的问题,因为它是一个小问题,但我正试图在我通过这个代码库工作时得到一个可靠的指南列表。
在Perl Best Practices book by Damian Conway中,有一个示例显示了对齐如何帮助一段代码的易读性,但它没有提及(我可以找到的书中的任何地方)引用哈希键的任何内容。
$ident{ name } = standardize_name($name);
$ident{ age } = time - $birth_date;
$ident{ status } = 'active';
这不是更好用引号来写,以强调你没有使用裸言语吗?
$ident{ 'name' } = standardize_name($name);
$ident{ 'age' } = time - $birth_date;
$ident{ 'status' } = 'active';
答案 0 :(得分:34)
没有引号更好。它在{}所以很明显你没有使用裸字,而且它更容易阅读和输入(少两个符号)。但当然,所有这些都取决于程序员。
答案 1 :(得分:26)
指定常量字符串哈希键时,应始终使用(单个)引号。例如,$hash{'key'}
这是最好的选择,因为它不需要考虑这个问题并导致格式一致。如果您有时不使用引号,则必须记住在键包含内部超量,空格或其他特殊字符时添加它们。在这些情况下,必须使用引号,导致格式不一致(有时不引用,有时引用)。引号键也更可能由编辑器突出显示语法。
这是一个使用“有时引用,而不是引用其他时间”约定的例子,可能会让你遇到麻烦:
$settings{unlink-devices} = 1; # I saved two characters!
这将在use strict
下编译得很好,但在运行时不会完全按照您的预期进行编译。哈希键是字符串。字符串应根据其内容引用:单引号用于文字字符串,双引号用于允许变量插值。引用你的哈希键。这是最安全的惯例,最容易理解和遵循。
答案 2 :(得分:12)
我从不单引号哈希键。我知道{}基本上像引号一样工作,除非在特殊情况下(a +和双引号)。我的编辑也知道这一点,并给我一些基于颜色的线索,以确保我按照我的意图行事。
在任何地方使用单引号在我看来就像是一个不懂Perl的人所做的“防御性”练习。节省一些键盘磨损并学习Perl:)
随着咆哮的发生,我发布此评论的真正原因......其他评论似乎错过了+
将“取消引用”一个裸字的事实。这意味着你可以写:
sub foo {
$hash{+shift} = 42;
}
或:
use constant foo => 'OH HAI';
$hash{+foo} = 'I AM A LOLCAT';
所以很明显+shift
表示“调用shift函数”而shift
表示“字符串'shift'”。
我还要指出,cperl-mode正确地突出了所有各种情况。如果没有,请在IRC上ping我,我会解决它:)
(哦,还有一件事。我在Moose中引用属性名称,就像在has 'foo' => ...
中一样。这是我从stevan工作中习惯的习惯,虽然我觉得它看起来不错......但是与我的其余代码有点不一致。也许我会很快停止这样做。)
答案 3 :(得分:10)
无引号哈希键从Larry Wall获得语法级别的关注,以确保它们没有理由不是最佳实践。不要出汗。
(顺便提一下,数组键的引用是在PHP中的最佳实践,如果不能使用它们会有严重的后果,更不用说大量的E_WARNING了。好的Perl!=在PHP中没问题。)
答案 4 :(得分:6)
我认为这方面没有最好的做法。我个人在哈希键中使用它们如下:
$ident{'name'} = standardize_name($name);
但不要在箭头操作符的左侧使用它们:
$ident = {name => standardize_name($name)};
不要问我为什么,这只是我这样做的方式:)
我认为你能做的最重要的事情就是永远,永远,永远:
use strict;
use warnings;
这样编译器会为你捕获任何语义错误,让你不太可能输入错误的内容,无论你决定采用哪种方式。
第二个最重要的是要保持一致。
答案 5 :(得分:5)
我没有引号,只是因为输入和阅读并不用担心。我有一个不会被自动引用的键的时间很少而且很远,所以不值得所有额外的工作和杂乱。也许我选择的哈希键已经改变以适合我的风格,这也是一样的。完全避免边缘情况。
这与我默认使用"
的原因相同。对于我来说,在字符串中间放置一个变量比使用我不想插入的字符更常见。也就是说,我经常写'Hello, my name is $name'
而不是"You owe me $1000"
。
答案 6 :(得分:4)
至少,引用防止语法突出显示不太完美的编辑器中的保留字。退房:
$i{keys} = $a;
$i{values} = [1,2];
...
答案 7 :(得分:3)
加上引号!他们在视觉上打破了语法,更多的编辑将在语法高亮中支持它们(嘿,甚至Stack Overflow都突出了引用版本)。我还认为你会更快地注意到错别字,编辑会检查你是否结束了你的报价。
答案 8 :(得分:3)
我更喜欢不带引号,除非我想要一些字符串插值。然后我用双引号。我把它比作字面数字。 Perl真的允许你做以下事情:
$achoo['1'] = 'kleenex';
$achoo['14'] = 'hankies';
但没有人这样做。并且它没有帮助清晰度,仅仅因为我们添加了两个字符来输入。就像有时候我们特意想要数组中的插槽#3一样,有时我们希望PATH
输入%ENV
。就我而言,单引号添加 no 清晰度。
Perl解析代码的方式使得无法在哈希索引中使用其他类型的“裸字”。
尝试
$myhash{shift}
并且您只需要将项目存储在'shift'
密钥下的哈希中,您必须这样做
$myhash{shift()}
以指定您希望第一个参数为您的哈希编制索引。
此外,我使用jEdit, ONLY 可视化编辑器(我见过 - 除了emacs),它允许你完全控制突出显示。所以这对我来说是双重的。任何看起来像前者的东西都会获得KEYWORD3($ myhash)+ SYMBOL({)+ LITERAL2(shift)+ SYMBOL(})如果在收尾卷曲之前有一个副词,它会获得KEYWORD3 + SYMBOL + KEYWORD1 + SYMBOL(()})。另外,我也可能将其格式化为:
$myhash{ shift() }
答案 9 :(得分:2)
引号更好,因为它允许您使用裸字中不允许的特殊字符。通过使用引号,我可以在哈希键中使用我母语的特殊字符。
答案 10 :(得分:2)
您也可以在键之前加上“-
”(减号字符),但请注意,这会将“-
”附加到您键的开头 。从我的一些代码:
$args{-title} ||= "Intrig";
我也使用单引号,双引号和无引号方式。所有在同一个程序中: - )
答案 11 :(得分:1)
我自己也在想这件事,特别是当我发现自己已经犯了一些失误时:
use constant CONSTANT => 'something';
...
my %hash = ()
$hash{CONSTANT} = 'whoops!'; # Not what I intended
$hash{word-with-hyphens} = 'whoops!'; # wrong again
我现在倾向于做的是,如果至少有一个文字键需要它们,则在每个哈希的基础上普遍应用引号;并使用括号和常量:
$hash{CONSTANT()} = 'ugly, but what can you do?';
答案 12 :(得分:0)
我总是在没有引号的情况下使用它们,但我会回应使用严格和警告,因为他们挑选出大多数常见错误。