Domanda

Voglio restituire diversi valori da una subroutine perl e assegnarli alla rinfusa.

Funziona oltre, ma non quando uno dei valori è 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 sembra concatenare i valori, ignorando gli elementi Undef.L'incarico di distruttura come in Python o Ocaml è ciò che mi aspetto.

C'è un modo semplice per assegnare un valore di ritorno a diverse variabili?

Modifica: qui è il modo in cui ora uso per passare i dati strutturati in giro.L'array @a deve essere trasmesso per riferimento, come suggerito 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]);
.

È stato utile?

Soluzione

Non sei sicuro di cosa intendi per concatenazione qui:

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

Stampe

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

while:

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

Stampe:

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

La sola differenza è che $ OtherVal è ora undef invece di "ZAP".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top