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

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

潜伏在这里有两个问题。 标题的问题是“ ./test.plperl test.pl之间有什么区别?”,而第二个问题是“为什么当脚本运行为./test.pl时,为什么/root/Lib添加在@INC的前面./test.pl而不是当作为perl test.pl运行?

一个不一定适用于你的情况的答案是./test.pl运行由shebang( /usr/bin/perl )指定的Perl解释器,而perl test.pl运行在你的$PATH找到的任何Perl解释器(或别名或功能)。 这些不需要是相同版本的Perl。 对我而言,他们很少是Perl的相同版本; /usr/bin中的那个通常比较老,我的$PATH中的那个是比较新的(比如5.8.x和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确实出现),所以Perl增加/root/Lib一次,因为内核提供了显式的-I ,然后再添加另一个,因为它解析了shebang行。

请参阅: perldoc perlrun了解更多详情。

当你将它作为perl test.pl运行时,它首先要查看是否有以#!开头的行#! 。 如果它发现一个,它会试图像这个参数一样被调用。

所以下面添加警告

 #! perl -w 

如果你运行它为./test.pl你的系统实际上运行它与这些参数。 Perl真的没有办法知道它被隐式地称为那样。 所以Perl只是像以前一样解析这条线。

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

它出现在名单的开头的原因; 当Perl实际上是用这个选项调用的时候,它会在它有机会加载任何东西的@INC之前添加它。
如果在解析#!时被添加了#! ,它已经填充@INC所以它在最后添加它。

你应该use lib而不是。 这样,执行是一致的。

 #!/usr/bin/perl use lib qw( /root/Lib/ ); use Data::Dumper; print Dumper \@INC; 

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