这是一个好的想法引键时使用的散列在Perl?

我工作上的一个极大的遗产Perl代码的基础,并试图采用一个很大的最佳做法的建议达米安在康威 Perl最佳做法.我知道,最好的做法 总是 一个敏感的问题与程序,但我希望我可以得到一些很好的答案在这一个没有起火的战争。我也知道这可能是很多人不会说过,由于它是一个小问题,但我试图获得一个坚实的名单要遵循的准则,因为我的工作我的方式通过这个代码。

Perl最佳做法的书,由达米安*康威, 有的是这个实例,它展示了如何对准有助于清晰度的一部分代码,但它并没有提到(在任何地方的书,我可以找到)任何关于引用的散列键。

$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';
有帮助吗?

解决方案

指定常量字符串哈希键时,应始终使用(单个)引号。例如, $ hash {'key'} 这是最好的选择,因为它不需要考虑这个问题并导致格式一致。如果您有时不使用引号,则必须记住在键包含内部超量,空格或其他特殊字符时添加它们。在这些情况下,必须使用引号,导致格式不一致(有时不引用,有时引用)。引号键也更可能由编辑器突出显示语法。

以下是使用“有时引用,而不引用其他时间”的示例。惯例会让你陷入困境:

$settings{unlink-devices} = 1; # I saved two characters!

use strict 下编译就好了,但是在运行时不会完全按照你的意愿行事。哈希键是字符串。字符串应根据其内容引用:单引号用于文字字符串,双引号用于允许变量插值。引用你的哈希键。这是最安全的惯例,最容易理解和遵循。

其他提示

没有引号更好。它在{}所以很明显你没有使用裸字,而且它更容易阅读和输入(少两个符号)。但当然,所有这些都取决于程序员。

我从来没有单一的报价哈希键。我知道{}基本上就像行情这样做,除非在特殊情况下(a+和双引号).我的编辑知道这也给了我一些颜色的基线索,以确保我做了什么,我的意图。

使用单一的报价无处不在乎我喜欢的"防御"的做法实施的人不知道Perl。拯救一些的键盘的磨损和学习Perl:)

与夸夸其谈的方式,真正的原因,我发布这一评论...其他的评论似乎忽视了这样的事实, + 将"引文"一bareword.这意味着你可以写:

sub foo {
    $hash{+shift} = 42;
}

或者:

use constant foo => 'OH HAI';
$hash{+foo} = 'I AM A LOLCAT';

所以很明显 +shift 手段"呼吁移功能"和 shift 意思是"string'转变'".

我还将指出,cperl模突出了所有各种情况下正确。如果没有,平我在因诺琴蒂研究中心,我会解决它:)

(哦,一个多的事情。我引述属性名穆斯,因为在 has 'foo' => ....这是一种习惯我从工作与斯蒂文,并且尽管我认为它看起来不错的...这是一个有点不一致,与我的代码。也许我会停止这样做。)

无引号哈希键从Larry Wall获得语法级别的关注,以确保它们没有理由不是最佳实践。不要出汗。

(顺便提一下,数组键的引用是在PHP中的最佳实践,如果不能使用它们会有严重的后果,更不用说大量的E_WARNING了。好的Perl!=在PHP中没问题。)

我认为这方面没有最好的做法。我个人在哈希键中使用它们如下:

$ident{'name'} = standardize_name($name);

但不要在箭头操作符的左侧使用它们:

$ident = {name => standardize_name($name)};

不要问我为什么,这只是我这样做的方式:)

我认为你能做的最重要的事情就是永远,永远,永远:

use strict;
use warnings; 

这样编译器会为你捕获任何语义错误,让你不太可能输入错误的内容,无论你决定采用哪种方式。

第二个最重要的是要保持一致。

我没有引号,只是因为输入和阅读并不用担心。我有一个不会被自动引用的键的时间很少而且很远,所以不值得所有额外的工作和杂乱。也许我选择的哈希键已经改变以适合我的风格,这也是一样的。完全避免边缘情况。

这与我默认使用" 的原因相同。对于我来说,在字符串中间放置一个变量比使用我不想插入的字符更常见。也就是说,我经常写'你好,我的名字是$ name'而不是“你欠我1000美元”

至少,引用防止语法突出显示不太完美的编辑器中的保留字。退房:

$i{keys} = $a;
$i{values} = [1,2];
...

我更喜欢不带引号,除非我想要一些字符串插值。然后我用双引号。我把它比作字面数字。 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() }

加上引号!他们在视觉上打破了语法,更多编辑将在语法高亮中支持它们(嘿,甚至Stack Overflow都突出了引用版本)。我还认为你会更快地注意到错别字,编辑会检查你是否结束了你的报价。

引号更好,因为它允许您使用裸字中不允许的特殊字符。通过使用引号,我可以在哈希键中使用我母语的特殊字符。

您可以在密钥前加上“ - ”; (减去字符),但请注意,这会附加“ - ”到你的密钥的开始。从我的一些代码:

$args{-title} ||= "Intrig";

我也使用单引号,双引号和无引号方式。所有在同一个程序中: - )

我自己也在想这件事,特别是当我发现自己已经犯了一些失误时:

 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?';

我总是在没有引号的情况下使用它们,但我会回应使用严格和警告,因为他们挑选出大多数常见错误。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top