我目前正在学习 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)
您不能将数组(或哈希)传递给 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)
不要使用特殊变量$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)
| 归档时间: |
|
| 查看次数: |
275 次 |
| 最近记录: |