Perl 更好的方法使用如果条件
我需要运行一个测试脚本,它有超过10个条件要验证。如果任何步骤失败,程序将失败,并且不会执行进一步的步骤。当前,我的程序是这样的:Perl 更好的方法使用如果条件,perl,if-statement,coding-style,Perl,If Statement,Coding Style,我需要运行一个测试脚本,它有超过10个条件要验证。如果任何步骤失败,程序将失败,并且不会执行进一步的步骤。当前,我的程序是这样的: boolean status = 0; status = function1(param1, param2); if (status) { status = function2(param1, param2); if(status) { status = function3(param1, param2); if(status)
boolean status = 0;
status = function1(param1, param2);
if (status) {
status = function2(param1, param2);
if(status) {
status = function3(param1, param2);
if(status) {
status = function4(param1, param2);
}
:
:
:
}
}
return status;
我对这么多嵌入的IF条款不满意。有更好的方法吗 翻译成Perl后,您可以编写:
sub testing
{
my $status;
if (($status = function1($param1, %param2)) &&
($status = function2($param1, %param2)) &&
($status = function3($param1, %param2)) &&
($status = function4($param1, %param2)))
{
# ...do whatever...
}
return $status;
}
或者,假设$status
只是一个布尔值:
sub testing
{
return 0 if !function1($param1, %param2) ||
!function2($param1, %param2) ||
!function3($param1, %param2) ||
!function4($param1, %param2);
# ...do whatever...
return 1;
}
或:
如果您确实有10个具有相同调用签名的函数,那么您甚至可以执行以下操作:
sub testing
{
my @funcs = ( &function1, &function2, &function3, &function4, &function5,
&function6, &function7, &function8, &function9, &function10,
);
for my $funcref (@funcs)
{
return 0 unless &$funcref($param1, %param2);
}
# ...do whatever...
return 1;
}
请注意,前三个备选方案将处理不同的函数调用签名,代码的布局更为混乱;最后一个几乎要求列表中的每个函数都具有相同的函数调用签名。我想再注意一个选项: 通过=正确 已通过=已通过&&cond1 已通过=已通过&&cond2 ... 如果(通过)
当其中一个函数返回一个假值时,它使用停止求值。请记住
&&
短路,这意味着在下面的语句中
func1 && func2
如果func1
的计算结果为false,则永远不会计算func2
,因为此后&
永远不会为true
这意味着您可以复制您的功能,而无需任何if
子句:
return func1 && func2 && func3 ...
另一个避免所有嵌套但与原始嵌套类似的选项:
boolean status = 0;
status = function1(param1, param2);
if (status) {
status = function2(param1, param2);
}
if (status) {
status = function3(param1, param2);
}
if (status) {
status = function4(param1, param2);
}
此样式允许轻松添加更多调用并轻松重新排序。所有信号都发生了什么?我不喜欢在
if()中有多个赋值。
。第二个例子还可以,也许在perlFair中,func()或die/return
更常见。考虑到后面的版本,我也不喜欢第一个;假设在问题中,这个值是一个布尔值,你可以避免赋值,只需测试函数的返回值,它将完成所有的步骤。从技术上讲,这不是最有效的方法。你是对的,但现代计算机担心一些测试的优化可能是在浪费人们的时间。更重要的是理解和维护程序的能力。最初的问题要求更好的方法来编写代码,我相信在某些方面,这会更好。@adiranhh你是对的。它比其他方法干净得多。我希望我能选择不止一个正确答案。
return func1 && func2 && func3 ...
boolean status = 0;
status = function1(param1, param2);
if (status) {
status = function2(param1, param2);
}
if (status) {
status = function3(param1, param2);
}
if (status) {
status = function4(param1, param2);
}