我有一个perl子例程,我希望将参数作为哈希传递(目的是根据参数'iconsize'包含一个css).
我正在使用电话:
get_function_bar_begin('iconsize' => '32');
Run Code Online (Sandbox Code Playgroud)
对于子程序get_function_bar_begin:
use strict;
...
sub get_function_bar_begin
{
my $self = shift;
my %template_params = %{ shift || {} };
return $self->render_template('global/bars /tmpl_incl_function_bar_begin.html',%template_params);
}
Run Code Online (Sandbox Code Playgroud)
为什么会产生错误消息:
执行运行模式'start'时出错:undef error - 无法使用字符串("iconsize")作为HASH参考,而在334行CheckBar.pm使用"strict refs"时
我在这里做错了吗?还有其他方法可以将我的数据('iconsize')作为哈希提交吗?
(我还是Perl的新手)
编辑:解决方案对我有用.我没有改变电话,但是我的功能:
sub get_function_bar_begin
{
my $self = shift;
my $paramref = shift;
my %params = (ref($paramref) eq 'HASH') ? %$paramref : ();
my $iconsize = $params{'iconsize'} || '';
return $self->render_template('global/bars/tmpl_incl_function_bar_begin.html',
{
'iconsize' => $iconsize,
}
);
}
Run Code Online (Sandbox Code Playgroud)
fri*_*edo 12
您正在%{ }参数列表的第一个参数上使用hash-dereferencing运算符().但是这个参数不是哈希引用,它只是字符串'iconsize'.您可以通过以下两种方式之一做您想做的事:
传递匿名哈希引用:
get_function_bar_begin( { 'iconsize' => '32' } );
Run Code Online (Sandbox Code Playgroud)
或者继续传递正常列表,就像现在一样,并相应地更改您的功能:
sub get_function_bar_begin {
my $self = shift;
my %template_params = @_;
}
Run Code Online (Sandbox Code Playgroud)
请注意,在此版本中,我们只是将参数列表直接分配给哈希(在提取之后$self).这是有效的,因为对列表name => value只是普通列表的语法糖.
我更喜欢第二种方法,因为没有特别好的理由构造匿名hashref,然后立即取消引用它.
在这篇文章中还有一些关于它如何工作的好信息:面向对象的Perl构造函数语法.
您strict refs试图将字符串iconsize用作哈希引用而违反.
我想你只想要:
my( $self, %template_params ) = @_;
Run Code Online (Sandbox Code Playgroud)
第一个参数将进入$self,其余参数通过从其余部分中获取项目对来创建哈希@_.