【问题标题】:Passing array, scalar and hash to subroutine in Perl将数组、标量和散列传递给 Perl 中的子例程
【发布时间】:2013-08-12 22:03:40
【问题描述】:

将多个数组、变量、散列发送到子例程的最佳方式是什么?

简单的形式,有效。

my $msg = &getMsg(1,2,3);
print $msg;

sub getMsg {
    my($a, $b, $c) = @_;
}

我在使用这个版本时遇到了困难,我不确定如何在不使用全局变量的情况下安全地将数据发送到子例程,这不是我想做的。

my @array = ('a','b','c');
my $str = "Hello";
my %hash = (
    'a' => ['100','nuts'],
    'b' => ['200','bolts'],
    'c' => ['300','screws'],
);

my $msg = getMsg(@array, $str, %hash);
print $msg;

sub getMsg {
    my (@a, $s, %h) = @_;
    my $MSG;
    foreach my $x (@a) {
        $MSG .= "\n$str, $x your hash value = $h{$x}[0] $h{$x}[1]";
    }
    return $MSG
}

【问题讨论】:

    标签: arrays perl hashmap


    【解决方案1】:

    您可以使用参考:

    getMsg(\@array, \%hash, $scalar);
    
    sub getMsg {
        my ($aref, $href, $foo) = @_;
        for my $elem (@$aref) {
            ...
        }
    }
    

    请注意您尝试的作业:

    my (@a, $s, %h) = @_;
    

    不起作用,因为 @a -- 作为一个数组 -- 会占用整个列表,而使 $s%h 未初始化。

    【讨论】:

    • 注意传递的hashref在子$MSG.= "\n$str, $x your hash value = $h->{$x}->[0] $h->{$x}->[1]"; 中使用时需要解引用
    【解决方案2】:

    我更喜欢 TLP 的回答,但你也可以使用原型:

    getMsg(@array, %hash, $scalar);
    
    sub getMsg (\@\%$) {
        my ($aref, $href, $foo) = @_;
        for my $elem (@$aref) {
            ...
        }
    }
    

    原型(\@\%$) 将子例程调用的参数强制为列表引用、哈希引用和标量参数被展平并加载到@_ 之前。在子例程中,您会收到一个列表引用和一个哈希引用,而不是一个数组和一个哈希。

    不过,通常don't use prototypes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-30
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 2021-03-09
      • 2013-12-24
      • 1970-01-01
      • 2016-09-07
      相关资源
      最近更新 更多