4

パラメータをハッシュとして渡したい perl サブルーチンがあります (目的は、パラメータ 'iconsize' に応じて css を含めることです)。

私は呼び出しを使用しています:

get_function_bar_begin('iconsize' => '32');

サブルーチン 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);
}

これによりエラー メッセージが表示されるのはなぜですか。

実行モード 'start' の実行中にエラーが発生しました: undef エラー - CheckBar.pm の行 334 で「strict refs」が使用されている間、文字列 (「iconsize」) を HASH ref として使用できません

私はここで何か間違っていますか?データ ('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,
        }
    );
}
4

4 に答える 4

12

%{ }パラメータ リストの最初の引数でハッシュ逆参照演算子 ( ) を使用しています。しかし、その引数はハッシュ参照ではなく、単なる string'iconsize'です。次の 2 つの方法のいずれかで、必要なことを行うことができます。

匿名のハッシュ リファレンスを渡します。

get_function_bar_begin( { 'iconsize' => '32' } );

または、現在のように通常のリストを渡し続け、それに応じて関数を変更します。

sub get_function_bar_begin {
    my $self = shift;
    my %template_params = @_;
}

このバージョンでは、( を抽出した後に) 引数リストを直接ハッシュに割り当てるだけであることに注意してください$self。これが機能するのは、name => valueペアのリストが通常のリストのシンタックス シュガーにすぎないためです。

私は 2 番目の方法を好みます。匿名の hashref を作成してすぐに逆参照する特に正当な理由はないからです。

この記事にも、これがどのように機能するかについての良い情報があります: Object-Oriented Perl constructor syntax .

于 2010-05-26T14:42:10.370 に答える
6

strict refs文字列iconsizeをハッシュ参照として使用しようとして違反しています。

私はあなたがただ欲しいと思う:

my( $self, %template_params ) = @_;

最初の引数が入り$self、残りは の残りから項目のペアを取得してハッシュを作成します@_

于 2010-05-26T14:39:20.617 に答える
4

パラメータをリストとしてハッシュを渡す

@_の代わりに変数を使用する必要がありますshift。このような:

my %template_params = @_; ## convert key => value pairs into hash

ハッシュと perl のハッシュへの参照には違いがあります。次に'iconsize' => '32'、パラメーターとして this meansリストを perl に渡します。これは、 hashとして解釈できます。

パラメータ付きのハッシュをハッシュ参照として渡す

しかし、%{ shift || {} }perl を試すときは、2 番目のパラメーターがハッシュ参照であると想定します。この場合、次の方法で修正できます。

get_function_bar_begin({ 'iconsize' => '32' }); ## make anonymous hash for params
于 2010-05-26T14:39:49.117 に答える
1

問題は次の行です。

get_function_bar_begin('iconsize' => '32');

これは、あなたが考えているようにハッシュ参照を渡すのではなく、呼び出し先にリストとして表示されるハッシュを渡します。そのため、リスト全体ではなく%{ shift }、キーのみをシフトしています。'iconsize'実際の解決策は、関数の 2 行目をより単純にすることです。

my %template_params = @_;
于 2010-05-26T14:41:13.343 に答える