オプションの引数を持つメソッドを定義しています。通常、私は次のようなものを使用します:
sub foo {
($self, $optarg) = @_;
$optarg ||= 1;
}
オプションの引数をブール値として扱いたいと思います。デフォルトは ですtrue
。$optarg
引数が渡されない場合は false と評価されるため、これは明らかに上記では機能しません。
引数が渡されていないことと、false と評価される値を区別する方法はありますか?
オプションの引数を持つメソッドを定義しています。通常、私は次のようなものを使用します:
sub foo {
($self, $optarg) = @_;
$optarg ||= 1;
}
オプションの引数をブール値として扱いたいと思います。デフォルトは ですtrue
。$optarg
引数が渡されない場合は false と評価されるため、これは明らかに上記では機能しません。
引数が渡されていないことと、false と評価される値を区別する方法はありますか?
Perl バージョン 5.10 以降を使用している場合は、 に置き換えることができます$optarg ||= 1
。これは、 である場合にのみ$optarg //= 1
変更されます。$optarg
undef
undef
または、明示的な false 値として渡されることを許可する場合は、 と言うことができます$optarg = 1 if @_ < 2
。
my ( $self, $optarg ) = ( @_, 1 );
「渡されていない」場合はリストに含まれず、1
. それ以外の場合、ユーザーがメソッドの動作を知っていると仮定すると、false 値として解釈するつもりがない限り、false として解釈できるものを 2 番目の引数として渡すべきではありません。(もちろん、知識のあるユーザーがブール値に偽の値を渡さないと言っているわけではありません。)
これは、複数のオプションの引数にうまくスケーリングされます。
my $self = shift;
my $optarg = @_ ? shift : 1;
これもそうですが、複数の必要な引数をより適切に処理します。残念ながら、これは可能な限り最小限の冗長性の原則に違反しています。
my ($self, $optarg) = @_;
$optarg = 1 if @_ < 2;
良い反応をいくつかいただいたので、もう 1 つ可能なオプションを追加します。Method::Signaturesは、デフォルト値を含むシグニチャを持つメソッドの優れた構文を提供し、期待どおりに処理されます。
#!/usr/bin/env perl
package MyClass;
use Moo;
use Method::Signatures;
method foo ( $optarg = 1 ) {
print "$optarg\n";
}
package main;
my $obj = MyClass->new;
$obj->foo;
$obj->foo(0);
私はMooを使用していますが、M::S には必要ないことに注意してください。また、Moo が有効になっていることstrict
、およびこのスクリプトがstrict
安全であることにも注意してください。
my $optarg;
$optarg = 1 if not defined $optarg;
ただし、以下の@jordanmのコメントに注意してください