10

我用谷歌搜索#!/usr/bin/perl,但找不到任何令人满意的答案。我知道这是一个非常基本的事情,但是,仍然可以解释我#!/usr/bin/perl在 Perl 中的意义是什么?此外,在 中-w-T表示#!/usr/bin/perl什么?我是 Perl 的新手,所以请耐心等待。

4

4 回答 4

17

这 #!通常称为“ shebang ”,它告诉计算机如何运行脚本。您还会看到很多带有#!/bin/shor的 shell 脚本#!/bin/bash

那么,/usr/bin/perl是您的 Perl 解释器,它运行并给出要执行的文件。

该行的其余部分是 Perl 的选项。“ -T”是污点(这意味着输入被标记为“不可信”,直到你检查它的格式)。“-w”打开警告。

您可以通过运行perldoc perlrun了解更多信息(perldoc 是 Perl 的文档阅读器,可能已安装,可能在它自己的包中)。

对于您编写的脚本,我建议您从以下内容开始:

#!/usr/bin/perl
use warnings;
use strict;

这会打开大量警告和额外检查 - 在您学习时尤其有用(我仍在学习,我已经使用 Perl 超过 10 年了)。

于 2012-06-29T06:27:09.143 回答
6

两者-w-T都是“万无一失”的标志。

-w与代码中的语句相同,use warning在许多编译器中它相当于警告选项。一个最简单的例子是关于使用未初始化变量的警告:

#!/usr/bin/perl -w
print "$A\n";
print "Hello, world!\n";

将打印:

Name "main::A" used only once: possible typo at ./perl-warnings line 3.
Use of uninitialized value $A in concatenation (.) or string at
./perl-warnings line 3.

Hello, world!

-T标志表示任何来自外部世界的值(与在程序内部计算相反)都被视为潜在威胁,并且不允许在与系统相关的操作中使用这些值,例如写入文件、执行系统命令等。(这就是当脚本在 setuid/setgid 下运行时 Perl 会激活“污点”模式的原因。)

“污染”模式是“强制”您仔细检查脚本中的值。

例如,代码:

#!/usr/bin/perl -T
$A = shift;
open FILE, ">$A";
print "$A\n";
close FILE;

会产生致命错误(终止程序):

$ ./perl-tainted jkjk
Insecure dependency in open while running with -T switch at
./perl-tainted line 3.

那只是因为参数值来自“外部”而不是“双重检查”。“污点”模式正在引起您对这一事实的注意。当然,它很容易被骗,例如:

#!/usr/bin/perl -T
$A = shift;
$A = $1 if $A =~ /(^.*$)/;
open FILE, ">$A";
print "$A\n";
close FILE;

在这种情况下,一切正常。你“愚弄”了“污点模式”。好吧,假设是程序员的意图是使程序更安全,因此程序员不会只是解决错误,而是会采取一些安全措施。Perl 的绰号之一是“系统管理员的粘合剂和胶带”。系统管理员不太可能会根据自己的需要创建 Perl 脚本并使用root权限运行它。想想这个脚本做了一些普通用户不允许做的事情……你可能想仔细检查那些不属于程序本身的事情,并且你希望 Perl 提醒你这些事情。

希望能帮助到你。

于 2012-06-29T07:01:57.477 回答
3

它被称为shebang。在基于 Unix 的系统(OSX、Linux 等)上,该行指示从命令行运行脚本时语言解释器的路径。对于 perl /usr/bin/perl 是 perl 解释器的路径。如果省略了 hashbang,*nix 系统将不知道在作为可执行文件调用时如何解析脚本。相反,它将尝试在用户碰巧正在运行的任何 shell(可能是 bash)中解释脚本并破坏脚本。

http://en.wikipedia.org/wiki/Hashbang

-W 和 -T 是控制 perl 解释器操作方式的参数。它们与直接从命令行调用 perl 解释器时可以调用的参数相同。

  • -W 显示警告(也就是调试信息)。
  • -T 打开污点/安全检查。
于 2012-06-29T06:29:04.870 回答
3

关于污点模式(-T):当污点模式打开时
requireuse语句会发生变化。 加载库/模块的路径不再包含其路径中的(当前目录)。
.

因此,如果您在未明确指定路径的情况下加载与当前工作目录相关的任何库或模块,您的脚本将在污染模式下中断。

例如:考虑perl_taint_ex.pl

#!/usr/bin/perl -T

require "abc.pl";
print "Done";

会像这样失败

D:\perlex>perl perl_taint_ex.pl
"-T" is on the #! line, it must also be used on the command line 
at perl_taint_ex.pl line 1. 

D:\perlex>perl -T perl_taint_ex.pl
Can't locate abc.pl in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib)
 at perl_taint_ex.pl line 3. 

因此,当污点模式打开时,您必须明确告诉 require 语句在哪里加载库,因为.在污点模式期间从@INC数组中删除。

@INC包含从中读取库文件和模块的有效路径列表。

如果污点模式打开,您只需执行以下操作:

D:\perlex>perl -ID:\perlex -T perl_taint_ex.pl
Done

-ID:\perlex将包括目录 D:\perlex@INC

您可以尝试其他添加路径的方法@INC,这只是一个示例。

于 2012-06-29T08:59:05.060 回答