【发布时间】:2018-07-12 16:14:43
【问题描述】:
我如何知道哪个别名被用来调用别名子程序? caller 给出了原始的sub-name,但我希望看到调用时使用的名称。
例子:
use 5.010;
sub x_y_z {
return ( caller(0) )[3];
}
*foo_bar_baz = \&x_y_z;
say x_y_z(); # x_y_z
say foo_bar_baz(); # x_y_z, but need foo_bar_baz
编辑以解决 XY 问题
我添加了另一个例子来展示我更深层次的意图。我想创建调度表来路由一些任务:
my $dispatch = {
x => {
y => {
z => sub {
&x_y_z;
},
}
},
a => {
b => {
c => {
d => sub {
&a_b_c_d;
},
}
}
}
}
sub foo {
my @arg = ( split '_', ( split( '::', ( caller(0) )[3] ) )[1] );
return @arg;
}
*x_y_z = \&foo;
*a_b_c_d = \&foo;
如您所想,这棵树可能会长得很大。现在调度树中的许多叶子需要基本相同的子,它们的不同之处只是它们被称为(命名)的方式,我希望只有一个子并为特定任务取别名。
【问题讨论】:
-
似乎是 XY 问题。您正在处理的更大的问题是什么?
-
@mob 编辑问题以解决 XY 问题
-
如果您需要知道使用了哪个别名,那么您不应该使用别名。您需要为子例程添加一个参数,以传达您希望在使用的子例程别名中传递的信息。
-
好的,但是你还没有解释为什么你需要能够区分。这应该是两个不同的子例程或带有参数的同一个子例程,例如
foo('x_y_z')和foo('a_b_c_d') -
“调用别名子问题很有趣” 不,这是一个误解。您正在尝试使用别名的名称作为附加参数,并且您的评论清楚地表明这一切已经发生,因为您试图通过调用
&a_b_c_d来传递 @ 的当前内容来“聪明” 987654328@。不要那样做:改为编写清晰的代码。我很惊讶你没有使用goto &abcd来搞乱调用框架。
标签: perl