使用逻辑或和定义或操作符提供默认子程序变量行为
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。
标签
反馈
这篇文章有什么问题吗?通过在GitHub上打开问题或拉取请求来帮助我们。