gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:12:30 28 4
gpt4 key购买 nike

代码

#!/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/”,也包含 first 和 end。这就像 unshift 和 push。

./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 有什么区别?”,而次要问题是“为什么 /root/当脚本作为 ./test.pl 运行时而不是作为 perl test.pl< 运行时,在 @INC 的前面添加了 Lib/?"

一个不一定适用于您的情况的答案是 ./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了解更多详情。

关于linux - ./test.pl 和 perl test.pl 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17525479/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com