9

コード

#!/usr/bin/perl -I/root/Lib/ 
use Data::Dumper;
print Dumper \@INC; 

上記のコード ファイル名は test.pl で、パーミッションは 755 です。

/usr/bin/perl test.pl を使用してプログラムを実行すると、@INC の出力の末尾に「/root/Lib」が含まれます。@INCにプッシュインするようなものです。

/usr/bin/perl test.pl 出力

$VAR1 = [
          '/etc/perl',
          '/usr/local/lib/perl/5.10.0',
          '/usr/local/share/perl/5.10.0',
          '/usr/lib/perl5',
          '/usr/share/perl5',
          '/usr/lib/perl/5.10',
          '/usr/share/perl/5.10',
          '/usr/local/lib/site_perl',
          '.',
          '/root/Lib/'
        ];

しかし、./test.pl を使用してプログラムを実行している場合、@INC の出力には "/root/Lib/" が最初に含まれ、最後にも含まれます。シフトを解除して押すようなものです。

./test.pl 出力

$VAR1 = [
          '/root/Lib/',
          '/etc/perl',
          '/usr/local/lib/perl/5.10.0',
          '/usr/local/share/perl/5.10.0',
          '/usr/lib/perl5',
          '/usr/share/perl5',
          '/usr/lib/perl/5.10',
          '/usr/share/perl/5.10',
          '/usr/local/lib/site_perl',
          '.',
          '/root/Lib/'
        ];

./test.pl と /usr/bin/perl test.pl の違いは何ですか?

4

3 に答える 3

2

として実行するとperl test.pl、最初に で始まる行があるかどうかを確認し#!ます。見つかった場合は、それらの引数で呼び出されたかのように動作しようとします。

したがって、以下は警告を追加します

#! perl -w

./test.plシステムが実際にそれらの引数でそれを実行するのと同じように実行すると。Perl には、そのように暗黙的に呼び出されたことを知る方法が実際にはありません。そのため、Perl は以前のようにその行自体を解析するだけです。

あなたの場合、それは2回/root/Lib/追加されることを意味します。@INC

リストの先頭に表示される理由。@INCこれは、Perl が実際にそのオプションで呼び出されたときに、何かをロードする前にそれを追加するということです。
解析時に追加された場合#!は、すでに入力されている@INCため、最後に追加します。

于 2013-07-15T13:38:25.693 に答える
2

use lib代わりにすべきです。そうすれば、実行は一貫しています。

#!/usr/bin/perl

use lib qw( /root/Lib/ );

use Data::Dumper;
print Dumper \@INC; 

http://perldoc.perl.org/lib.htmlを参照してください。

于 2013-07-08T14:30:16.913 に答える