访问常量的名称,不仅仅是它的值?

时间:2012-09-25 11:03:08

标签: perl constants

在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;

3 个答案:

答案 0 :(得分:2)

不完全按照你想要的方式,但是为了达到同样的效果,你可以使用Perl在Scalar::Util中使用dualvar在单个标量中存储不同字符串和数字表示的能力:

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);

更接近你原来的想法,你可以利用这样的事实,即常量实际上是内联子,并使用来自UNIVERSALcan找到原始子名称:

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并不保证常量会以这种方式生成,因此可能会在以后生效。

答案 1 :(得分:2)

如果你想使用某些东西的名称及其值,那么哈希就是你要找的东西。您甚至可能使用Readonly进行常量哈希。

答案 2 :(得分: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);