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 を使用して異なる文字列と数値表現を単一のスカラーに格納できdualvarますScalar::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);

can元のアイデアに近づくと、定数が実際にはインライン サブサブであるという事実を利用して、 fromを使用して名前で元のサブを見つけることができます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 に答える