4

だから私はPerlプログラマーの初心者です。私はそれを約1か月間使用していますが、先週かそこらでのみ、sysadminタイプのタスク以外の目的で使用しています。そうすることで、私は次の質問に遭遇しました、

Perlサブプロセスは非常に柔軟性があり、渡す引数に多くの制約を課すことはありません。引数の数を強制したり、参照やスカラーなどであるかどうかを確認したりするにはどうすればよいでしょうか。

明確にするために、私が現在Perlサブプロセスに対して行っていることは次のとおりです。

sub mySub{
    ($a, $b) = @_;
    continue and use these methods
 }

しかし、これは何$a$b保持するかについての保証を提供しません。とにかく、値が含まれていることを確認する方法はありますか?たとえば、の参照$aとのスカラーはあり$bますか?

前もって感謝します。

編集:私がスカラーと言ったとき、私は$b整数を含み、他のデータ構造への参照ではないことを意味します。

4

4 に答える 4

3

Params :: Validateモジュールを使用できます。これにより、引数リストをチェックする幅広い可能性が提供されます。

あなたの場合、

validate_pos(@_, { type => HASHREF | ARRAYREF }, { type => SCALAR })

それを行います(「ref」のタイプは1つではないことに注意してください)。パラメータが一致しない場合は終了します。

于 2012-06-08T13:39:36.900 に答える
1

サブルーチンプロトタイプを使用してこれを指定できるはずです。

完全な説明については、 http://perldoc.perl.org/perlsub.html#Prototypesを参照してください。

単一のスカラーを取るサブ

sub foo($) {
    my $scalar = shift;
}

2つのスカラーを取るサブ

sub bar($$) {
    my ($scalar1, $scalar2) = @_;
}

配列を取るサブ

sub baz (+*) {
    my $arrayref = shift;
}

ハッシュを取るサブ

sub quux (+%) {
    my $hashref = shift;
}
于 2012-06-08T15:16:39.087 に答える
0

引数に対してテストを実行して、引数に含まれている内容を確認できます。ただし、スカラーがスカラーかどうかをチェックしても意味がありません。

sub mySub{
    my ($a, $b) = @_;
    if (ref $a eq 'ARRAY') { ... } # check for array ref
    continue and use these methods
 }

などの変数$bはすでにスカラーであり、スカラー値のみを含めることができます。たとえば、参照はスカラー値です。そのため、変数に何を含めるかをより具体的にする必要があります。

引数のカウントは、配列をカウントするのと同じくらい簡単です。

sub foo {
    my $n_args = @_;  # array is scalar context returns its size
    if (@_ < 4) {     # same thing
    ...
}

たとえば、英数字の文字列を検証するには、次のようにします。

if ($arg =~ /^[\w\s]+$/) {  # contains only whitespace and alphanumerics
于 2012-06-08T13:45:04.250 に答える
0

$a が参照であるかどうかを確認するには、使用できます

if(ref($a)) 

参照の種類を確認するには、使用できます

if (ref($a) eq "HASH") { #or ARRAY

于 2012-06-08T13:38:08.747 に答える