You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 18:15:41