如何在 Perl 6 中动态定义变量名?
How to define variable names dynamically in Perl 6?
我想在另一个字符串变量中给一个变量起一个名字:
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]
?
根据 documentation 词法填充(符号 table)在编译后是 immutable。此外(根据相同的文档)这意味着 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
词法作用域是不可变的,但您可以采用 ::($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
我想在另一个字符串变量中给一个变量起一个名字:
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]
?
根据 documentation 词法填充(符号 table)在编译后是 immutable。此外(根据相同的文档)这意味着 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
词法作用域是不可变的,但您可以采用 ::($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