[英]How to pass a hash by reference in perl
我知道這應該可以在谷歌上輕松搜索,更不用說perl的一個微不足道的使用,但我已經嘗試了很多解決方案,我發現它們到目前為止都沒有給出預期的行為。 本質上,我正在嘗試調用子例程,從該子例程返回對哈希的引用,將對該哈希的引用傳遞給另一個子例程,然后通過類似於以下的代碼打印該哈希的內容:
#!/usr/bin/perl
my $foo = make_foo();
foreach $key (sort keys %$foo) {
print "2 $key $$foo{$key}\n";
}
print_foo(\%foo);
sub print_foo
{
my %loc = ???;
foreach $key (sort keys %loc}) {
print "3 $key $loc{$key}\n";
}
}
sub make_foo
{
my %ret;
$ret{"a"} = "apple";
foreach $key (sort keys %ret) {
print "1 $key $ret{$key}\n";
}
return \%ret;
}
可以有人告訴我這樣做的最佳方式(通過子程序)而不創建哈希的額外副本嗎? 我試過的解決方案沒有打印出以“3”開頭的任何行。
您必須將參數作為參考拉出,然后取消引用它:
sub print_foo
{
my ($loc) = @_;
foreach my $key (sort keys %$loc) {
print "3 $key $loc->{$key}\n";
}
}
無論何時進行引用,都必須明確取消引用它。 另外,請注意對引用的任何更改都將更改原始內容。 如果您想避免更改原始內容,可以將哈希值作為列表傳遞:
print_foo(%foo); # flattens the hash to a list and passes it in through @_
sub print_foo
{
my (%loc) = @_; # load the hash from the list
foreach my $key (sort keys %loc) {
print "3 $key $loc{$key}\n";
}
}
或者將哈希引用復制到新哈希中:
sub print_foo
{
my ($ref_loc) = @_; # changes to %$ref_loc will change %foo
my %loc = %$ref_loc; # COPY, changes to %loc do not change %foo
foreach my $key (sort keys %loc}) {
print "3 $key $loc{$key}\n";
}
}
其他一切都很好,所以我只專注於print_foo ......
sub print_foo
{
my %loc = %{shift @_};
foreach $key (sort keys %loc) {
print "3 $key $loc{$key}\n";
}
}
僅供參考,你需要意識到%loc現在是哈希的副本(我在這里問了一個問題解釋了這個問題: 關於在Perl中正確使用dereference的困惑 )。 為了避免復制......
sub print_foo
{
my $loc = shift @_;
foreach $key (sort keys %$loc) {
my $val = $loc->{$key}
print "3 $key $val\n";
}
}
您希望將其從引用轉換為哈希,如下所示:
my %loc = %{@_[0]};
要么
my %loc = %{shift};
您也可以將其作為參考:
my $locref = shift;
foreach $key (sort keys %$locref}) {
print "3 $key $locref->{$key}\n";
}
可以通過在命令行鍵入perldoc perlref
到此信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.