【问题标题】:How to modify array elements using subroutine in Perl如何在 Perl 中使用子例程修改数组元素
【发布时间】:2016-10-20 01:31:22
【问题描述】:

我正在尝试修改传递给子例程的数组。

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

下面是我的程序。

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";
}

以上代码有什么问题?

【问题讨论】:

    标签: arrays perl reference subroutine


    【解决方案1】:

    您应该以use strict; use warnings; 开头编写的每个 Perl 文件。这将帮助您避免此类错误。

    问题出在这一行:

        my $arrayref = @_;
    

    您将一个数组分配给一个标量,因此该数组在标量上下文中进行计算,从而产生数组中的元素数。

    你应该做的是:

        my ($arrayref) = @_;
    

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

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

    【讨论】:

    • 非常感谢您的帮助。那行得通。但我仍然无法理解我的 $arrayref = @_ 和我的 ($arrayref) = @_ 之间的区别。你能告诉我有什么区别吗?谢谢
    • 我告诉过你区别。你能解释一下哪一部分不清楚吗?
    • @Sunil:使用括号,您将数组@_ 中的列表分配给列表($arrayref) 中的变量,因此分配发生在列表上下文中。 (注意:不是“数组上下文”。从技术上讲,没有这样的东西。数组只是一个包含列表的变量。)没有括号,您将数组 @_ 分配给标量 $arrayref,这样就完成了在标量上下文中,您将获得数组中的项目数而不是其内容。
    • 正确,my $arrayref = $_[0]; 也可以,但是如果您想添加/删除/重新排列参数,以后扩展起来会比较困难,因为您必须自己跟踪数组索引。
    • @Sunil,你也可以使用my $arrayref = shift;shift 采用标量上下文中传入的参数的第一个元素,并将其放入 $arrayref
    猜你喜欢
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2012-03-24
    • 2014-02-23
    相关资源
    最近更新 更多