如何取消引用传递给子例程的Perl哈希引用?

7

我仍在努力梳理我的哈希解引用。 我当前的问题是现在将哈希引用传递给子例程,并且我想在该子例程中对其进行解引用。 但是,我没有找到正确的方法/语法来完成它。 在子例程中,我想迭代哈希键,但是哈希引用的语法与哈希不同,而我知道如何处理哈希。

所以我想做的是:

sub foo {
    %parms = @_;
    foreach $keys (key %parms) { # do something };
}

但是使用哈希引用(hashref)代替哈希表进行传递。

5个回答

3

我目前还没有测试过这段代码,但是根据手写的内容,您需要像这样做:

sub foo {
    $parms = shift;
    foreach my $key (keys %$parms) { # do something };
}

使用 shift 而不是 @_ 就解决了问题,当然,变量使用标量而不是哈希。工作代码:sub foo { $parms = shift; foreach $key (keys %$parms) { print "$key : $$parms{$key}\n"; } }谢谢! - sgsax
2
shift@_ 的区别不重要。使用my ($hashref) = @_;同样有效。 - nobody
@nobody 是的,谢谢,在这个上下文中是这样,但通常情况下 shift@ 之间确实存在显著差异。没有括号的 @ my $hashref = @_; 将返回一个标量(=传递的参数数目)或最终用作此参数传递的整个数组。只有在您的“解构”赋值方式 my ($hashref) = @_; 中才能起到相同的作用。 - FantomX1

2

以下是一种解引用传递给子例程的哈希引用的方法:

use warnings;
use strict;

my %pars = (a=>1, b=>2);
foo(\%pars);
sub foo {
    my ($href) = @_;
    foreach my $keys (keys %{$href}) { print "$keys\n" }
}

__END__
a
b

参考资料还包括参考快速指南perlreftut


2

sub foo
{
    my $params = $_[0];
    my %hash = %$params;
        foreach $keys (keys %hash)
        {
         print $keys;
        }
}

my $hash_ref = {name => 'Becky', age => 23};

foo($hash_ref);

这里有一个有关引用的良好简介,在这里


谢谢提供链接。我一直把它作为参考,但我还没有完全掌握它。 - sgsax

1
#!/usr/bin/perl
use strict;

my %params = (
    date => '2010-02-17',
    time => '1610',
);

foo(\%params);

sub foo {
    my ($params) = @_;
    foreach my $key (keys %$params) {
        # Do something
        print "KEY: $key VALUE: $params{$key}\n";
    };
}

哎呀,刚才没看到toolics的回复。;x - chris d
我认为他的命名更好(将哈希引用命名为href)。 - chris d

0
解除原始引用,但将其作为另一个引用或其副本使用,这也非常常见或更常见。
sub foo {
    my ($parmsHashRef , $parmsArrRef) = @_;

    # for hashes,   \%$parmsHashRef - would not work (seems would be a "reference" on another reference already)
    my $newDetachedHashRef = {%$parmsHashRef} # or just = {$parmsHashRef}
    # for arrays ,  \@$parmsArrRef - would not work
    my $newDetachedArrRef = [@$parmsArrRef] # or just = [$parmsArrRef]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接