我试图把头包裹在perl周围。它与我用过的东西(主要是.Net,但是C / C ++ / php / javascript)有些不同,有些东西不是" grepping"对我来说。
我正在阅读一本有一些练习的书。其中一个练习涉及将标量强制转换为布尔--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";
我的问题是:有没有办法删除重复的参数?这样check
函数可以提取参数的名称,而不是说$def1, "def1"
?
答案 0 :(得分:7)
解决方案不是获取变量的名称;解决方案是消除变量。
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;