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

Sun*_*nil 1 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 $var;
    print "\n";
}

receiveArray(\@ar);

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

foreach my $var ( @ar ) {
    print $var;
    print "\n";
}
Run Code Online (Sandbox Code Playgroud)

上面的代码有什么问题?

mel*_*ene 10

您应该启动您编写的每个Perl文件use strict; use warnings;.这将帮助您避免这样的错误.

问题出在这一行:

    my $arrayref = @_;
Run Code Online (Sandbox Code Playgroud)

您将数组分配给标量,因此在标量上下文中计算数组,从而生成数组中的元素数.

你应该做的是:

    my ($arrayref) = @_;
Run Code Online (Sandbox Code Playgroud)

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

列表分配记录在perldoc perldata(以" 列表可能分配给 ......" 开头的部分).

  • @Sunil:使用括号,您将数组`@ _`中的列表分配给列表`($ arrayref)`中的变量,因此赋值发生在列表上下文中.(注意:不是"数组上下文".技术上没有这样的东西.数组只是一个包含列表的变量.)没有括号,你将数组`@ _`分配给标量`$ arrayref`,所以它是在标量上下文中完成的,你得到数组中的项目数而不是它的内容. (2认同)