5

Win32::OLE と MS Word を使ったプログラミングを理解するために、 Perl Monksで古い Perl コードを調べています。$MS::Wordなどのような名前の変数がコード全体に散らばっていますが、宣言には「 my 」が含まれていません。Google で少し読んだ後、これらはmyを使用して宣言された「レキシカル変数」に対して「パッケージ変数」と呼ばれることを理解しました。

私の最初の質問は、「パッケージ変数は何に適していますか?」'。レキシカル変数が何であるかは理解していますが、パッケージ変数の目的や、それらの使用方法がレキシカルとどのように異なるかは理解していません。'

4

3 に答える 3

9

Coping with Scoping by MJDを読む必要があります。

perldoc perlmodも参考になるでしょう。

コードはこの世のものではありません。作者が $author::email をクールだと考えているように見えるというだけで、世界中で何の心配もなく、あらゆる種類の名前空間を踏みにじっています。

より良い方法は、ハッシュを使用することでした:

my %author = (
   email => 'author@example.com',
   ...
);

シンボル テーブル全体を踏みにじる必要はありません。

私はいくつかのWin32::OLE例を持っています: http://www.unur.com/comp/これらは芸術作品ではありませんが、このスタイルの改善であると信じています. Perl と Word VBA で Word 文書のページ数が異なるのはなぜですか?も参照してください。

私は少し怒鳴るつもりです

@pgm::runtime_args = @ARGV ;

そのため、名前空間@ARGVを踏みにじるために標準配列をあきらめます。pgmそれだけでなく、すべての Perl プログラマーは何が何で@ARGVあるかを知っています。いずれにせよ、@pgm::runtime_argsスクリプトで再び使用されることはありません。

$pgm::maxargs = $#pgm::runtime_args + 1 ;

もちろん@pgm::runtime_args、スカラー コンテキストでは、その配列の要素数がわかります。なぜ必要なのかはわかり$pgm::maxargsませんが、必要な場合、この行は次のようになります。

$pgm::maxargs = @pgm::runtime_args;

これ以上引用するつもりはありません。これは、Cobol プログラマーが Perl を書こうとしたときに起こることだと思います。

$program::copyright = "Copyright (c) 02002 - Kenneth Tomiak : All rights reserved.";

彼が年に 5 桁を割り当ててくれてうれしいです。絶対にわからない!

PS: 私の抜粋はフェアユースにあたると思います。

于 2009-06-19T19:31:57.417 に答える
5

パッケージ変数はグローバル変数です。それらは、プログラム全体 (他のモジュールも含む) のどこにでも表示されます。そのレベルの可視性および/または外部の影響が必要な場合、または必要な場合に役立ちます。たとえば、Text::Wrap モジュールはそれらを使用して、テキストを折り返す列数の単一の構成ポイントを許可します。さらに、パッケージ変数を使用すると、「動的スコープ」と呼ばれるものを使用できますが、これはやや高度でやや難解な概念です。

2 番目の質問については、Perl での my と our の違いは何ですか?を参照してください。

于 2009-06-19T19:25:53.390 に答える