我會從這裏the other question複製我的答案的相關部分。
經常忽略的第二個考慮因素是接口。如何使用返回的數組?這很重要,因爲整個數組解引用在Perl中有點糟糕。例如:
for my $info (@{ getInfo($some, $args) }) {
...
}
這很醜。這好多了。
for my $info (getInfo($some, $args)) {
...
}
它也適用於映射和grepping。
my @info = grep { ... } getInfo($some, $args);
但是,如果你要挑出單個元素返回一個數組引用都可以得心應手:
my $address = getInfo($some, $args)->[2];
這比簡單:
my $address = (getInfo($some, $args))[2];
或者:
my @info = getInfo($some, $args);
my $address = $info[2];
但是在那個時候,你笑uld質疑@info是否真的是一個列表或一個散列。
my $address = getInfo($some, $args)->{address};
與數組vs數組引用不同,沒有必要選擇通過散列引用返回散列。像上面的代碼一樣,哈希引用允許方便的簡寫。與數組vs對照相比,它使得迭代器的情況更簡單,或者至少避免了中間變量。
for my $key (keys %{some_func_that_returns_a_hash_ref}) {
...
}
你不應該做的是有getInfo()
返回標量上下文中的數組引用,並在列表環境的數組。這混淆了數組長度的標量上下文的傳統用法,這會讓用戶感到驚訝。
我想補充一點,儘管一切都做得很好,X是一個很好的經驗法則,但在設計一個好的界面時它並不是最重要的。有點過頭了,你可以很容易地滾動其他更重要的問題。
最後,我會插入我自己的模塊,Method::Signatures,因爲它提供了一個妥協方法來傳遞數組引用,而不必使用數組ref參數。
use Method::Signatures;
method foo(\@args) {
print "@args"; # @args is not a copy
push @args, 42; # this alters the caller array
}
my @nums = (1,2,3);
Class->foo(\@nums); # prints 1 2 3
print "@nums"; # prints 1 2 3 42
這是通過Data::Alias的魔法完成的。
在「我的($結果)= [];」,爲什麼parens? – ysth 2009-02-15 18:28:00
同樣,爲了一致性的緣故,我總是做 my($ foo); my($ bar,$ baz); 我從來沒有做'我的$ foo',因爲那麼我的一些「我的」是在標量環境中,有些在列表環境中。因此,我有時會做 my($ cnt)= scalar(@array); 我肯定會驅使一些人發瘋.... – 2009-02-16 18:14:56