【问题标题】:Optionally return either an array or a hash from a subroutine?可选择从子例程返回数组或哈希?
【发布时间】:2015-11-04 02:27:33
【问题描述】:

如何根据用户的需要从子例程返回散列或数组?

基本上我想要一个子例程,当被要求返回哈希时,它将返回一个哈希,但当被要求返回一个数组时,它将返回一个包含该哈希键的数组。

例如:

my %hash = foo();

my @array = foo();  # @array contains "keys %hash"

# pseudo code
sub foo {

     # Define a hash
     my %hash = (
         'key1' => 'val1',
         'key2' => 'val2',
         'key3' => 'val3',
     );

     # I know this is not valid Perl code, but it represents what I want.
     return keys %hash if wantarray;
     return %hash      if wanthash;
}

我知道您可以使用wantarray 来确定是要返回数组还是标量,但我需要一个类似的功能来选择性地返回数组或哈希。

【问题讨论】:

  • 我认为 Perl 中没有“数组上下文”之类的东西:它是 list、标量或空上下文。为什么需要这样的功能?
  • 不过,您可能会对 Want 模块感兴趣。
  • 始终返回 \%hash 并让调用者执行my @array = keys %{ foo() }my %hash = %{ foo() }(或者更好的是,只需my $hasherf = foo()
  • 正如@raina77ow 所说,wantarray 名称错误;它只告诉你有列表上下文
  • 顺便问一下,有没有人只是随意地四处对 Perl 问题投反对票?在我发布这个问题的那一刻,那个'-1'就被打了......我怀疑做它的人甚至有时间阅读它。

标签: arrays perl hash subroutine


【解决方案1】:

您的子程序可能返回数组或reference to hash

my @array = foo();  # @array contains "keys %hash"
my $hash_reference = foo();

print $array[0],"\n"; # keys returned by foo are in random order
print $hash_reference->{key1},"\n";


# sample code
sub foo {

     # Define a hash
     my %hash = (
         'key1' => 'val1',
         'key2' => 'val2',
         'key3' => 'val3',
     );

     if( wantarray) {
         return keys %hash;
     }else{
         return \%hash
     }
}

【讨论】:

    【解决方案2】:

    只需添加一个参数,这样如果传入,它就会返回键:

    sub foo {
        my $want_keys = shift;
    
        my %hash = (a => 1, b => 2, c => 3, );
    
        return keys %hash if $want_keys;
    
        return %hash;
    }
    
    my %hash = foo();
    
    my @keys = foo(1); # or foo('keys');
    

    唯一的另一种方法是,如果需要列表,则返回哈希,否则返回键的数组引用,这意味着调用者之后必须取消引用:

    sub foo {
        my %hash = (a=>1, b=>2);
        return %hash if wantarray;
        return [keys %hash];
    }
    
    my $keys = foo();
    my %hash = foo();
    

    【讨论】:

    • 这是一个有效的解决方案,但也是我试图避免的。无论您想要哈希还是数组,我都希望函数被调用相同,并相应地调整输出。我知道我要问的可能是不可能的,但我想在完全放弃之前我会问。
    • 我已经用我能想到的唯一其他方法更新了我的答案(如果wantarray,则返回哈希,否则返回带有键的 aref)
    • 有趣的是,这与 Andrzej 的回答完全相反 :) 这两个似乎都是最好的选择。我之所以选择他,是因为使用 wantarray 返回数组在逻辑上比返回哈希更有意义,但我给了你的答案 +1,因为它也同样有效。
    • 我在更新我的答案后就看到了 :) 看起来你想默认返回一个哈希,这就是我这样做的原因。请记住,正如其他人所说,wantarray 的名称不是很贴切。它应该是wantlist,它是一个哈希和一个数组。
    • 我同意,但是由于它不幸的名称选择,如果wantarray 返回一个数组,对用户来说更有意义:)
    猜你喜欢
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多