Arrays 如何在Perl中使用子例程修改数组元素

Arrays 如何在Perl中使用子例程修改数组元素,arrays,perl,reference,subroutine,Arrays,Perl,Reference,Subroutine,我试图修改传递给子例程的数组 我将数组引用传递给子例程并分配新的值,但它不会反映在调用方 下面是我的程序 sub receiveArray { my $arrayref = @_; @{$arrayref} = ( 4, 5, 6 ); } @ar = ( 1, 2, 3 ); print "Values of the function before calling the function\n"; foreach my $var ( @ar ) { print $

我试图修改传递给子例程的数组

我将数组引用传递给子例程并分配新的值,但它不会反映在调用方

下面是我的程序

sub receiveArray {
    my $arrayref = @_;
    @{$arrayref} = ( 4, 5, 6 );
}

@ar = ( 1, 2, 3 );

print "Values of the function before calling the function\n";

foreach my $var ( @ar ) {
    print $var;
    print "\n";
}

receiveArray(\@ar);

print "Values of the function after calling the function\n";

foreach my $var ( @ar ) {
    print $var;
    print "\n";
}

上面代码中的问题是什么?

您应该开始使用
使用strict编写每个Perl文件;使用警告。这将帮助您避免这样的错误

问题出在这一行:

    my $arrayref = @_;
将数组分配给标量,因此在标量上下文中计算数组,从而生成数组中的元素数

你应该做的是:

    my ($arrayref) = @_;
现在它使用列表赋值,将第一个函数参数放入
$arrayref
(忽略其余的,如果有的话)


列表分配记录在中(以“列表可能被分配给…”开头的部分)。

您应该开始使用
编写的每个Perl文件,并严格使用;使用警告。这将帮助您避免这样的错误

问题出在这一行:

    my $arrayref = @_;
将数组分配给标量,因此在标量上下文中计算数组,从而生成数组中的元素数

你应该做的是:

    my ($arrayref) = @_;
现在它使用列表赋值,将第一个函数参数放入
$arrayref
(忽略其余的,如果有的话)


列表分配记录在中(以“列表可能分配给…”开头的部分)。

非常感谢您的帮助。成功了。但我仍然无法理解我的$arrayref=@@和我的($arrayref)=@@之间的区别。你能告诉我区别吗?谢谢,我告诉过你区别。你能解释一下哪个部分不清楚吗?@Sunil:用括号将数组
@
中的列表赋值给列表
($arrayref)
中的变量,因此赋值在列表上下文中进行。(注意:不是“数组上下文”。从技术上讲,这是不存在的。数组只是一个包含列表的变量。)没有括号,您将数组
@
分配给标量
$arrayref
,因此它是在标量上下文中完成的,您可以得到数组中的项数,而不是它的内容。正确,
my$arrayref=$\u0];
也可以工作,但是如果您想添加/删除/重新排列参数,以后就很难扩展,因为您必须自己跟踪数组索引。@Sunil,您也可以执行
my$arrayref=shift
shift
获取标量上下文中的第一个参数元素,并将其放入
$arrayref
中。非常感谢您的帮助。成功了。但我仍然无法理解我的$arrayref=@@和我的($arrayref)=@@之间的区别。你能告诉我区别吗?谢谢,我告诉过你区别。你能解释一下哪个部分不清楚吗?@Sunil:用括号将数组
@
中的列表赋值给列表
($arrayref)
中的变量,因此赋值在列表上下文中进行。(注意:不是“数组上下文”。从技术上讲,这是不存在的。数组只是一个包含列表的变量。)没有括号,您将数组
@
分配给标量
$arrayref
,因此它是在标量上下文中完成的,您可以得到数组中的项数,而不是它的内容。正确,
my$arrayref=$\u0];
也可以工作,但是如果您想添加/删除/重新排列参数,以后就很难扩展,因为您必须自己跟踪数组索引。@Sunil,您也可以执行
my$arrayref=shift
shift
获取标量上下文中的第一个参数元素,并将其放入
$arrayref
中。