1

在 Perl 中,是否可以将常量传递给函数,然后按字面显示常量的名称以及使用它的值?也许通过将某种转义的常量名称传递给函数?

这是我想做的一个例子,当然 exitError() 中的代码并没有做我想做的事情。

use constant MAIL_SEND_FAILED => 1;

# exitError($exitcode)
sub exitError
{
    my $exitCode = $_[0];
    say "error, exitcode: $exitCode"; # output constant name as human readable exitcode, e.g. MAIL_SEND_FAILED
    exit $exitCode; # use value of exitcode, e.g. 1
}

exitError(MAIL_SEND_FAILED);
# function call should effectively execute this code
# say "error, exitcode: MAIL_SEND_FAILED";
# exit 1;
4

3 回答 3

3

不完全是您想要的方式,但是为了同样的效果,您可以使用 Perl 的能力来使用 from 将不同的字符串和数字表示存储在单个标量dualvarScalar::Util

use strict;
use warnings;
use feature 'say';
use Scalar::Util qw(dualvar);

use constant MAIL_SEND_FAILED => dualvar 1, 'MAIL_SEND_FAILED';

sub exitError
{
    my $exitCode = $_[0];
    say "error, exitcode: $exitCode"; # output constant name as human readable exitcode, e.g. MAIL_SEND_FAILED
    exit $exitCode; # use value of exitcode, e.g. 1
}

exitError(MAIL_SEND_FAILED);

更接近您最初的想法,您可以利用常量实际上是内联 subs 的事实,并通过canfrom的名称找到原始 sub UNIVERSAL

use strict;
use warnings;
use feature 'say';
use Scalar::Util qw(dualvar);

use constant MAIL_SEND_FAILED => 2;

sub exitError
{
    my $exitCode = $_[0];
    say "error, exitcode: $exitCode"; # output constant name as human readable exitcode, e.g. MAIL_SEND_FAILED
    exit __PACKAGE__->can($exitCode)->(); # use value of exitcode, e.g. 1
}

exitError('MAIL_SEND_FAILED');

但是,IIRC Perl 不保证常量总是以这种方式生成,所以这可能会在以后中断。

于 2012-09-25T11:14:02.997 回答
2

如果您想使用某物的名称及其值,那么您正在寻找哈希值。你甚至可能有一个带有Readonly的常量散列。

于 2012-09-25T17:50:29.640 回答
0
use constant MAIL_SEND_FAILED => 1;

sub exitError
{
   my %data = @_;
   # Keys are names and values are values....
}

exitError(MAIL_SEND_FAILED => MAIL_SEND_FAILED);
于 2012-09-26T07:48:38.607 回答