Perl函数:获取" name"传入参数

时间:2015-04-20 15:11:33

标签: perl

我试图把头包裹在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"

1 个答案:

答案 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;