移动到单独的函数时,Perl行不起作用

Pyr*_*tie 1 perl

我有一个可能会或可能不会看起来像的数组,[0, 1]我想测试它.

此代码(在方法内)有效:

sub some_other_method {
    my $self = shift;
    ...
    if (scalar @myArray == 2 && @myArray[0] == 0 && @myArray[1] == 1) {
        # this will successfully catch arrays that look like [0, 1]
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我将内容移动if到一个单独的方法,然后调用它,它不起作用.

sub is_warning {
    my $self = shift;
    my @array = shift;
    return scalar @array == 2 && @array[0] == 0 && @array[1] == 1;
}

...

sub some_other_method {
    my $self = shift;
    ...
    if ($self->is_warning(@myArray)) {
        # this will not catch arrays that look like [0, 1]
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我添加一个print @array;is_warning,它只是打印一个数字.

我究竟做错了什么?

Sob*_*que 5

你已经错过了对Perl语言的关键的东西-一个子程序只能不断传递标值的列表@_.因此,要传递数组,您需要使用子程序stuff及其other下的一种技术.

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

sub stuff {
   my ( $arg, @other_args ) = @_;
   print Dumper \@other_args;
   print "$_\n" for @other_args;
}

sub other {
   my ( $arg, $array_ref ) = @_;
   print Dumper $array_ref;
   print "$_\n" for @$array_ref;
}

my $param = "fish";
my @array = ( "wiggle", "wobble", "boo" );

stuff( $param, @array );
other( $param, \@array );
Run Code Online (Sandbox Code Playgroud)

stuff子例程中递送一个值列表来处理它将要做的事情.在other,它给了两个值- $param参考@array.

你只是处理1你的情况的原因是,这shift只是拉一个值@_.所以任何额外的争论都会落后.你将能够看到这个;

print Dumper \@_;
Run Code Online (Sandbox Code Playgroud)