代码之家  ›  专栏  ›  技术社区  ›  Tobu

在Perl中分配多个值,Undef有问题

  •  2
  • Tobu  · 技术社区  · 14 年前

    我想从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();
    

    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]);
    
    1 回复  |  直到 14 年前
        1
  •  7
  •   MkV    14 年前

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

    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”。

    推荐文章