0

私はPerlの専門家ではなく、Perlのすべてのスコープルールがどのように機能するかを完全には理解していません。$ ENV {'whatever'}環境変数を設定してから、別のソース.plファイルで関数を呼び出し、そのENVエントリを読み取ろうとすると、何も返されません。ドキュメントによると、ENVは現在のプロセスと分岐した子に対して存続しますが、%ENV変数へのアクセスは他のソースファイルで利用できますか?

ソースファイルは、「require」コマンドを介してインクルードされました。それは正しい方法ですか、それともソースファイルが必要なときに変数を利用できるようにする方法について静的な(初めての)何かがありますか?

4

2 に答える 2

4

%ENVはグローバルであるため、プロセスにロードされたすべてのソース ファイルのどこからでもアクセスできます。

%ENV新しいプロセスが で作成されたときに継承forkれますが、新しいプロセスは独自のコピーを取得するため、一方に加えられた変更は他方には表示されません。

doまたはrequireまたはを使用して他のソース ファイルをロードしている場合use、同じプロセスにロードされ、同じ%ENV.

ただし、新しいスクリプトをsystemまたはでロードexecしている場合、新しいスクリプトは新しいプロセスでロードされ、独自の のコピーが取得されます%ENV

于 2012-05-08T20:00:47.593 に答える
1

からperldoc perlvar:

%ENV

ハッシュ%ENVには現在の環境が含まれています。ENV に値を設定すると、その後 fork()オフにする子プロセスの環境が変更されます。


require.pl ファイルを -ing することは、コマンドを fork することと同じではありません。

Bash ラッパーを介して必要な環境変数を設定する方が簡単です。

$ cat wrapper.sh
#!/bin/bash

export whatever="/usr/bin/some_dir/";  # Set to env

perl script.pl;                        # Invoke the script

$ cat script.pl
#!/usr/bin/perl

print $ENV{whatever};                  # wrapper.sh : "/usr/bin/some_dir/"
                                       # script.pl  : ""
于 2012-05-08T20:08:50.263 に答える