在操作符中§

请参阅主要文档 在上下文中 了解前缀 temp

sub prefix:<temp>(Mu $a is rw)

“临时化”作为参数传递的变量。该变量以与在外层作用域中相同的初始值开始,但可以在此作用域中分配新值。退出作用域后,该变量将恢复为其原始值。

my $a = "three";
say $a# OUTPUT: «three␤» 
{
    temp $a;
    say $a# OUTPUT: «three␤» 
    $a = "four";
    say $a# OUTPUT: «four␤» 
}
say $a# OUTPUT: «three␤»

您还可以在调用 temp 时立即分配

temp $a = "five";

请注意,一旦离开块,temp 效果就会被移除。如果您在撤消 temp 后从 Promise 中访问该值,您将获得原始值,而不是 temp

my $v = "original";
{
    temp $v = "new one";
    start {
        say "[PROMISE] Value before block is left: `$v`";
        sleep 1;
        say "[PROMISE] Block was left while we slept; value is now `$v`";
    }
    sleep ½;
    say "About to leave the block; value is `$v`";
}
say "Left the block; value is now `$v`";
sleep 2;
 
# OUTPUT: 
# [PROMISE] Value before block is left: `new one` 
# About to leave the block; value is `new one` 
# Left the block; value is now `original` 
# [PROMISE] Block was left while we slept; value is now `original` 

在变量中§

请参阅主要文档 在上下文中 了解temp 前缀

my 一样,temp 在其作用域的末尾恢复变量的旧值。但是,temp 不会创建新变量。

my $in = 0# temp will "entangle" the global variable with the call stack 
            # that keeps the calls at the bottom in order. 
sub f(*@c{
    (temp $in)++;
     "<f>\n"
     ~ @c».indent($in).join("\n")
     ~ (+@c ?? "\n" !! "")
     ~ '</f>'
};
sub g(*@c{
    (temp $in)++;
    "<g>\n"
    ~ @c».indent($in).join("\n")
    ~ (+@c ?? "\n" !! "")
    ~ "</g>"
};
print g(g(f(g()), g(), f()));
 
# OUTPUT: «<g> 
#           <g> 
#            <f> 
#             <g> 
#             </g> 
#            </f> 
#            <g> 
#            </g> 
#            <f> 
#            </f> 
#           </g> 
#          </g>␤»