将数组传递给 Perl 子例程

Dan*_*ana 2 arrays perl

我目前正在学习 Perl,我想将一个数组传递给子例程并打印其内容。我发现应该传递对数组的引用,但是我遗漏了一些东西:

arrayPrint($a,$b,\@array);

sub arrayPrint{
    my ($a,$b,@array) = @_;

    for(my $i=0; $i<=$#array;$i++){
        print $file $a.$b.$array[i]."\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

ike*_*ami 8

您不能将数组(或哈希)传递给 subs。您只能将标量传递给 subs。(它们只能返回标量。)

我们能做的就是传递对数组(或哈希)的引用。引用是标量。事实上,这就是你正在做的事情。

问题是您将其分配给一个数组。始终包含一个标量的数组只会让事情变得更加复杂。它应该分配给一个标量。并且应该将其作为参考

sub arrayPrint {
   my ( $x, $y, $array ) = @_;

   for my $e ( @$array ) {
      say $fh "$x$y$e";
   }
}

arrayPrint( $x, $y, \@array );
Run Code Online (Sandbox Code Playgroud)

另一种方法是将数组的每个元素传递给子元素。

sub arrayPrint {
   my ( $x, $y, @array ) = @_;

   for my $e ( @array ) {
      say $fh "$x$y$e";
   }
}

arrayPrint( $x, $y, @array );
Run Code Online (Sandbox Code Playgroud)

或者

sub arrayPrint {
   my $x = shift;
   my $y = shift;

   for my $e ( @_ ) {
      say $fh "$x$y$e";
   }
}

arrayPrint( $x, $y, @array );
Run Code Online (Sandbox Code Playgroud)


cho*_*oba 5

不要使用特殊变量$a$b词法,它可能会破坏sort.

您的代码正在向子例程发送数组引用,但用它填充数组。子例程内的@array 将有一个元素:数组引用。

您可以直接发送数组,这实际上会将其所有成员作为单独的参数发送(如果数组很大,则非常糟糕)。

或者,发送引用,但用它填充标量。但是,您不能$#直接使用引用,您需要取消引用它。

my ($x, $y, $array_ref) = @_;
for my $i (0 .. $#{$array_ref}) {
Run Code Online (Sandbox Code Playgroud)

不过,更常见的是迭代元素而不是索引。

for my $e (@$array_ref) {
Run Code Online (Sandbox Code Playgroud)