3

Perl で名前付きパラメーターを使用しようとしています。http://perldesignpatterns.com/?NamedArgumentsを参照として使用しています。

理にかなっているようです。ただし、実際に送信された値を取得できないようです。

にも変更しようとしましたが$args{'name'}$args{"name"}運がありません。渡された値を取得できないようです。一体何が起こっているのかを理解するには、どの方向を見る必要がありますか?

ファイル doh.pm

package doh;
sub new ()
{
   my %args = @_;
   $name = $args{name};
   print $name;
}
1;
__END__

ファイル test.pl

use warnings;
use doh;
$trial = doh::;
$trial->new(name => "Tyson");

test.pl を実行しても出力は出力されません。

4

1 に答える 1

9

で何をしようとしているのか$trial = doh::;はわかりませんが、主な問題は、メソッド呼び出し元を処理する前に引数を処理しようとしていることです。

まず、すべての Perl ファイルを次のように開始します。

use strict;
use warnings;

はい、両方必要です。

->Perl でメソッドを呼び出す場合 (通常のサブルーチンとは対照的に)、演算子の左側のもの( invocant ) が引数リストの先頭にプッシュされます。したがって、最初にそれをリストから外す必要があります。コンストラクター メソッドの場合、通常、呼び出し元はクラス名になります。インスタンス メソッドの場合は、オブジェクト自体になります。そう

sub new {
    my $class = shift;
    my %args = @_;

    print "name is: $args{name}\n";
}

( を使いたくない場合はshift、 と書くこともできますmy ( $class, %args ) = @_;)

インスタンス メソッドの場合、規則では変数に という名前を付けます$self

サブルーチン名の後の括弧を削除したことにも注意してください。これらには OO メソッドの機能がなく、とにかく、おそらくあなたが考えていることをしません。

于 2012-10-18T19:57:08.350 に答える