10

以下の <> で補間する値「バー」を取得する方法はいくつかあると思いますが、最もクリーンな方法は何ですか?またその理由は何ですか?

use constant FOO => 'bar';

my $msg = <<EOF;
Foo is currently <whatever goes here to expand FOO>
EOF
4

5 に答える 5

9

プラグマよりも優れた定数の仕事をする多くの CPAN モジュールの問題use constantは、それらが標準の Perl パッケージの一部ではないということです。残念ながら、所有していない可能性のあるマシンに CPAN モジュールをダウンロードすることは非常に困難な場合があります。

したがって、use constantPerl が標準モジュールの一部として何かを含め始めるまで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他のスカラー値として使用でき、変更することはできません。値を変更しようとすると、次のようになります。

読み取り専用値を変更しようとしました...

于 2013-04-03T21:38:49.793 に答える
4

またはの代わりにConst::Fastを使用します。それらは歪みなしで補間されます。定数の定義については、CPAN モジュールを参照してください。Readonlyconstant

条件付きコンパイルの場合、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;
于 2013-04-03T19:29:51.173 に答える
3

「読み取り専用変数」を定数として使用することを検討しましたか?
perlcritic は重大度レベル 4 を推奨しています (デフォルトはレベル 5)。

use Readonly;
Readonly my $FOO => 'bar';

my $msg = <<"EOF";
Foo is currently <$FOO>
EOF

PS Module Const::Fast( nodule に触発されたReadonly) がより良い選択のようです。

于 2013-04-03T17:13:11.127 に答える