gpt4 book ai didi

perl - 如何在 Perl 中使用散列作为子例程的参数?

转载 作者:行者123 更新时间:2023-12-04 09:00:10 27 4
gpt4 key购买 nike

我有一个函数正在做一些计算,然后将一些属性传递给另一个子程序,如下所示:

sub get_result {
my $id = 1;
my %diet = ( result => 28,
verdict => 'EAT MORE FRUIT DUDE...'
);

my %iq = ( result => 193,
verdict => 'Professor Einstien'
);
print_result($id, %diet, %iq);
}

sub print_result {
my $id = shift;
my %d = @_;
my %i = @_;

print "IQ: $id\n";
print "DIET RESULT: $d{result}\n";
print "DIET VERDICT: $d{verdict}\n";
print "IQ RESULT: $i{result}\n";
print "IQ VERDICT: $i{verdict}\n";
}

我的问题是 (DIET RESULT, DIET VERDICT) 和 (IQ SCORE, IQ RESULT) 中打印的结果都是相同的。好像变量 %d 和 %i 被填充了相同的变量。任何想法这是为什么?

如果我尝试像这样移动所有三个变量:
my $id = shift;     
my %d = shift;
my %i = shift;

我收到以下错误:
Odd number of elements in hash assignment

最佳答案

当您将数组(或散列)传递给子例程时,子例程将获得值(或键值对)的列表。这就是为什么不能传递两个数组(或两个散列)的原因,因为子例程不知道第一个数组在哪里结束,第二个数组从哪里开始。

要解决此问题,您应该传入引用:

my %hash1 = ( foo => 'bar' );
my %hash2 = ( bar => 'baz' );
subroutine( \%hash1, \%hash2 );

sub subroutine {
my ( $hashref1, $hashref2 ) = @_;
print $hasref1->{foo}, $hashref2->{bar};
}

PS:除了概念问题外,您的代码还具有以下特点:
my %d  = @_;     
my %i = @_;

如果 %d 和 %i 都被分配了相同的值,那么当它们之后相同时就不应该感到惊讶了。

关于perl - 如何在 Perl 中使用散列作为子例程的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/944784/

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