这个perl脚本片段在做什么?

时间:2018-07-10 14:39:32

标签: regex perl

我一直在这里寻找有关如何解码正在发生的事情的资源。我发现了几个Perl“备忘单”,但是在查找标志定义时遇到了麻烦。我已经注释了我想知道的内容,如果我记错了,请更正。

我知道“ $ parm =〜s /”使'$ parm'的值等于替换正则表达式的收益。除此之外,我迷路了。我认为这行“ $ parm =〜s / + r / -s /;”删除回车符和空格,但是我不确定100%。该上的+和-字符以及所有后续行都把我扔了。我以为+字符表示“一个或多个”,但是第二个参数中-的存在使我对此表示怀疑。

open(fitmp,"</tmp/new_parms$VAR.log"); <-- stores the file(?) in the file handler 'fitmp'
$parm=<fitmp>;  <-- stores the contents of the file in the variable "$parm"
chop($parm);  <-- stores the last line(character?) of the file in $parm
close(fitmp);  <-- closes the file
unlink("/tmp/new_parms$VAR.log";  <-- deletes the file
if($parm =~ /ABORT/){exit(1);}  <-- closes the program if there is a problem
$parm=~s/\+r/\-s/;
$parm=~s/\+m/\-m/;
$parm=~s/\+p/\-p/;
$parm=~s/\+cp/\-cp/;

2 个答案:

答案 0 :(得分:6)

您拥有开放权。

下一行取决于$/的值,该值将为您分隔输入行。默认为换行符。如果此代码段之前有local $/;$/ = undef;之类的内容,则这些行将不会分开。在默认行为下,第二行将只为您读取日志文件的第一行。如果$/未定义,则将读取整个文件。

带有chop的第三行从$parm中删除最后一个字符。 (chomp通常是更安全的选择,只有在$/保持不变的情况下,才删除结尾。由于您的行应以单个字符$/结尾,因此可能没有什么区别,但是您可以永远不知道...)

关于关闭和删除文件的以下几行是正确的。

/ABORT/$parm字符串中搜索模式"ABORT"

最后的替换是{{1}中+r-s的所有字面变化以及条件+-的{​​{1}}(取决于后面的字符) }}字符串。

一路打印$parm可能会有所帮助,这样您就可以了解发生了什么。

答案 1 :(得分:5)

open(fitmp,"</tmp/new_parms$VAR.log"); <-- stores the file(?) in the file handler 'fitmp'

打开文件并将其与文件句柄关联(这意味着您可以使用文件句柄访问文件中的数据)。

在老式的Perl中,您经常会看到这样的代码(尽管使用这种样式的文件句柄时,通常使用所有大写字母是一种很好的做法)。而且,您应始终检查从open()返回的值,并采取适当的措施。

较新的Perl代码将为文件句柄使用词法变量,并将三个参数传递给open()(将文件模式<与名称分开)。

所以我将这段代码写为:

open(my $fitmp, '<', '/tmp/new_parms$VAR.log')
  or die "Can't open '/tmp/new_parms$VAR.log': $!";

继续...

$parm=<fitmp>;  <-- stores the contents of the file in the variable "$parm"

将文件中的第一行数据存储在$parm中。该数据将包括第一行末尾的换行符。

chop($parm);  <-- stores the last line(character?) of the file in $parm

不。这将从变量$parm中删除最后一个字符。上面我提到过,从文件中读取的数据将包含换行符。这行代码将其删除。但是请注意,chop()是一个使用起来有点危险的函数(因为它总是删除最后一个字符-即使它不是换行符)。自Perl 5于1994年发布以来,我们拥有更安全的功能chomp(),该功能仅删除换行符。您应该改用它。

close(fitmp);  <-- closes the file
unlink("/tmp/new_parms$VAR.log";  <-- deletes the file

是的。这两个解释是正确的。

if($parm =~ /ABORT/){exit(1);}  <-- closes the program if there is a problem

更具体地说,如果您从文件中读取的数据包含字符串“ ABORT”,则退出程序。

$parm=~s/\+r/\-s/;
$parm=~s/\+m/\-m/;
$parm=~s/\+p/\-p/;
$parm=~s/\+cp/\-cp/;

您说对了$var =~ s/PATTERN/STRING/正在对$var进行替换,但是您弄错了细节。这里没有换行符或空格。

要实现这四行代码,重要的是+-字符前面都带有\。这具有逃避它们的作用,意味着它们匹配自己,并且没有您在问题中提到的任何特殊含义。还值得一提的是,在替换字符串中转义-字符没有意义,因为-在字符串中没有特殊含义。