我有一个可能会或可能不会看起来像的数组,[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,它只是打印一个数字.
我究竟做错了什么?
你已经错过了对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)