1

私の問題は、この回答で言及されているものと同じです。私はコードを理解しようとしてきましたが、これが私が学んだことです:

ファイルparse_xml.cgiで失敗し、messagesreturn $message{$name}という名前のファイル(html_en ディレクトリにある) からメッセージ ( ) を取得しようとします。$messages の値は、ファイルadminprotocol-lib.plのメソッドから取得されます。GetMessageHash

sub GetMessageHash
{
   return $ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}
}

これ$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}はファイルstreamingadminserver.plで設定されます:

$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"} = $messages{"en"}

私は Perl について何も知らないので、何が問題なのかわかりません。なぜなら、私が見たもの$messages{"en"}は正しい値を持っているからです (もしそうならprint($messages{"en"}{'SunStr'}、値 "Sun" を取得します))。

しかし、私がやろうとしてもprint($ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}{'SunStr'}、何も得られません。$ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}設定されていないようです

この簡単な例を試してみましたが、うまくいきました:

$ENV{"HELLO"} = "hello";
print($ENV{"HELLO"});

正常に動作し、「こんにちは」と表示されます。

問題が何であるかについて何か考えはありますか?

4

2 に答える 2

0

HashRefのよう$messages{"en"}に見えます:キー値ストアを保持するメモリアドレスへのポインタ。関連するメモリ アドレスを出力することもできます。

perl -le 'my $hashref = {}; print $hashref;'
HASH(0x1548e78)

0x1548e78 はアドレスですが、同じ実行中のプロセス内でのみ有効です。サンプル コマンドを再実行すると、毎回異なるアドレスが取得されます。

HASH(0x1548e78)も、実際に格納された値を人間が読み取れる形式にすぎません。設定$hashref2="HASH(0x1548e78)";は実際の参照を作成せず、人間が読める文字列のコピーを作成します。

print $ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"}両方のスクリプトを使用して、この理論を簡単に証明できます。

Data::Dumperは通常、参照されたハッシュ (メモリの場所) の内容を表示するために使用されます。

use Data::Dumper;
print Dumper($messages{"en"});
# or 
print Dumper($ENV{"QTSSADMINSERVER_EN_MESSAGEHASH"});

これは、ポインター/参照が両方のスクリプトで逆参照できるかどうかも示します。

問題の解決策は、おそらく HashRef の代わりに値を渡すことです。

$ENV{"QTSSADMINSERVER_EN_SUN"} = $messages{"en"}->{SunStr};

ベスト プラクティスは、両方のキーの間に -> を使用することです。キーが単純な単語の場合、キーの " または ' 引用符もオプションです。

しかし、環境変数を介してすべてを渡すのは間違っているように感じます。OSX では参照を保持できない可能性があります (わかりません)。文字列ストレージをインクルード ファイルに抽出し、それをrequire経由でロードしたい場合があります。

Perl の詳細については、http://www.perlmaven.com/またはhttp://learn.perl.orgを参照してください。

于 2016-04-25T05:43:06.523 に答える