代码之家  ›  专栏  ›  技术社区  ›  CoffeeMonster

如果传入未定义的值,则使用Params::Validate设置默认值

  •  3
  • CoffeeMonster  · 技术社区  · 17 年前

    我无法让Params::Validate按我希望的方式工作。

    #!/usr/local/bin/perl -w 
    use strict;
    use Params::Validate qw/:all/;
    use Data::Dumper;
    
    sub foo {
        my %args = validate(@_, {
            bar => {
                default => 99,
                # TODO - Somehow use a callback to return a default if undefined
                # ??!!?? 
                # callbacks => { call_me => sub { return 99 if !defined shift }},
            },
        });
    
        # $args{bar} //= 99; # Don't want to define default in 2 places
    
        print Dumper(\%args);
    }
    foo({ bar => undef });
    

    那么,我如何在args列表中设置/测试一个undef,并用Params::Validate替换为所说的“default”值呢??

    1 回复  |  直到 17 年前
        1
  •  2
  •   Tanktalus    17 年前

    您需要设置$\u0]:

    call_me => sub { $_[0] = 99 if not defined $_[0] }
    

    @_对传入的参数具有别名,因此可以将其用作对原始参数的引用。

    而且

    $args{bar} ||= 99;
    

    将重置条,即使它是0或“”(空字符串),这听起来不像您想要的。使用

    $args{bar} //= 99;
    

    不过,如果您使用的是Perl5.10或更高版本,那么您可以做自己想做的事情。

    根据您关于不复制默认值的评论,我能想到的最好办法是:

    sub foo
    {
        unshift @_, bar => undef;
        my %args = validate(@_,
                            {
                                bar => {
                                    optional => 1,
                                    callbacks => {
                                        call_me => sub { $_[0] = 99 unless defined $_[0] },
                                    },
                                },
                            },
                           );
        print Dumper \%args;
    }
    

    这似乎管用,但我必须承认——这很难看。