gpt4 book ai didi

Pearl:嵌套数据结构中的交叉引用?

转载 作者:行者123 更新时间:2023-12-02 16:14:31 25 4
gpt4 key购买 nike

有没有一种干净的方法可以在声明时使存储的哈希值指向同一数据结构中的另一个值?

例如,假设我有一个用于命令回调的数据结构:

my %commands = (
'a' => {
'init' => sub { return "common initializer"; },
'run' => sub { return "run a"; }
},
'b' => {
'init' => sub { return "init b"; },
'run' => sub { return "run b"; }
},
'c' => {
'init' => sub { return "common initializer"; },
'run' => sub { return "run c"; }
}
);

我知道这可以重写为:

sub common_initializer() { return "common initializer"; }

my %commands = (
'a' => {
'init' => \&common_initializer,
'run' => sub { return "run a"; }
},
'b' => {
'init' => sub { return "init b"; },
'run' => sub { return "run b"; }
},
'c' => {
'init' => \&common_initializer,
'run' => sub { return "run c"; }
}
);

这可行,但子例程不再都是匿名的。双重初始化是另一种选择:

sub get_commands($;$) {
my ($_commands, $pass) = @_;
%$_commands = (
'a' => {
'init' => sub { return "common initializer"; },
'run' => sub { return "run a"; }
},
'b' => {
'init' => sub { return "init b"; },
'run' => sub { return "run b"; }
},
'c' => {
'init' => $$_commands{'a'}{'init'},
'run' => sub { return "run c"; }
}
);
get_commands($_commands, 1) unless (defined $pass);
}

my %commands;
get_commands(\%commands);

这可行,但它相当笨拙且昂贵。我在上面的示例中使用了子例程,但我希望它适用于任何数据类型。在 Perl 中有更简洁的方法来执行此操作吗?

最佳答案

我相信使用命名子程序可能是最好的选择。例如:

sub foo { return "foo" }

my %commands ( "a" => { 'init' => \&foo } );

它很容易重复、包含,甚至允许您动态添加参数。

但您也可以使用查找表:

my %commands ( "a" => {
'init' => "foo",
'run' => "foo"
});
my %run = ( "foo" => sub { return "run foo" });
my %init = ( "foo" => sub { return "init foo" });

print "The run for 'a' is: " . $run{ $commands{a}{run} }->() . "\n";

这对我来说看起来有点复杂,但它适用于任何数据类型,正如您所要求的。

我看到您正在使用 prototypes ,例如子 foo($;$)。您应该知道这些是可选的,它们并不像大多数人所想的那样。通常你可以跳过这些,你的代码会得到改进。阅读文档。

关于Pearl:嵌套数据结构中的交叉引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67146079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com