在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;
答案 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);
更接近你原来的想法,你可以利用这样的事实,即常量实际上是内联子,并使用来自UNIVERSAL
的can
找到原始子名称:
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);