2

私は Perl の初心者で、現在、前述のエラー メッセージを理解しようとしています。

私はこのコードを手に入れました(まだ主に目的をテストするためです)

#!/usr/bin/perl

use strict;
use warnings;

my %info = (autor => "Karryanna", jazyk => "cs");

vec([%info]);

sub vec
{
  my ($hashref) = @_;
  print $hashref->autor . "\n";
}

実行しようとすると、このエラーメッセージが表示されます

Not enough arguments for vec at test.pl line 8, near "])"

ググってみたところ、サブルーチン呼び出しの前にアンパサンドを付ければ十分だと思わせるサイトを見つけました。試してみましたが、本当に助かりました。

ただし、後で別の問題に遭遇したとき、グーグルでこの SO questionにたどり着きました。ポイントは、答えが述べていることです

サブルーチンのプロトタイプを特にオーバーライドしたい場合を除き、populate(...) などの & なしでサブルーチンを呼び出す必要があります。プロトタイプが何かわからない場合は、& を使用しないでください。

Perl コンテキストでのプロトタイプとは何か、まったくわかりません。それで - 現実はどうですか?& を使用する必要がありますか、それとも他の、おそらくもっと「クリーンな」ソリューションがありますか?

ありがとう!

(ちなみに、少し OT の質問をさせていただく場合は、サブルーチンを呼び出した後に本当に定義する必要がありますか? それは私には非常に不自然に思えますが、順序を元に戻すとコンパイラが文句を言うことを既に発見しています)

4

1 に答える 1

6

vecは perl 組み込み関数です。名前の衝突 ( perldoc -f vec) が発生しています。サブルーチンを別の名前で呼び出します。

おそらく次のように呼び出したいと思うでしょう:

mysub(\%info)

Perl では、サブルーチンを宣言する前または後に呼び出すことができます。これに関する唯一の制限は、おそらくやりたくないプロトタイプを使用する場合です。順序を逆にすると、どのようなエラーが発生しますか (「コンパイラに文句を言わせる」はあまり役に立ちません)。名前の衝突が原因かもしれません。

于 2013-02-23T17:35:55.097 に答える