如何在Perl 6中动态定义变量名?

时间:2017-11-16 15:03:18

标签: perl6

我有一个名字,我想在另一个字符串变量中给变量: my $name = '$a';或只是my $name = 'a';如何制作变量并使用它?我的意思是这样的(但它不起作用):

my $name = '$a';
my {$name} = 1; # Doesn't work
say $a; # should be 1

更一般的情况。我有一个变量名列表,比如my @names = '$aa' ... '$cc';如何声明和使用变量,其名称将是例如@names[2]

2 个答案:

答案 0 :(得分:2)

词法范围是不可变的,但您的方式是::($name)MY::($name)

my $a; # required or it will generate an error

my $name = '$a';

::($name) = 1;
say $a;          # 1

MY::($name) = 2;
say $a;          # 2

sub foo ($name,$value) { CALLER::MY::($name) = $value }
foo($name,3);
say $a;          # 3

答案 1 :(得分:1)

根据documentation,词法填充(符号表)在编译时间后是不可变的。另外(根据相同的文档),它意味着EVAL不能用于将词汇符号引入周围的范围。

我建议您使用包变量,而不是注释中建议的词法变量。

但是,可以采用一种解决方法:您可以在运行时创建自己的词法填充(对于需要的模块),例如使用require MODULE

my $name = '$a';
spurt 'MySymbols.pm6', "unit module MySymbols; use v6; my $name = 1; say \"\\$name = $name\"";
use lib '.';
require MySymbols;

<强>输出

$a = 1
相关问题