在perl中分配多个值,使用undef时出现问题

Tob*_*obu 2 perl undef

我想从perl子例程返回几个值并批量分配它们.

这在某些时候有效,但是当其中一个值为undef:

sub return_many {
    my $val = 'hmm';
    my $otherval = 'zap';
    #$otherval = undef;
    my @arr = ( 'a1', 'a2' );
    return ( $val, $otherval, @arr );
}

my ($val, $otherval, @arr) = return_many();
Run Code Online (Sandbox Code Playgroud)

Perl似乎连接了这些值,忽略了undef元素.像Python或OCaml这样的解构赋值是我所期待的.

有一种简单的方法可以为多个变量分配返回值吗?

编辑:这是我现在用来传递结构化数据的方式.正如MkV建议的那样,@ a数组需要通过引用传递.

use warnings;
use strict;

use Data::Dumper;

sub ret_hash {
        my @a = (1, 2);
        return (
                's' => 5,
                'a' => \@a,
        );
}

my %h = ret_hash();
my ($s, $a_ref) = @h{'s', 'a'};
my @a = @$a_ref;

print STDERR Dumper([$s, \@a]);
Run Code Online (Sandbox Code Playgroud)

MkV*_*MkV 7

不确定你在这里串联是什么意思:

use Data::Dumper;
sub return_many {
    my $val = 'hmm';
    my $otherval = 'zap';
    #$otherval = undef;
    my @arr = ( 'a1', 'a2' );
    return ( $val, $otherval, @arr );
}

my ($val, $otherval, @arr) = return_many();
print Dumper([$val, $otherval, \@arr]);
Run Code Online (Sandbox Code Playgroud)

版画

$VAR1 = [
          'hmm',
          'zap',
          [
            'a1',
            'a2'
          ]
        ];
Run Code Online (Sandbox Code Playgroud)

而:

use Data::Dumper;
sub return_many {
    my $val = 'hmm';
    my $otherval = 'zap';
    $otherval = undef;
    my @arr = ( 'a1', 'a2' );
    return ( $val, $otherval, @arr );
}

my ($val, $otherval, @arr) = return_many();
print Dumper([$val, $otherval, \@arr]);
Run Code Online (Sandbox Code Playgroud)

打印:

$VAR1 = [
          'hmm',
          undef,
          [
            'a1',
            'a2'
          ]
        ];
Run Code Online (Sandbox Code Playgroud)

唯一的区别是$ otherval现在是undef而不是'zap'.