14

以下のサンプル コードによると、サブルーチンを呼び出すには と の 2 つのスタイルがありsubnameますsubname()

#!C:\Perl\bin\perl.exe
use strict;
use warnings;

use 5.010;

&marine(); # style 1
&marine; # style 2

sub marine {
    state $n = 0; # private, persistent variable $n
    $n += 1;
    print "Hello, sailor number $n!\n";
}

呼び出しに引数がない場合、どちらがより適切な選択&marine();ですか?&marine;

4

5 に答える 5

23

この例の元となったLearning Perlでは、サブルーチンを紹介する最初の段階にいます。&Perl の初心者として、Perl のビルトインと同じ名前のサブルーチンを定義して、なぜそれが機能しないのか不思議に思うという問題に遭遇しないように、を使用するように指示するだけです。in front は常に、&定義したサブルーチンを呼び出します。log初心者の学生は、自分が使用する他のテクノロジでそれを行うことに慣れているため、メッセージを出力するための独自のサブルーチンを作成することがよくあります。Perl では、組み込みの数学関数です。

Perl の使用に慣れ、Perl ビルトイン ( perlfuncをスキャン) について理解したら、&. ほとんど必要のない特別な魔法が&あります。

 marine();

()サブルーチンを事前に宣言している場合は省略できますが、通常、引数()リストが空の場合でも省略できます。marineがサブルーチン名であるというヒントを Perl に与えているので、もう少し堅牢です。私には、サブルーチンとしてより迅速に認識されます。

于 2010-01-13T13:55:09.357 に答える
15

括弧なしで使用することの副作用は&、サブルーチンが で呼び出されること@_です。このプログラム

sub g {
  print "g: @_\n";
}
sub f {
  &g();   # g()
  &g;     # g(@_)
  g();    # g()
  g;      # g()
}
f(1,2,3);

次の出力が生成されます。

g:
g: 1 2 3
g:
g:
于 2010-01-13T15:37:57.307 に答える
7

sub最初にキーワードでサブルーチンを宣言してから呼び出すのが良いスタイルです。(もちろん、それを回避する方法はありますが、必要以上に複雑にする必要があるのはなぜですか?)

プロトタイプで宣言されたサブルーチンに対して&正確に何をするかを理解していない限り、構文を使用しないでください。@_それはひどくあいまいで、めったに必要とされず、意図しない動作によるバグの原因となります。そのままにしておいてください - Perl::Criticはそれについて適切に言っています:

Perl 5 以降、サブルーチンを呼び出すときのアンパサンド シジルは完全にオプションです。

さて、これらのスタイルのヒントに従うと、スタイル 1 でパラメーターを必要としないサブルーチン、つまりmarine();. 理由は

  1. パラメータを必要とするサブルーチンとの視覚的な一貫性
  2. 別のキーワードと混同することはできません。
于 2010-01-13T13:55:37.390 に答える
4

原則として、次のことをお勧めします。

  1. 組み込み関数をオーバーライドするか、パラメーター リストがないために & が必要な場合を除き、省略してください。

  2. Marine() のように () を常に含めます。

コードを読みやすくするために、これらの両方を行います。最初のルールは、Perl の内部関数を区別してオーバーライドする場合を明確にします。2 つ目は、いつ関数を呼び出しているかを明確にします。

于 2010-01-13T15:19:31.557 に答える
1

perl では、関数呼び出しで括弧を省略できます。
したがって、2 つの異なる方法で引数を指定して関数を呼び出すことができます。
your_function( arg1,arg2,arg3);
または
your function arg1,arg2,arg3 ;
、どちらの形式を好むかは選択の問題です。C のバックグラウンドを持つユーザーにとっては、前者の方がより直感的です。
私は個人的に前者を私が定義した関数に使用し、後者は次のような組み込み関数に使用します。

print "something"それ以外のprint("something")

于 2010-01-13T14:05:34.180 に答える