是的,但...
perl中的引用是標量。你試圖實現的是別名返回值。這實際上是可能的,但你應該而不是這樣做,因爲它涉及符號表的混亂。此外,這種只爲全局作品(聲明與我們的):如果您分配一個hashref的水珠*hash
將分配給符號表項%hash
:
#!/usr/bin/env perl
use warnings;
use strict;
sub a_hashref{{a => "one", b => "two"}}
our %hash;
*hash = a_hashref;
printf "%3s -> %s\n",$_,$hash{$_} foreach keys %hash;
這是不好的風格!它不在PBP中(直接,但請考慮第5.1節:「避免非詞彙表」),並且不會被perlcritic
報告,但是您不應該污染軟件包名稱空間以獲得一些語法幻想。此外,它不適用於詞法變量(這是你可能想要使用的大部分時間,因爲它們是詞彙範圍的,而不是包寬的)。另一個問題是,如果$h->hashref
方法更改其返回類型,您將突然分配給另一個表條目! (因此,如果$h->hashref
將其返回類型更改爲arrayref,則將其分配給@hash,祝您好運)。你可以通過檢查$h->hashref
是否確實返回一個帶有'HASH' eq ref
$ h-> hashref`的hashref來避開這種情況,但這樣會破壞目的。
只是保持參考的問題是什麼?如果你得到一個參考,爲什麼不把它存儲在一個標量?
$哈希= $ H-> hashref
要了解更多有關全局符號表看看perlmod並考慮perlref爲*FOO{THING}
語法,這可悲的不是左值。
爲了實現你想要的,你可以看看幾個別名modules on cpan。 Data::Alias或Lexical::Alias似乎適合您的目的。另外,如果您對tie
語義感興趣並且/或者不想使用XS
模塊,則Tie::Alias可能值得拍攝。
不幸的是我不知道PHP中的引用如何表現,所以我不確定。 – insaner 2014-10-26 16:08:26
'$ h-> hashref'是一個返回散列引用的對象中的函數。具體來說,它是dbi函數'$ sth-> fetchrow_hashref',但我不想讓人們誤以爲這個問題是關於dbi的。 – insaner 2014-10-26 16:12:30
這將取消引用hashref(並將值複製到%hash),所以它與我想要的相反。 – insaner 2014-10-26 16:15:43