gpt4 book ai didi

perl - @$ref->{@keys} 试图访问什么?

转载 作者:行者123 更新时间:2023-12-04 02:03:27 24 4
gpt4 key购买 nike

在对 answer to a question about hash slices 的评论中,有人想知道如何使用箭头语法通过哈希引用访问哈希切片,可能认为

@$ref->{@keys}

会这样做。

是的,正确的语法是 @$ref{@keys}@{$ref}{@keys} ,但这与这个问题无关。

我试图找出带箭头的表达式所需的数据结构:
#! /usr/bin/env perl

use strict;
use warnings;

my $ref = {"a" => 1, "b" => 2, "c" => 3};

my @keys = qw/ a b c /;

#$ref = [ { a => 9, b => 8, c => 7 } ];
#$ref = [ { a => {}, b => {}, c => {} } ];
print @$ref->{@keys}, "\n";

如所写,代码失败

不是 ./prog 第 12 行的 ARRAY 引用。

这是有道理的: @$ref想要对数组的引用,所以我尝试将哈希引用包装在对匿名数组的引用中。这些尝试失败了

不能在 ./prog 第 12 行使用未定义的值作为 HASH 引用。

跟踪输出是

$ debugperl -Dt prog
[...]
(编:12)pushmark
(prog:12) padsv($ref)
(编:12)rv2av
(编:12)rv2hv
不能在 prog 第 12 行使用未定义的值作为 HASH 引用。
print 的语法转储线是

$ debugperl -Dx 程序
[...]
{
484 类型 = 打印 ===> 2
标志 =(无效, child )
{
485 类型=pushmark ===> 486
标志 = (标量)
}
{
第372章 371
标志 =(标量, child )
{
487 类型 = rv2hv ===> 361
目标值 = 5
标志 =(标量、 child 、引用)
私有(private) = (STRICT_REFS)
{
373 类型 = rv2av ===> 487
目标值 = 4
标志 =(标量、 child 、引用)
私有(private) = (STRICT_REFS)
{
486 类型=padsv ===> 373
目标值 = 1
标志=(标量,MOD)
}
}
}
{
第361章 372
目标值 = 2
标志 = (标量)
}
}
{
371 类型 = 常量 ===> 484
目标值 = 19
标志 = (标量)
}
}
[...]

未定义的值从何而来? $ref 的值是多少?程序是否正常终止?

最佳答案

它是无效的(或至少没有意义的)Perl 语法——我有点惊讶它没有被标记为语法错误。

我一开始以为它是在尝试评估数组 @$foo在标量上下文中并将结果用作哈希引用,但这似乎并不是正在发生的事情。
相反,从您发布的调试输出来看,它看起来更像是在尝试直接使用内部数组变量 (AV) 结构作为哈希引用 (RV),这是一种标量(SV;有关详细信息,请参阅 perlguts) .

我没有查看源代码,但它看起来好像 rv2hv例程要么注意到它被赋予了错误的结构并返回 null,要么只是尝试将 AV 用作 RV 并以这种方式实现相同的效果。 (对不起,如果这听起来有点困惑,自从我上次查看 perl 的内部结构以来已经有好几年了。)

您可能需要考虑提交错误报告。

顺便说一句,演示效果的更简单的测试用例只是 @foo->{bar} .

关于perl - @$ref->{@keys} 试图访问什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8150508/

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