替代:替代评估

sid*_*com 12 replace eval subst perl6

如果替换是在变量中传递的,那么第一个和第二个替换是否相等?

#!/usr/bin/env perl6
use v6;

my $foo = 'switch';
my $t1 = my $t2 = my $t3 = my $t4 = 'this has a $foo in it';

my $replace = prompt( ':' ); # $0

$t1.=subst( / ( \$ \w+ ) /, $replace );
$t2.=subst( / ( \$ \w+ ) /, { $replace } );
$t3.=subst( / ( \$ \w+ ) /, { $replace.EVAL } );
$t4.=subst( / ( \$ \w+ ) /, { ( $replace.EVAL ).EVAL } );

say "T1 : $t1";
say "T2 : $t2";
say "T3 : $t3";
say "T4 : $t4";

# T1 : this has a $0 in it
# T2 : this has a $0 in it
# T3 : this has a $foo in it
# T4 : this has a switch in it
Run Code Online (Sandbox Code Playgroud)

jjm*_*elo 9

$replace和之间的唯一区别{$replace}是,第二个是返回变量值的块。它只是添加了一个间接级别,但是结果是相同的。 更新:根据@raiph的评论进行编辑。

  • 我很好奇你为什么写“返回变量本身”。我认为这具有误导性,并且经过反思,不明白为什么您没有写“返回价值”,这是实际发生的情况。在`my $ replace = 99; 子条款:<foo>()为rw {$ replace}; foo = 42; 说$ replace; #42` {$ replace}中的$ replace实际上确实产生了变量本身,而不是值,并且该块返回变量本身,而不是变量所包含的值。但是在sid的示例中,{$ replace}`中,$ replace`产生变量的* value *,因此该块也返回该* value *,而不是变量本身。 (2认同)
  • 您的编辑仍然会奇怪地读取imo。当变量(容器)不相关时,为什么还要提及“变量本身”?它与`42`和`{42}`之间的区别完全相同。“在您的示例中,它实际上将一个可写容器返回到变量中”。在我的示例中,它们本质上是相同的。我的$ replace = 99; 子条款:<foo>()为rw {$ replace}; 说$ replace.WHERE == foo.WHERE; #正确`。符号“ $ replace”绑定到“ my”中的新容器。然后,“ is rw”告诉P6将“ {$ replace}”中的“ $ replace”解释为容器(变量),而不是其所保存的值。 (2认同)