gpt4 book ai didi

perl - 本地和语句修饰符(例如后缀 if)

转载 作者:行者123 更新时间:2023-12-04 05:45:48 25 4
gpt4 key购买 nike

perlsyn , "Statement-Modifiers" section明确指出

The behaviour of a my, state, or our modified with a statement modifier conditional or loop construct (for example, my $x if ... ) is undefined.



不幸的是,此列表丢失 localits own documentation也不涵盖其行为。我认为它也是未定义的,并且文档在这些特定部分中是不完整的。

这实际上是否包含在任何地方的文档中?

最佳答案

my 上使用语句修饰符的未定义行为& Co., 如

my $x = 1  if $flag;  # UNDEFINED behavior

是因为 my $x声明发生在编译时,而 = 1分配发生在运行时,测试也是如此。因此整个语句被破坏了(它甚至根本不应该赋值吗?),并且这行代码的行为被认为是未定义的。

然而, local是非常不同的。来自 perlsub (我的重点)

A local modifies its listed variables to be "local" to the enclosing block, eval, or do FILE --and to any subroutine called from within that block. A local just gives temporary values to global (meaning package) variables. It does not create a local variable.



因此 local做一些与 my 完全不同的事情或 our ;它为块的其余部分保存其目标(全局)变量的值,并在退出块时恢复它。

此外,由于 local is a run-time operator没有声明 + 分配的编译与运行时问题,如 my $x = 1 ,因此可以使用后缀条件。考虑
use warnings;
use strict;
use feature 'say';

my $flag = shift // 1;

our $var = 1;

{
local $var if $flag;
$var = 2;
say $var;
}

say $var;

当使用 $flag 运行时设置 ( script.pl ) local -ization 发生,最后一次打印显示全局 our $var被保存了下来。如果标志未设置( script.pl 0 ),这不会发生,全局值不会为块保存,最终会被覆盖。

local $var = 2 if $flag;本地化和分配都不会发生。

如果只有 local由于 local 的影响,语句本身是有条件的,必须以后缀方式完成。仅在封闭范围内持续(因此 if ($f) { local $v } 对其余代码没有任何作用)。

这样做可能会从根本上改变代码行为,并且可能在高层次上,仅仅基于单个条件的值;我建议仔细使用此类代码。这个简短的程序特别只展示了如何使用后缀条件。感谢 ysthikegami评论。

关于perl - 本地和语句修饰符(例如后缀 if),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49566094/

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