为何传入Net::Ping构造函数的Hashref调用后变为空哈希引用?
Perl中Net::Ping构造函数清空传入哈希引用的原因
问题现象
将包含{proto => 'udp'}的哈希引用$args传入Net::Ping的new()构造函数后,$args及其引用副本$args_copy均变为空哈希引用。该问题在Strawberry Perl与WSL2 Ubuntu 20.04.4的Perl v5.30.0环境中均可复现,测试代码如下:
use strict; use warnings; use Data::Dumper qw(Dumper); use Net::Ping; sub _ping { my ($args) = @_; my $p = Net::Ping->new($args); $p->close(); } my $args = { proto => 'udp' }; my $args_copy = $args; print Dumper $args; # $VAR1 = { 'proto' => 'udp' } print Dumper $args_copy; # $VAR1 = { 'proto' => 'udp' } _ping($args); print Dumper $args; # $VAR1 = {} print Dumper $args_copy; # $VAR1 = {}
原因解析
- Net::Ping的
new()方法直接修改了传入的哈希引用,而非创建副本处理。 - 该方法内部会从传入的哈希引用中提取所需参数(比如
proto),提取完成后会将这些键从原哈希中删除,最终导致原哈希被清空。 $args_copy是$args的引用,二者指向内存中同一个哈希结构,所以当原哈希被清空时,$args_copy自然也会显示为空。
查看Net::Ping的模块源码就能发现,new()方法在处理参数时使用了类似delete $args->{proto}的操作,直接修改了传入的哈希引用本身,而非操作其副本。
内容的提问来源于stack exchange,提问作者Hans Davidsson
相关产品推荐
相关产品推荐

