我试图在 Raku 中使用散列,但是当我(故意)将一些假值放入其中时,例如
say %key<fake_key>;
我得到(Any)
但我希望程序在这种情况下死掉,就像 Perl 那样,因为这意味着丢失了重要的数据。例如,
#!/usr/bin/env perl
use strict;
use warnings 'FATAL' => 'all';
use autodie ':all';
my %hash;
print "$hash{y}\n";
截至 5.26.1 产生Use of uninitialized value $hash{"y"} in concatenation (.) or string at undefined.pl line 8.
Command exited with non-zero status 255
我怎样才能得到等效的 use warnings 'FATAL' => 'all'
和 use autodie qw(:all)
在乐?
最佳答案
你的问题是:
I'm looking for
use autodie qw(:all)
&use warnings 'FATAL' => 'all'
in Raku
相当于 Perl 的
autodie
在乐Aiui 相当于
use autodie qw(:all)
在 Perl 中是 use fatal;
在乐。这是一个词法作用域(至少在 Raku 中是这样)。The
autodie
section in the Perl-to-Raku nutshell guide解释例程现在返回 Failure
s 表示错误。The
fatal
pragma返回 Failure
从例程自动抛出一个异常,其中包含 Failure
.除非您提供捕获它们的代码,否则这些异常会包装 Failure
s自动死亡。相当于 Perl 的
use warnings 'FATAL'
在乐Aiui 相当于
use warnings 'FATAL' => 'all'
在 Perl 中是 CONTROL { when CX::Warn { note $_; exit 1 } }
在乐。这是一个词法作用域(至少在 Raku 中是这样)。CONTROL
exceptions解释了这些是如何工作的。CONTROL
异常是所有异常的子集 .resume
'd 默认情况下——程序在被抛出时默认保持事件状态。我提供的 Raku 代码(从您链接的 How could I make all warnings fatal? 中提取)改为
CONTROL
异常死亡(由于 exit
例程)。返回到您当前的问题文本:
say %key<fake_key>; # (Any)
I want the program to die in such occurrences ...
使用 Jonathan++ 的答案(使用
put
,与 say
不同,它不会试图让您的程序保持事件状态)或 Scimon++ 的 KeyRequired
答案这将使访问不存在的 key 致命。... as Perl does ...
仅当您使用
use warnings 'FATAL' ...
,就像 Raku 在使用等效项时所做的那样。... because this implies that important data is missing.
通常它意味着丢失了不重要的数据,或者甚至是您在尝试访问它时不希望定义的重要数据,因此 Perls 和 Raku 默认保持您的程序处于事件状态,并要求您告诉它您想要什么,如果你想要不同的东西。
您可以使用上述结构来获得您想要的精确结果,它们将被限制在给定的变量(如果您使用
KeyRequired
角色)或语句(使用 put
而不是 say
)或词法范围(使用编译指示或 CONTROL
块)。
关于raku - 如何死于未定义的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54312824/