Perl函数:获取传入参数的"名称"

Wer*_*rCD -1 perl

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

ike*_*ami 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;
Run Code Online (Sandbox Code Playgroud)