为什么使用keys()而不是%{..}会发生自动生存?

2024-01-24

这是我发现的一个微妙之处keys().

$ perl -e 'use warnings; use strict; my $d = { "ab" => 1 }; my @e = keys(%{$d->{cd}});'

$ perl -e 'use warnings; use strict; my $d = { "ab" => 1 }; my %e = %{$d->{cd}};'
Can't use an undefined value as a HASH reference at -e line 1.

我最困惑的是为什么第一个片段不会给出取消引用错误。当我使用Data::Dumper,很明显,在第一个片段中,$d->{cd},自生化为{}.

为什么keys需要自动激活吗?我尝试阅读perldoc对于它,找不到满意的答案。keys不设置别名($_等)所以 Perl 不需要思考$d->{cd}需要在左值上下文中,是吗? (我知道表达式是否需要在左值上下文中,自动生存如所解释的那样发生here http://www.effectiveperlprogramming.com/2011/04/understand-autovivification.

相关的post https://stackoverflow.com/questions/6419618/perl-vivification-question-while-dereferencing-undefined-array-reference.


请注意,键确实可以是左值(设置哈希的预期元素数量)。

但即使键本身不在左值上下文中使用,它也会产生重置哈希迭代器的副作用。

所以它确实修改了哈希,并为解引用提供了左值上下文,这使得它自动生存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么使用keys()而不是%{..}会发生自动生存? 的相关文章

随机推荐

  • 调用未定义函数 Doctrine\ORM\Mapping\Driver\simplexml_load_file()

    我正在使用 Symfony2 并将我的网络部署到 CentOs6 服务器 我得到了这个异常 FatalErrorException Error Call to undefined function Doctrine ORM Mapping
  • 我是否可以使用 PLINQ 来提高效率?

    我正在尝试解决一个问题 即找到给定范围内的所有素数 且每个数字都是素数 例如在范围中 1 100 答案是8因为2 3 5 7 23 37 53 37是满足它的所有数 我当前的解决方案是正确的 Yields all the numbers i
  • 是否可以在程序运行时获取其输出?

    如果我有一个用 c 编写的 Windows 控制台程序 是否可以在程序运行时检索该程序的标准输出 如果没有 重写程序的最佳方法是什么 我知道我可以输出到文件并不断检查这些文件是否有更新 还有别的办法吗 有没有更好的办法 代码项目中有一些有趣
  • 如何在Sequelize模型中添加实例方法

    我想添加一个实例方法Sequelize User模型与postgres User模型定义如下 const Sql require sequelize const db require startup db const User db def
  • 将元素附加到已存在的 SOAP::Data 复杂类型

    我对 SOAP PERL 以及几乎所有其他我被要求做的事情都很陌生 所以我希望有人能给我指出正确的方向 我实现了一个简单的 WCF 解决方案 并编写了一个 PERL 客户端 它使用 SOAP lite 和 SOAP Data 将 复杂数据结
  • Android 将标签设置为微调器

    你好 如何在微调器中设置标签 即 当用户单击微调器按钮选项可见时 标签最初应可见 当用户选择选项时 标签应替换为新项目 微调器是否可以 Spinners没有 标签 但除此之外 我认为你所描述的正是Spinner does 关闭时 显示用户所
  • Col BY 在 Google 表格查询中导致解析错误

    我正在尝试在 google 表格中运行以下查询 但当我尝试选择 BY 列时收到解析错误 如果没有此列 它将按预期运行 查询如下 QUERY Applications received B DL Select B CT CU CV CW CX
  • 对于 Android SDK 17 或更低版本,如何从 uri 获取选定的 xls 文件路径?

    我需要sdk版本17或以下的解决方案 这是我的方法 public static String getRealPathFromURI API11to18 Context context Uri contentUri String proj M
  • 部署引发错误“不知道如何构建任务‘资产:预编译’”(Capistrano)

    有没有人在运行后遇到过这个错误 cap production deploy 我正在使用 capistrano Capistrano 版本 3 6 1 Rake 版本 11 3 0 这是日志 Backtrace restricted to i
  • 对 C++ 基类的不明确函数调用

    我正在尝试创建一个可变参数模板类 它为类型列表中的每个类提供一个方法 下面显示了一个示例 它创建了一个print类型列表中每个类的方法 include
  • nginx 中使用 proxy_pass 出现“请求标头或 Cookie 太大”

    我的服务器 A 上有以下 nginx 设置 面向互联网 仅相关部分 upstream new api server unix home ubuntu new api shared tmp sockets puma sock server l
  • 如何隐藏div元素下方的文本光标

    我是 CSS 和 javascript 新手 我有一个搜索文本框 可以在其中添加任何搜索值 输入错误值后 会弹出一个 div 并显示 未找到记录 带有关闭按钮来关闭 div 当我将光标放在文本框上而不关闭弹出窗口后 我的光标显示在 div
  • @end 在实现上下文中丢失[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我没有足够
  • Android:使用隐式意图读取txt文件

    问题 我正在尝试使用隐式打开 txt 文件Intent ACTION GET CONTENT 并将文本文件内容存储到数组列表中 当我尝试使用 Uri 的文件路径打开文件时getPath 并创建一个BufferedReader对象从文本文件中
  • 遗留文件的 QVariantList 序列化

    我正在以旧的遗留文件格式 不是我们的 阅读 很明显 这种文件格式是使用序列化编写的 因此为了让我的生活更轻松 我在阅读时也做了同样的事情 在读取文件的某个时刻 一个段被识别为QMetaType QVariantList https doc
  • Gradle 同步失败:无法创建父目录 - Android Studio

    我在 Android Studio 中遇到意外错误 无法运行我的应用程序 C Users gradle caches modules 2 metadata 2 71 descriptors com android tools build g
  • 用于检查素数的 C++ 代码不起作用

    我在使用此 C 代码时遇到问题 整数num是一个我想检查它是否是质数的数字 然而这个程序总是返回 false 这可能很简单 但我找不到任何东西 for int i 2 i
  • 如何将用户添加到 sfguard

    我在用着symfony http www symfony project net1 2 与sfguard 1 4 1 http www symfony project org plugins sfGuardPlugin 在系统上注册新用户的
  • 无法获取 Kerberos 领域

    我是 Kerberos hive 的新手 想要使用 JDBC 连接 hive Kerberos 实现 gt gt org apache hadoop conf Configuration conf new gt gt org apache
  • 为什么使用keys()而不是%{..}会发生自动生存?

    这是我发现的一个微妙之处keys perl e use warnings use strict my d ab gt 1 my e keys d gt cd perl e use warnings use strict my d ab gt