在 Raku 中使用 Perl 5 模块 Data::Printer 的 `show_tied` 选项时,如何关闭它?

2023-11-22

我使用了带有 Perl 的 CPAN Perl 模块 Data::Printer (DP)。效果很好。

现在我想在 Raku 代码中使用它。

When I use the :from<Perl5> feature to import it and then run code using it, the annotation (tied to Perl6::Hash) is appended to the display of hashes.1

As DP的CPAN文档显示,该注释由选项控制show_tied。我想切换off(将其设置为0) 而不是其默认值on(设置1)。下面是我在 Perl 中的做法:

use Data::Printer show_tied => 0;

但是当我在 Raku 中尝试这个时:

use Data::Printer:from<Perl5> show_tied => 0;

I get:

从“Data::Printer”导入时出错:没有这样的标签“show_tied”

我该如何转向show_tied在 Raku 中使用 DP 时关闭?

脚注

1 Perhaps this is because Inline::Perl5 (which implements the :from<Perl5> feature) is doing something to enable smooth Perl/Raku interop.


我该如何转向show_tied在 Raku 中使用 DP 时关闭?

You must explicitly convert Associatives (eg Pairs) that are listed at the end of a use statement, that are not "tags", to a flattened list interleaving keys and values.1

最直接的解决办法就是manually写一个简单的文字列表,例如:

use Data::Printer:from<Perl5> 'show_tied', 0;

对于更简洁的解决方案,请参阅Using kv下面的部分。

注入变量

注意use语句的评估时间为编译时。因此,如果您想在列表中注入变量,那么您需要确保它们的值,而不仅仅是它们的名称,也建立在编译时, 之前use声明被评估。一个朴素的my $foo = 0;还不够,因为= 0部分将发生在run-time。相反,您需要使用合适的编译时构造,例如BEGIN:

BEGIN my $foo = 0;
use Data::Printer:from<Perl5> 'show_tied', $foo;

Using kv

The kv routine可以生成想要的'key1', value1, 'key2', value2, ...给定哈希值的序列:

use Data::Printer:from<Perl5> kv { show_tied => 0 }

or:

BEGIN my %opts = show_tied => 0;
use Data::Printer:from<Perl5> kv %opts;

脚注

1 This answer built upon Stefan's explanation from the issue I opened in response to the "Altering parameters in Data::Printer in Raku" SO:

解决方案相当简单:使用Data::Printer:from<Perl5> 'show_tied', 0;胖逗号=> is a PairRaku 中的构造函数,而在 Perl 5 中它实际上只是一个花哨的逗号。Raku 认为Pair用于导入标签的参数,例如:ALL(这相当于ALL => True)。要解决这个问题并传递 Perl 5 代码所期望的内容,只需单独列出这些值即可。

换句话说,这种转换的需要是因为 Perl 和 Raku 共享notion of tags (关于“标签”的 Perl 文档; 关于“标签”的 Raku 文档) 和(并非巧合)惯用地使用相同的语法来选择标签 (:tagname).

此外,使用 Raku,语法是否用于指定标签之间的歧义问题(需要解决)适用于all Associatives 用于 a 的顶层use声明,而不仅仅是表格中写的内容:foo但即使是以其他形式编写的,例如foo => bar, { foo => bar}, %baz, or { %baz }.

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

在 Raku 中使用 Perl 5 模块 Data::Printer 的 `show_tied` 选项时,如何关闭它? 的相关文章

  • Perl 脚本的 shebang 行应该使用什么?

    哪一个用作 Perl 脚本的 shebang 行更好或更快 perl perl exe fullpath perl perl exe partialpath perl perl exe 并且 当使用 perl 当它在特定系统上运行时 我如何
  • 我使用 TT(perl 模板工具包)获得额外的 CR

    我使用 perl v5 10 在 Windows 7 上 TT v2 22 当我使用 TT 时 对于每个源代码行 我都会在生成的 html 中获得一个额外的内容CR 源文本 Windows 格式 Some html CR LF 输出文本 S
  • git:检查标签,修改某些内容,然后再次标记它

    我觉得我应该知道这一点 但我很困惑 我在 github 上分叉了一个存储库 我需要的是签出一个标签 称为 v1 0 5 修改文件上的语句 使用名为 1 0 5 的新标签 不带 v 重新标记该状态 然后执行对 master 进行同样的更改 让
  • GNU Global 和 GTAGS 找不到类定义

    我在全局查找类 结构定义时遇到问题 我可以使用丰富的 ctags 和 cscope 找到它们 所有标记文件都是从相同的源文件列表构建的 我配置并构建了全局等 仅指定了 prefix configure 确实发现了 exhuberant 并且
  • 打印出匿名子程序的代码

    我目前正在一个非常复杂的 Perl 架构中工作 我想创建一些调试工具 由于许多行为涉及匿名子例程 因此我想分析其中一些行为 而我所要做的就是对子例程的引用 简而言之 有没有办法打印子例程引用的代码 因为 Perl 被解释 它可能仍然可用 核
  • 将自己编写的 TypeScript 模块导入 Svelte 组件时出现错误

    我正在尝试将自己编写的 TypeScript 模块导入到 Svelte 组件中 但是 当我尝试使用以下行导入模块时 我收到以下错误 import TelegramBotForSafetyMania from telegram bot 我们收
  • 如何在perl中使用O_ASYNC和fcntl?

    我想使用 O ASYNC 选项 当管道可以读取时 SIGIO 的处理程序将运行 但以下代码不起作用 任何人都可以帮助我吗 bin env perl use Fcntl SIG IO sub print catch SIGIO n my fl
  • 如何绑定值 INSERT INTO mysql perl

    我有下面的代码可以工作 但我需要知道如何绑定它们以确保安全 如果我只是将 new row 替换为 并将其放入执行中我收到错误 感谢您的帮助 foreach my field account field order new row param
  • 使用perl创建层次结构文件

    我的任务是使用 perl 创建父子层次结构文件 示例输入文件 制表符分隔 记录将以随机顺序排列在文件中 父项 可能出现在 子项 之后 S5 S3 S5 S8 ROOT S1 S1 S7 S2 S5 S3 S4 S1 S2 S4 77 S2
  • 如何在SQL Compact Edition中导入数据? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我似乎没有找到合适的工具 也没有找到
  • 如何加速我的 Perl 程序?

    这确实是两个问题 但它们非常相似 为了简单起见 我想我应该把它们放在一起 Firstly 给定一个已建立的 Perl 项目 除了简单的代码优化之外 还有哪些不错的方法可以加速它 Secondly 用Perl从头开始编写程序时 有哪些好的方法
  • 为什么 Perl 找不到我在 ClearCase 中的文件?

    Perl 的这段代码告诉我 ClearCase 中的文件不存在 但它确实存在 x PATH TO FILE if e x print This file exists on the file system else print I can
  • Perl:模板工具包的替代品

    我使用模板工具包来扩展现有的领域特定语言 verilog 已经超过 3 年了 虽然总的来说我对此感到满意 但主要的刺激性是 当出现语法 undef 错误时 错误消息不包含用于调试错误的正确行号信息 例如我会收到一条消息 指示 0 未定义 因
  • Java 相当于 Perl 的 s/// 运算符?

    我有一些代码正在从 Perl 转换为 Java 它大量使用了正则表达式 包括s 操作员 我已经使用 Perl 很长时间了 但仍然习惯 Java 的做事方式 特别是 字符串似乎更难使用 有谁知道或有一个完全实现的Java函数s 这样它就可以处
  • 如何只读取文件的第一行

    我已经用谷歌搜索了一段时间 但我找不到只读取文件第一行的函数 我需要读取文本文件的第一行并从中提取日期 Perl 新手 open my file lt filename txt my firstLine lt file gt close f
  • 将文件夹中的多个 csv 文件读取到 R 中的单个数据帧中[重复]

    这个问题在这里已经有答案了 我有一个包含 332 个 csv 文件的文件夹 文件名称如下 001 csv 002 csv 003 csv 330 csv 331 csv 332 csv 所有文件都具有相同数量的变量和相同的格式 我需要读取一
  • 如何在 Perl 中找到正则表达式匹配的位置?

    我需要编写一个接收字符串和正则表达式的函数 我需要检查是否有匹配并返回匹配的开始和结束位置 正则表达式已经由qr 该函数还可能收到一个 全局 标志 然后我需要返回所有匹配的 开始 结束 对 我无法更改正则表达式 甚至无法添加 用户可能使用的
  • 是否有与 pdl2(或 Devel::REPL)中的 perl 调试器“x”等效的东西?

    我在用pdl2 the PDL http p3rl org PDLshell 也作为我的默认 Perl 交互式 shell 它加载所有不错的插件Devel REPL http search cpan org perldoc Devel 3a
  • 从文本块中提取相关标签/关键字

    我想要一个特定的实现 以便用户提供如下文本块 要求 使用 Linux Apache 2 的 LAMP 环境的工作知识 MySQL 5 和 PHP 5 Web 2 0 标准知识 熟悉 JSON 使用框架 Zend OOP 的实践经验 跨浏览器
  • python相对导入[重复]

    这个问题在这里已经有答案了 我正在尝试在 python 中进行相对导入 但我无法理解语法 每次我在这里搜索它时 我都找不到答案 这是我的文件夹结构 Root libraries mylibrary init projects project

随机推荐