gpt4 book ai didi

Perl:使用 rule1 通过 ref 传递散列

转载 作者:行者123 更新时间:2023-12-02 05:40:53 25 4
gpt4 key购买 nike

我仍然不清楚为什么 ref 部分显示 %Q$_ 未初始化的未定义值。我一直在翻perlreftut仍然看不出我做错了什么。将散列作为平面数组传递没有问题。

通过 ref 和 testRef(\%mkPara) 将标量哈希引用传递给子例程,对吗?那么,my %Q = %{$_} 不会把它变回哈希吗?

use strict;
use diagnostics;
use warnings;

my %mkPara = ('aa'=>2,'bb'=>3,'cc'=>4,'dd'=>5);

sub testFlat
{
my %P = @_;
print "$P{'aa'}, $P{'bb'}, ", $P{'cc'}*$P{'dd'}, "\n";
}

sub testRef
{
my %Q = %{$_}; #can't use an undefined value as HASH reference
#print $_->{'aa'}, "\n";#Use of uninitialized value
print $Q{'aa'},"\n";
}

#testFlat(%mkPara);
testRef(\%mkPara);

最佳答案

当您在函数调用中使用参数时(在您的例子中为 \%mkPara),您可以通过函数内的 @_ 数组访问它们。

在这里,您将一个参数传递给函数:\%mkPara,然后您可以通过使用 访问 @_ 的第一个元素来访问它$_[0].

$_ 是一些内置函数/运算符的默认变量(printm//s///chomp 等等)。通常出现在 whilefor 循环中。但是在你的代码中,你没有理由使用它(你从来没有将它设置为任何东西,所以它仍然设置为 undef,因此错误 “不能使用未定义的值作为哈希引用”

所以你的函数实际上应该是:

sub testRef
{
my %Q = %{$_[0]}; # instead of %{$_}
print $_[0]->{'aa'}, "\n"; # instead of $_->{'aa'}
print $Q{'aa'},"\n";
}

如果需要,您可以在 perlsub 上找到有关功能的更多信息.

但是,正如@Ikegami 在评论中指出的那样,使用 my %Q = %{$_[0]}; 创建您发送的散列的副本到函数,在大多数情况下(包括你只打印哈希键的那个)是非常次优的,因为你可以只使用哈希引用(就像你在做 $_[0]-> {'aa'}).
您可以像这样使用哈希引用(与@Zaid 的答案大致相同的示例):

sub testRef
{
my ( $Q ) = @_;
print $Q->{aa} ;
print $_, "\n" for keys %$Q;
}
testRef(\%mkPara);

引用资料网上有很多,比如perlreftut你已经在看。

关于Perl:使用 rule1 通过 ref 传递散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40057561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com