使用逻辑或和定义或操作符提供默认子程序变量行为

Perl子程序没有签名,所以变量必须在子程序代码中初始化并将参数赋给它们。本文介绍了两个有用的快捷方式,可以简化此过程。

逻辑或

Perl程序员使用的一个技巧是逻辑或操作符('||')为子程序参数提供默认行为。默认行为仅在参数提供为假(未定义、零或零长度字符串)时发生。想象一下,我们正在开发一个处理汽车保险报价数据的子程序 - 我们需要收集一些基本数据,例如申请人的出生日期、性别和驾驶年数。所有参数都是必需的 - 我们可以使用逻辑或操作符在这些参数为假时提前返回。

use strict;
use warnings;

sub process_quote_data {
    my $args = shift;
    my $dob = $args->{dob} || return 0;
    my $sex = $args->{sex} || return 0;
    my $years_driving = 
        defined($args->{years_driving}) ? $args->{years_driving} : return 0;

    # do stuff
}

此子程序代码所做的操作是使用shift将默认数组(@_)的第一个元素赋值给$args。默认情况下,shift将操作@_,因此无需将其作为参数包含。接下来,子程序初始化并分配$dob和$sex变量。在这两种情况下,我们使用逻辑或('||')操作符在变量为假时从子程序中提前返回。这是一个比使用if语句块更简洁的代码模式。我们不能使用此技巧来提前从$years_driving变量返回,因为它可能被提供为零,Perl将其视为逻辑假,但我们想保留它。因此,在这种情况下,我们必须首先检查参数是否已定义(这将包括零),然后使用三元运算符来分配值或提前返回。

定义或

自5.10.0版以来,Perl已经有了定义或操作符('//')。这将检查变量是否已定义,如果没有,Perl将执行操作符右侧的代码。我们可以用它来简化我们的子程序代码

use strict;
use warnings;
use 5.10.0;

sub process_quote_data {
    my $args = shift;
    my $dob = $args->{dob} || return 0;
    my $sex = $args->{sex} || return 0;
    my $years_driving = $args->{years_driving} // return 0;

    # do stuff
}

在上面的修改后的代码中,首先我们包含了一条使用Perl 5.10.0或更高版本的语句 - 这将确保执行代码的Perl版本具有定义或操作符。接下来,我们简化了$years_driving的代码以使用逻辑或操作符。现在这将接受零作为参数,但当$years_driving未定义时返回。

默认值

我们还可以使用定义或为子程序参数提供默认值。例如,如果我们假设我们子程序的所有用户都是男性,我们可以将$sex变量更改为默认为'M'。

use strict;
use warnings;
use 5.10.0;

sub process_quote_data {
    my $args = shift;
    my $dob = $args->{dob} || return 0;
    my $sex = $args->{sex} // 'M';
    my $years_driving = $args->{years_driving} // return 0;

    # do stuff
}

现在如果$sex变量未定义,process_quote_data子程序将将其值设置为'M'。

您可以在官方Perl文档的perlop部分中了解更多关于这些操作符的信息。


本文最初发布在PerlTricks.com

标签

David Farrell

David是一位专业程序员,他经常推文博客关于代码和编程艺术。

浏览他们的文章

反馈

这篇文章有什么问题吗?通过在GitHub上打开问题或拉取请求来帮助我们。