【问题标题】:How to define variable names dynamically in Perl 6?如何在 Perl 6 中动态定义变量名?
【发布时间】:2017-11-16 15:03:17
【问题描述】:

我想在另一个字符串变量中为变量命名: 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]?

【问题讨论】:

  • 如果你想要这个,你对这个问题的思考是错误的。这是关于 Perl5,但在这里仍然有效:perl.plover.com/varvarname.html
  • @Holli 我并没有考虑将它与一些类似哈希的数据一起使用,我只是想知道如何去做。 :) 感谢您的链接!
  • 这可能会让您感兴趣:docs.perl6.org/language/packages#Looking_up_names。但这是用于名称查找,而不是声明。我认为词法名称声明必须是明确的,以便编译器可以检查变量是否存在。但是当一个包被导入时,它可以导出动态命名的变量和函数。如果你想用一个模块来做这个,Holli 最近的一个 perl6 question 有两个描述它的答案。

标签: raku


【解决方案1】:

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

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

但是,一种解决方法是可能的:您可以在运行时创建自己的词汇板(对于需要的模块),例如使用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

【讨论】:

  • @Holli 是的,它不漂亮:) 所以如果其他一切都失败了,这是最后的手段
【解决方案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

【讨论】:

  • 好主意,但顶部my $a 可能有问题?据我了解,变量名称 $a 应该在另一个变量中(这里的意思是:动态创建的字符串),所以我不认为明确的 my $a 会是一个选项。
  • @HåkonHægland 他真的是同时问了两个问题。是否可以动态创建新变量的答案是,但如何动态访问它们的答案是我写的。
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2011-06-29
  • 2010-12-05
相关资源
最近更新 更多