以下の <> で補間する値「バー」を取得する方法はいくつかあると思いますが、最もクリーンな方法は何ですか?またその理由は何ですか?
use constant FOO => 'bar';
my $msg = <<EOF;
Foo is currently <whatever goes here to expand FOO>
EOF
以下の <> で補間する値「バー」を取得する方法はいくつかあると思いますが、最もクリーンな方法は何ですか?またその理由は何ですか?
use constant FOO => 'bar';
my $msg = <<EOF;
Foo is currently <whatever goes here to expand FOO>
EOF
プラグマよりも優れた定数の仕事をする多くの CPAN モジュールの問題use constant
は、それらが標準の Perl パッケージの一部ではないということです。残念ながら、所有していない可能性のあるマシンに CPAN モジュールをダウンロードすることは非常に困難な場合があります。
したがって、use constant
Perl が標準モジュールの一部として何かを含め始めるまでReadonly
(そして RedHat や Solaris などのディストリビューションが Perl のこれらのバージョンに更新することを決定した場合にのみ) 固執することにしました。私はまだ 5.8.8 にこだわっています。本番サーバーで。)
use constant
幸いなことに、ハッカーからハッカーへと受け継がれてきた難解で神秘的な呪文を知っていれば、で定義された定数を補間することができます。
定数@{[...]}
を囲みます。これは、クラスのメソッドでも機能します。
use 5.12.0;
use constant {
FOO => "This is my value of foo",
};
my $data =<<EOT;
this is my very long
value of my variable that
also happens to contain
the value of the constant
'FOO' which has the value
of @{[FOO]}
EOT
say $data;
これは私の非常に長いです 私の変数の値 たまたま含まれている 定数の値 値を持つ「FOO」 これは私のfooの値です
say "The employee's name is @{[$employee->Name]}";
以前使用していた定数を使用する別の方法もありますuse constant
。次のようになりました。
*FOO = \"This is my value of foo";
our $FOO;
my $data =<<EOT;
this is my very long
value blah, blah, blah $FOO
EOT
say $data;
$FOO
他のスカラー値として使用でき、変更することはできません。値を変更しようとすると、次のようになります。
読み取り専用値を変更しようとしました...
またはの代わりにConst::Fastを使用します。それらは歪みなしで補間されます。定数の定義については、CPAN モジュールを参照してください。Readonly
constant
条件付きコンパイルの場合、constant が適切な選択です。これは成熟したモジュールであり、広く使用されています。
...
配列またはハッシュ定数、または不変の豊富なデータ構造が必要な場合は、Const::Fast を使用します。これは Attribute::Constant との接戦ですが、Const::Fast の方が成熟しているようで、より多くのリリースが行われています。
一方、独自のテンプレート コードを記述しているようです。しないでください。代わりに、HTML::Templateのような単純なものを使用してください:
use HTML::Template;
use constant FOO => 'bar';
my $tmpl = HTML::Template->new(scalarref => \ <<EOF
Foo is currently <TMPL_VAR VALUE>
EOF
);
$tmpl->param(VALUE => FOO);
print $tmpl->output;
「読み取り専用変数」を定数として使用することを検討しましたか?
perlcritic は重大度レベル 4 を推奨しています (デフォルトはレベル 5)。
use Readonly;
Readonly my $FOO => 'bar';
my $msg = <<"EOF";
Foo is currently <$FOO>
EOF
PS Module Const::Fast
( nodule に触発されたReadonly
) がより良い選択のようです。