1

次の perl/mason コマンドの違いは何ですか。

$test = $test1; $test => $test1;

具体的には、インスタンス化はここでどのように機能しますか?

4

3 に答える 3

8

メイソンは知らない人のためのPerlフレームワークです...

=Perl代入演算子です。=>は、演算子の構文糖衣です。,これは主に、キーを値に関連付けるのに役立つハッシュに使用されます。次の3つは同等です。

my %hash = ("red", "apple", "yellow", "lemon", "green", "lime");

my %hash = (red => "apple", yellow => "lemon", green => "lime");

my %hash = ("red", apple => "yellow", lemon => "green", "lime");
  • 最初はそれが単なるリストである可能性があるように見えます。私はそれがそうではないことを確認するために細心の注意を払う必要があり%hashます@hash。さらに、3つだけでなく100のキーと値のペアがある場合、キーと値のどちらであるかを見失い始める可能性があります。

  • red2つ目は、それが値のキーappleであり、それyellowがなどのキーであることを非常に明確にしlemonます。キーがPerl変数名の規則に従っている限り、キーを引用符で囲む必要がなくなったことにも注意してください(ただし、キーには引用符を含めることができます)。または前に2つのダッシュ)。

  • 三つ目はあなたの心を混乱させるためだけにあります。そして、それ=>単なる構文糖衣であり、必ずしも前に来るものと後に来るものをリンクするわけではないことを示すために。Perlにとって、これは単なるリスト区切り文字です。あなたの脳は、関連を形成するものです。

=>次のように呼ばれる関数で使用されていることがわかります。

my_function(
   -bar   => $bar_value,
   -fubar => $fu_value,
   -futz  => $futz_value,
);

myFunctionこれは、キー設定された値のセットをパラメーターとして受け取ると呼ばれる関数です。私もこれを行うことができました:

my_function("-bar", "$bar_value", "-fubar", $fu_value, "-futz", "$futz_value");

ただし、この関数は次のようなことを行います。

sub my_function {
   my %params = @_;

したがって、単なるリストではなく、パラメータにハッシュを使用しています。関数は、パラメーターの順序が非常に長いために混乱する可能性がある場合、または関数が使用する多くのパラメーターがオプションである場合に、ハッシュを使用する傾向があります。ユーザーIDとパスワードを必要とする可能性があるが、必ずしも必要ではない関数を想像してみてください。

=>カンマではなく、どのような状況でも使用できます。たとえば、Perlの最新のスタイルでは、関数の引数に括弧を使用していません。

chomp $foo;

よりクリーンです:

chomp( $foo );

ただし、関数に複数のパラメーターがある場合、これは読みにくい場合があります。

join ", ", @foo;

=>このような状況では、コマンドの代わりにを使用することがあります。

join ", " => @foo;

@fooこれで、「、」とが両方とも関数のパラメーターであることがわかりjoinます。注意してください、さもないとあなたを噛みます:

my @array = ( join ", " => @foo, @bar);

と同じです:

my @array = ( join ", ", @foo, @bar );

また

my @array = ( join (", ", @foo, @bar ) );

ではなく:

my @array = ( join (", ", @foo) , @bar);

=>私が間だけを使用したからといって、それがパラメータの一部ではないという意味では", "ありません!@foo@bar

于 2012-06-14T18:43:50.380 に答える
3

では、Perl か Mason か。Masonはわからないので、Perlについてお答えします。

« =» は代入演算子です。

$test = 'test';  # $test now contains the 4-char string "test".

« » は、左辺を自動引用する=>« » の派手なバージョンです。,以下はすべて同等です。

print "a", "b";
print "a" => "b";
print a => "b";    # Auto-quoting in effect

どちらもインスタンス化とは何の関係もありませんが、Perl は使用時にパッケージ変数を自動的にインスタンス化します。これは一般的に悪い考えであり、によって無効にされていuse strict;ます。(常に使用してuse strict; use warnings;ください!)

演算子はperlopに文書化されています。

于 2012-06-14T17:06:35.563 に答える
1

David の回答は、Perl の代入演算子=と演算子の構文糖衣に関する素晴らしい回答,です。しかし、HTML::Mason を使用している場合、=>演算子には追加の意味もあります。

Mason コンポーネントは、外部ソース (HTTP リクエスト) または内部ソース (1 つのコンポーネントが別のコンポーネントを呼び出す) からさまざまな引数を受け取ることができ、引数の名前とデータ型の宣言は<%args>ブロックを介して行われます。

<%args>
  $width
  $admin => 0  # A default value
  @items => ( 1, 2, 'something else' )
  %pairs => ( key1 => 1, key2 => 'value' )
</%args>

ここでは、=>演算子を使用してデフォルト値を指定しています。また、コンポーネントは、たとえばアンパサンド タグを使用して、引数を指定せずに別のコンポーネントを呼び出すことができます。

<& menu &>

=>または演算子を使用していくつかの引数を指定します。

<& menu, width => 640, admin => 1 &>

Mason Bookの Components の章を参照してください。

Mason2 (単に Mason と呼ばれる) では、<%args>ブロックがなくなりました。タグを使用してコンポーネントを呼び出すことはできますが、属性を宣言するには、セクション<& &>内で Moose の「has」構文を使用する必要があります。<%class>

<%class>
  has 'foo';
  has 'bar' => (required => 1);
  has 'baz' => (isa => 'Int', default => 17);
</%class>

ここでいくつかの参照: Mason::Manual::Components

于 2013-11-14T09:34:08.240 に答える