代码
#!/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 /”首先包含,也包含end。这就像不移动和推动。
./ 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之间有什么区别?
答案 0 :(得分:7)
潜伏在这里有两个问题。标题问题是“./test.pl
和perl test.pl
之间有什么区别?”,而次要问题是“为什么/root/Lib
在@INC
的前面添加了脚本是以./test.pl
运行,而不是以perl test.pl
运行?“
答案,不一定适用于您的情况,是./test.pl
运行shebang(/usr/bin/perl
)指定的Perl解释器,而perl test.pl
运行任何Perl解释器首先找到你的$PATH
(或别名或功能)。这些不一定是Perl的相同版本。对我来说,它们很少是Perl的相同版本; /usr/bin
中的那个通常比较旧,$PATH
上的那个相对较新(例如,5.8.x vs 5.18.x)。
在我的机器上使用/usr/bin
的Perl 5.12.4(哎哟;那是旧的),并使用您的脚本,我看到:
$ perl test.pl
$VAR1 = [
'/root/Lib/',
'/Library/Perl/5.12/darwin-thread-multi-2level',
'/Library/Perl/5.12',
'/Network/Library/Perl/5.12/darwin-thread-multi-2level',
'/Network/Library/Perl/5.12',
'/Library/Perl/Updates/5.12.4',
'/System/Library/Perl/5.12/darwin-thread-multi-2level',
'/System/Library/Perl/5.12',
'/System/Library/Perl/Extras/5.12/darwin-thread-multi-2level',
'/System/Library/Perl/Extras/5.12',
'.'
];
$ ./test.pl
$VAR1 = [
'/root/Lib/',
'/root/Lib/',
'/Library/Perl/5.12/darwin-thread-multi-2level',
'/Library/Perl/5.12',
'/Network/Library/Perl/5.12/darwin-thread-multi-2level',
'/Network/Library/Perl/5.12',
'/Library/Perl/Updates/5.12.4',
'/System/Library/Perl/5.12/darwin-thread-multi-2level',
'/System/Library/Perl/5.12',
'/System/Library/Perl/Extras/5.12/darwin-thread-multi-2level',
'/System/Library/Perl/Extras/5.12',
'.'
];
$
请注意,/root/Lib
名称会在@INC
添加一次或两次。我最好的猜测是,当你使用perl test.pl
时,Perl会扫描shebang并添加-I
选项。当您使用./test.pl
时,内核运行/usr/bin/perl -I/root/Lib test.pl
(我们可以协商命令行上是否出现名称test.pl
;关键点是-I/root/Lib
确实出现),因为内核提供的显式/root/Lib
,Perl会添加-I
一次,然后添加另一个因为它解析了shebang行。
有关详细信息,请参阅:perldoc perlrun
。
答案 1 :(得分:2)
您应该use lib
。这样,执行就是一致的。
#!/usr/bin/perl
use lib qw( /root/Lib/ );
use Data::Dumper;
print Dumper \@INC;
答案 2 :(得分:2)