我有一个名字,我想在另一个字符串变量中给变量:
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]
?
答案 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