我正试着把头包裹在perl周围.它与我使用的不同(主要是.Net,但是C/C++/php/javascript),有些事情对我来说并不是"贪图".
我正在写一本有一些练习的书.其中一个练习涉及将标量强制转换为布尔 - Undef和Zeros = false,其他= true.
提出问题,一些以前的代码示例和希望从重复代码中提取函数...我正坐在这个函数中:
# Which of the following evaluates to true?
use strict;
use warnings;
use diagnostics;
sub check1 {
my @args = @_;
if ($args[0]) {
return "true";
} else {
return "false";
}
}
sub check2 {
my @args = @_;
if ($args[0]) {
print "$args[1] = true\n";
} else {
print "$args[1] = false\n";
}
}
# false (zero or undef)
my $def1 = undef; check2($def1, 'def1');
my $def3 = 0.0; check2($def3, 'def3');
my $def5 = 0; check2($def5, 'def5');
# true (not zero and not undef)
my $def2 = ' '; check2($def2, 'def2');
my $def4 = '0.0'; check2($def4, 'def4');
my $def6 = 'false';check2($def6, 'def6');
my $def7 = 1/0; check2($def7, 'def7');
#as suggested by TheSuitIsBlackNot
my $foo = 0.0; print '$foo = ', check1($foo), "\n";
Run Code Online (Sandbox Code Playgroud)
我的问题是:有没有办法删除重复参数?这样check函数可以拉出参数的名称而不是说$def1, "def1"?
解决方案不是获取变量的名称; 解决方案是消除变量.
sub check {
my ($name, $value, $expected) = @_;
my $got = $value ? 'true' : 'false';
print("$name is $got. Expected $expected.\n");
}
my @tests = (
[ 'def1', undef, 'false' ],
[ 'def3', 0.0, 'false' ],
[ 'def5', 0, 'false' ],
[ 'def2', ' ', 'true' ],
[ 'def4', '0.0', 'true' ],
[ 'def6', 'false', 'true' ],
);
check(@$_) for @tests;
Run Code Online (Sandbox Code Playgroud)