有一个perl脚本已经存在于其中一个模块中,我想了解/知道它的工作方式和参数的含义是如何传递的。
我试图找到在线传递的参数的描述,但我找不到任何解释它的好资源。
perl -p -i -e 's/ÿ//g' filename
请帮助理解工作流程。
答案 0 :(得分:4)
-p
意味着围绕引号中的代码使用与此类似的循环:while(<>){ ..... } continue{print}
。
-i
表示“就地编辑”,这意味着您更改的每条逻辑记录(通常是一行)都会导致文件中该行的更改。
-e
表示将后面的字符串计算为代码并执行它。由于您使用的是-p
,因此代码字符串在隐式while循环中执行,如上所述。
s///
是替换运算符。它作用于$_
的内容,除非它使用=~
绑定到其他标量。隐式“while”循环使用每次迭代的输入文件中的一条记录填充$_
(在这种情况下,每次迭代输入文件中有一行)。因此,在每一行中,每次出现在行中时,您都会用ÿ
字符替换空字符串(换句话说,删除该字符)。
您应该使用perldoc
来探索Perl关于以下主题的内置文档:
perldoc perlintro
- Perl简介。perldoc perlretut
- 关于Perl正则表达式的教程。perldoc perlre
- 对Perl正则表达式的更深入描述。perldoc perlrun
- 解释Perl的命令行开关,例如-p
,-e
等。perldoc perlop
- 对Perl运算符的解释,包括<>
和s///
。perldoc -f print
- 说明Perl print
函数的工作原理(-p
暗示)。perldoc -f defined
perldoc -f readline
perldoc perlsyn
- Perl语法的说明,包括while(){}
循环(-p
表示while循环)。如果你把所有这些放在一起,那一个班轮做了一件非常接近的事情:
BEGIN { $^I = ""; } # Set in-place edit mode.
our $oldargv = ''; # Placeholder or sentinel flag.
while (defined($_ = readline ARGV)) { # ARGV will be the currently
# opened file from commandline.
if ($ARGV ne $oldargv) {
open ARGVOUT, '>$ARGV'; # Open an output file; same name
# as input file, but ARGV still
# reads from original.
select ARGVOUT; # Output goes to ARGVOUT.
$oldargv = $ARGV; # Keep track of what filename we
# are reading from.
}
$_ =~ s/ÿ//g; # Do our work... substitute.
}
continue {
print $_; # After each iteration print the
# content of $_ to ARGVOUT.
}
END {
select STDOUT;
close ARGVOUT;
}
这是使用Perl模块B :: Deparse拼凑在一起的近似表示,以及对Perl文档的深入研究。 Perl的文档非常广泛,可以在任何标准安装Perl的系统上使用。您可以通过在命令行输入来阅读Perl的文档:perldoc perl####
其中####
表示文档名称。示例:perldoc perldata
。如果您想查找特定的Perl函数,可以使用-f
开关,如perldoc -f open
中所示。如果您想阅读Perl模块上的文档,您可以输入perldoc ModuleName
(例如perldoc Scalar::Util
)。