对于perl中的可选参数,默认为true

时间:2013-01-10 23:51:33

标签: perl

我正在定义一个带有可选参数的方法。通常我会使用这样的东西:

sub foo {
    ($self, $optarg) = @_;
    $optarg ||= 1;
}

我希望将可选参数视为布尔值,默认值为true。这显然不适用于上述内容,因为如果未传入参数,$optarg将评估为false。

有没有办法区分传递参数的缺失和评估为false的值?

5 个答案:

答案 0 :(得分:10)

如果您使用的是Perl版本5.10或更高版本,那么您可以将$optarg ||= 1替换为$optarg //= 1,只有在$optarg时才会修改undef

或者,如果您希望允许undef作为显式假值传递,则可以说$optarg = 1 if @_ < 2

答案 1 :(得分:4)

my ( $self, $optarg ) = ( @_, 1 );

如果它“未传入”,那么它将不在列表中,您将获得1。否则,假设用户知道方法是如何工作的,他们不应该传递任何可以作为第二个参数的错误,除非它们意味着它被视为假值。 (当然,我并不是说知识渊博的用户永远不会传递布尔值的错误值。)

答案 2 :(得分:4)

这可以很好地扩展到多个可选参数:

my $self = shift;
my $optarg = @_ ? shift : 1;

这样做,但它更好地处理多个必需的参数。不幸的是,它违反了最不冗余的原则。

my ($self, $optarg) = @_;
$optarg = 1 if @_ < 2;

答案 3 :(得分:1)

my $optarg;
$optarg = 1 if not defined $optarg;

但请注意@jordanm的评论,在

下面

答案 4 :(得分: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是安全的,即使它可能看起来不是。