Arrays 是否可以选择从子例程返回数组或哈希?

Arrays 是否可以选择从子例程返回数组或哈希?,arrays,perl,hash,subroutine,Arrays,Perl,Hash,Subroutine,根据用户的需要,如何从子例程返回哈希或数组 基本上我想要一个子程序,当要求返回散列时,它将返回散列,但当要求返回数组时,它将返回一个包含该散列的键的数组。 例: 我知道您可以使用WANTARAY来确定是否要返回数组或标量,但我需要类似的功能来选择性地返回数组或散列。只需添加一个参数,以便在传入时返回键: sub foo { my $want_keys = shift; my %hash = (a => 1, b => 2, c => 3, ); re

根据用户的需要,如何从子例程返回哈希或数组

基本上我想要一个子程序,当要求返回散列时,它将返回散列,但当要求返回数组时,它将返回一个包含该散列的键的数组。

例:


我知道您可以使用
WANTARAY
来确定是否要返回数组或标量,但我需要类似的功能来选择性地返回数组或散列。

只需添加一个参数,以便在传入时返回键:

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();

只需添加一个参数,以便在传入时返回键:

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();

只需添加一个参数,以便在传入时返回键:

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();

只需添加一个参数,以便在传入时返回键:

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();

您的子例程可能返回数组或


您的子例程可能返回数组或


您的子例程可能返回数组或


您的子例程可能返回数组或




我认为Perl中没有“数组上下文”这样的东西:它是列表、标量或空上下文。你为什么想要这样一个功能?也许你会对这个模块感兴趣。只要总是返回\%hash,让调用者做
my@array=keys%{foo()}
或者
my%hash=%{foo()}
(或者更好的是,
my$hasherf=foo()
),就像@raina77ow所说的那样,wantarray的名字是错误的;它只告诉你有列表上下文顺便问一下,是否有人只是随机地对Perl问题进行投票?当我发布这个问题时,'-1'被打了一巴掌。。。我怀疑是谁做的,甚至没有时间阅读它。我认为Perl中没有“数组上下文”这样的东西:它是列表、标量或空上下文。你为什么想要这样一个功能?也许你会对这个模块感兴趣。只要总是返回\%hash,让调用者做
my@array=keys%{foo()}
或者
my%hash=%{foo()}
(或者更好的是,
my$hasherf=foo()
),就像@raina77ow所说的那样,wantarray的名字是错误的;它只告诉你有列表上下文顺便问一下,是否有人只是随机地对Perl问题进行投票?当我发布这个问题时,'-1'被打了一巴掌。。。我怀疑是谁做的,甚至没有时间阅读它。我认为Perl中没有“数组上下文”这样的东西:它是列表、标量或空上下文。你为什么想要这样一个功能?也许你会对这个模块感兴趣。只要总是返回\%hash,让调用者做
my@array=keys%{foo()}
或者
my%hash=%{foo()}
(或者更好的是,
my$hasherf=foo()
),就像@raina77ow所说的那样,wantarray的名字是错误的;它只告诉你有列表上下文顺便问一下,是否有人只是随机地对Perl问题进行投票?当我发布这个问题时,'-1'被打了一巴掌。。。我怀疑是谁做的,甚至没有时间阅读它。我认为Perl中没有“数组上下文”这样的东西:它是列表、标量或空上下文。你为什么想要这样一个功能?也许你会对这个模块感兴趣。只要总是返回\%hash,让调用者做
my@array=keys%{foo()}
或者
my%hash=%{foo()}
(或者更好的是,
my$hasherf=foo()
),就像@raina77ow所说的那样,wantarray的名字是错误的;它只告诉你有列表上下文顺便问一下,是否有人只是随机地对Perl问题进行投票?当我发布这个问题时,'-1'被打了一巴掌。。。我怀疑是谁做的,甚至没有时间读它。这是一个有效的解决办法,但也是我试图避免的事情。我希望无论您想要散列还是数组,都能调用相同的函数,并相应地调整输出。我明白我所问的可能不可能,但我想在完全放弃之前我会问。我已经用我能想到的唯一其他方法更新了我的答案(如果
wantarray
,则返回哈希,否则返回带键的aref)有趣,这与安德烈的回答正好相反:)这两个似乎都是最好的选择。我选择了他的,因为使用wantarray返回数组在逻辑上比返回散列更有意义,但我给了你的答案a+1,因为它同样有效。我在更新我的答案后发现:)看起来你想默认返回散列,这就是我这样做的原因。请记住,正如其他人所说,
wantarray
的名称不太恰当。hash和数组都应该是
wantlist
。我同意,但由于名称选择不当,如果
wantarray
返回一个数组:),则对用户更有意义。这是一个有效的解决方案,但也是我试图避免的。我希望无论您想要散列还是数组,都能调用相同的函数,并相应地调整输出。我明白我所问的可能不可能,但我想在完全放弃之前我会问。我已经用我能想到的唯一其他方法更新了我的答案(如果
wantarray
,则返回哈希,否则返回aref w