【发布时间】:2017-06-20 20:29:06
【问题描述】:
我想创建一个可选查询参数的哈希值,这些参数有时会传递给我的子例程。有时会传入一个名为welcome的查询参数,其值为1或0。
如果该变量存在,我想将其添加到哈希中。
我创建了一个名为 OPTIONAL_URL_PARAMS 的配置值,它是可以传入的预期参数名称列表:
use constant OPTIONAL_URL_PARAMS => ("welcome")
到目前为止我有:
my $tempParams = {};
if ( $optionalParam ) {
foreach my $param (@{&OPTIONAL_URL_PARAMS}) {
if ($optionalParam eq $self->{$param}) {
$tempParams->{$param} = $optionalParam;
$tempParams->{$param} =~ s/\s+//g; # strip whitespace
}
}
}
但这会尝试使用$self->{$param} 的值 而不是其名称。即我希望欢迎匹配 welcome,但它正在尝试匹配 1。
我知道当涉及到哈希中的键时,您可以使用 keys %hash,但是有没有办法使用常规变量来做到这一点?
编辑
我的子程序被间接调用:
my $url_handler = URL::Handler->new($param, $optionalParam);
sub new {
my $class = shift;
my $args = @_;
my $self = {
param => $args{param},
optionalParams => $args{optionalParam}
};
}
如果$optionalParam的变量名是'welcome',那么我想尝试将它映射到常量welcome。
【问题讨论】:
-
为什么
OPTIONAL_URL_PARAMS是一个函数?这应该是一个常数吗?如果是这样,那么use constant并使其成为参考。常量不能是列表。它们是标量的。所以("welcome")被强制进入标量上下文,并且由于它是一个列表,它被转换为列表中的元素数。 -
你的子程序是如何被调用的?是不是类似于
my_sub()与my_sub(welcome => 1)?如果是后者,您可以先将@_填充到哈希中。 -
$self->{$param}中有什么内容?你没有告诉我们一切。我的回答解释了1和常量的问题,但我认为这里还有一些奇怪的地方。 -
@simbabque: “常量不能是列表” 当然可以!
constantpragma 将常量实现为子例程,因此它们可以是子例程可以返回的任何内容。例如perl -E "use constant LIST => ( 'a', 'b', 'c'); say for LIST" -
@Borodin 哎呀。好的,这使我的部分答案不真实。我会编辑/
标签: perl