./test.pl和perl test.pl之间的区别

时间:2013-07-08 11:27:04

标签: linux perl

代码

#!/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之间有什么区别?

3 个答案:

答案 0 :(得分:7)

潜伏在这里有两个问题。标题问题是“./test.plperl 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; 

请参阅http://perldoc.perl.org/lib.html

答案 2 :(得分:2)

当您将其作为perl test.pl运行时,首先要做的是查看是否有以#!开头的行。如果它找到一个它试图表现就像用这些参数调用它一样。

以下添加警告

#! perl -w

如果以./test.pl运行它,您的系统实际上会使用这些参数运行它。 Perl真的没有办法知道它被隐含地调用了。所以Perl就像以前一样解析那条线。

在您的情况下,这意味着/root/Lib/将被添加到@INC两次。

它出现在清单开头的原因;是因为当使用该选项实际调用Perl时,它会在有机会加载“@INC之前添加它。” 如果在解析#!时添加了它,则它已填充@INC,因此它会在最后添加它。