没有引用的Perl参数修改

我只是想要在不使用引用的情况下修改Perl子例程中的参数的概念.我在数组的情况下尝试了这个:

sub test {
  print "Trying to change ... \n";
  $_[0] = "Third";
  $_[1] = 100;
}

@a = ("First",1,"Second",2);

print "Before change : @a \n";
test(@a);
print "After change : @a \n";

输出:

Before change : First 1 Second 2
Trying to change ...
After change : Third 100 Second 2

换句话说,通过更改@_的值来更改数组的元素.

但是在哈希的情况下做同样的事情并没有给出预期的行为:

sub test {
  print "Trying to change ... \n";
  $_[0] = "Third";
  $_[1] = 100;
}

%h = ("First" => 1,"Second" => 2);

test(%h);

foreach ( keys %h ) {
  print "$_\n";
}

输出:

Trying to change ...
Second
First

为什么这两种情况有所不同?

解决方法

Perl将一直通过引用传递.

因此,在数组示例中,每个元素都作为引用传递(因为对sub的输入只是’缩放器列表’,即数组).因此,当您更新sub中的元素时,实际上会更改引用原始数组中的值的值.

在散列的示例中,当Perl看到传递给子的散列时,它知道它不能发送散列,因此将其转换为散列数据的“缩放器列表”表示 – 这对于原始数据.此表示形式通过引用传递给您更新.因此,您不会像使用简单数组那样更新原始数据.

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...