我一直在这里寻找有关如何解码正在发生的事情的资源。我发现了几个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/;
答案 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
进行替换,但是您弄错了细节。这里没有换行符或空格。
要实现这四行代码,重要的是+
和-
字符前面都带有\
。这具有逃避它们的作用,意味着它们匹配自己,并且没有您在问题中提到的任何特殊含义。还值得一提的是,在替换字符串中转义-
字符没有意义,因为-
在字符串中没有特殊含义。