码
#!/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.pl
和perl 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;