在Perl中使用哈希时引用键是一个好主意吗?
我正在研究一个非常大的遗留Perl代码库,并试图采用Damian Conway在Perl最佳实践中提出的许多最佳实践.我知道最佳实践对于程序员来说总是一个敏感的话题,但希望我能在没有开始火焰战争的情况下得到一些好的答案.我也知道这可能是很多人不会争论的原因,因为它是一个小问题,但我正试图在我通过这个代码库工作时得到一个可靠的指南列表.
在Damian Conway的Perl Best Practices一书中,有一个例子展示了对齐如何帮助一段代码的易读性,但它没有提及(我可以找到书中的任何地方)引用哈希键的任何内容.
$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';
ForYourOwnGo.. 34
没有报价更好.它在{}所以很明显你没有使用裸字,而且它更容易阅读和输入(少两个符号).但当然,所有这些都取决于程序员.
没有报价更好.它在{}所以很明显你没有使用裸字,而且它更容易阅读和输入(少两个符号).但当然,所有这些都取决于程序员.
指定常量字符串散列键时,应始终使用(单个)引号.例如, $hash{'key'}
这是最好的选择,因为它不需要考虑这个问题并导致格式一致.如果您有时不使用引号,则必须记住在键包含内部超量,空格或其他特殊字符时添加它们.在这些情况下,您必须使用引号,导致格式不一致(有时不引用,有时引用).引号键也更可能由编辑器突出显示语法.
这里有一个例子,使用"有时引用,而不引用其他时间"约定会让你陷入困境:
$settings{unlink-devices} = 1; # I saved two characters!
那将在下面编译得很好use strict
,但是在运行时不会完全按照你的期望进行.哈希键是字符串.字符串应根据其内容引用:单引号用于文字字符串,双引号用于允许变量插值.引用你的哈希键.这是最安全的约定,也是最简单的理解和遵循.
我从来没有单引号哈希键.我知道{}基本上像引号一样工作,除非在特殊情况下(a +和双引号).我的编辑也知道这一点,并给了我一些基于颜色的线索,以确保我按照我的意图行事.
在任何地方使用单引号在我看来就像是一个不懂Perl的人所做的"防御性"练习.节省一些键盘磨损并学习Perl :)
随着咆哮,我发布此评论的真正原因......其他评论似乎错过了+
将"取消引用"裸字的事实.这意味着你可以写:
sub foo { $hash{+shift} = 42; }
要么:
use constant foo => 'OH HAI'; $hash{+foo} = 'I AM A LOLCAT';
所以很明显,这+shift
意味着"调用shift函数"并shift
意味着"字符串'移位'".
我还要指出,cperl-mode正确地突出了所有各种情况.如果没有,请在IRC上ping我,我会解决它:)
(哦,还有一件事.我在Moose中引用属性名称,就像在has 'foo' => ...
.这是我从使用stevan时习惯的习惯,虽然我觉得它看起来不错......但它与其余部分有点不一致我的代码.也许我会很快停止这样做.)
无引号哈希键接受了Larry Wall的语法级注意,以确保它们没有理由不是最佳实践.不要出汗.
(顺便提一下,数组键上的引号是 PHP的最佳实践,如果不能使用它们会有严重后果,更不用说大量的E_WARNING了.好的Perl!=在PHP中没问题.)
我不认为这是最好的做法.我个人在哈希键中使用它们,如下所示:
$ident{'name'} = standardize_name($name);
但不要在箭头操作符的左侧使用它们:
$ident = {name => standardize_name($name)};
不要问我为什么,这就是我这样做的方式:)
我认为你能做的最重要的事情就是永远,永远,永远:
use strict; use warnings;
这样,编译器将为您捕获任何语义错误,使您不太可能错误地输入内容,无论您决定采用哪种方式.
第二个最重要的是要保持一致.
我没有引号,只是因为打字和阅读并不用担心.我有一个不会被自动引用的键的时间很少而且很远,以至于不值得所有额外的工作和杂乱.也许我选择的哈希键已经改变以适合我的风格,这也是一样的.完全避免边缘情况.
这与我"
默认使用的原因相同.对于我来说,在字符串中间放置一个变量比使用我不想插入的字符更常见.也就是说,我经常写的'Hello, my name is $name'
比"You owe me $1000"
.