2

perl サブルーチンからいくつかの値を返し、それらをまとめて割り当てたいと考えています。

これは時々機能しますが、値の1つが次の場合は機能しません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();

Perl は undef 要素を無視して、値を連結しているようです。Python や OCaml のような代入の構造化は、私が期待しているものです。

複数の変数に戻り値を割り当てる簡単な方法はありますか?

編集:構造化データを渡すために私が現在使用している方法は次のとおりです。@a 配列は、MkV が提案したように、参照渡しする必要があります。

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]);
4

1 に答える 1

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

版画

$VAR1 = [
          'hmm',
          'zap',
          [
            'a1',
            'a2'
          ]
        ];

その間:

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

プリント:

$VAR1 = [
          'hmm',
          undef,
          [
            'a1',
            'a2'
          ]
        ];

唯一の違いは、$otherval が「zap」ではなく undef になったことです。

于 2010-07-17T13:58:58.677 に答える