gpt4 book ai didi

perl - 返回散列的子程序 - 将其分解为单独的变量

转载 作者:行者123 更新时间:2023-12-04 13:08:26 25 4
gpt4 key购买 nike

我有一个返回散列的子程序。子程序的最后几行:

print Dumper(\%fileDetails);
return %fileDetails;

在这种情况下,dumper 打印:
$VAR1 = {
'somthing' => 0,
'somthingelse' => 7.68016712043654,
'else' => 'burst'
}

但是当我尝试转储它时,用这一行调用子例程:
print Dumper(\fileDetailsSub($files[$i]));

倾销者打印:
$VAR1 = \'somthing';
$VAR2 = \0;
$VAR3 = \'somthingelse';
$VAR4 = \7.68016712043654;
$VAR5 = \'else';
$VAR6 = \'burst';

一旦散列被破坏,我就不能再使用它了。
为什么会发生?以及如何在子程序返回时保留正确的结构?

谢谢,
标记。

最佳答案

在 Perl 中没有返回散列这样的东西。

子程序将列表作为它们的参数,并且它们可以返回列表作为它们的结果。请注意,列表是与数组非常不同的生物。

当你写

return %fileDetails;

这相当于:
return ( 'something', 0, 'somethingelse', 7.68016712043654, 'else', 'burst' );

当您调用子例程并取回该列表时,您可以做的一件事就是将其分配给一个新的散列:
my %result = fileDetailsSub();

这是有效的,因为可以使用键值对列表初始化哈希。 (请记住, (foo => 42, bar => 43 )('foo', 42, 'bar', 43) 相同。

现在,当您在散列上使用反斜杠引用运算符时,如 \%fileDetails ,你会得到一个散列引用,它是指向散列的标量。

同样,如果你写 \@array ,你得到一个数组引用。

但是当你在一个列表上使用引用操作符时,你不会得到一个列表的引用(因为列表不是变量(它们是短暂的),它们不能被引用。)相反,引用操作符分布在列表项上, 所以
\( 'foo', 'bar', 'baz' );

创建一个新列表:
( \'foo', \'bar', \'baz' );

(在这种情况下,我们得到一个充满标量引用的列表。)这就是当您尝试 Dumper 时所看到的。你的子程序的结果:一个引用运算符分布在你的子程序返回的项目列表上。

因此,一种解决方案是在使用 Dumper 之前将结果列表分配给实际的哈希变量。另一个是从子返回一个散列引用(无论如何你正在转储):
return \%fileDetails;

...

my $details_ref = fileDetailsSub();
print Dumper( $details_ref );

# access it like this:
my $elem = $details_ref->{something};
my %copy = %{ $details_ref };

更多精彩,请看:
  • perldoc perlreftut - Perl 引用教程和
  • perldoc perlref - Perl 引用资料。
  • 关于perl - 返回散列的子程序 - 将其分解为单独的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16795987/

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