我在一个遗留脚本中有以下代码:
while (<FPTR>) # While still input lines in the file...
{
if($_ =~ /\x1b&d@
/)
{
$aa=$_;
$aa =~ s/\x1b&d@
/
\x1b&d@/;
print STDOUT $aa;
}
...
}
请您解释一下 - 这段代码做了什么以及如何用正确的代码替换它? 我不喜欢“if”和“=〜”中有换行符。 是否可以更改此代码?
答案 0 :(得分:3)
假设尚未重新定义INPUT_RECORD_SEPARATOR,则新行可能会被$
替换。然后,您应该能够chomp输入行的副本来删除换行符。 编辑:然后将\n
添加到输出中。
while (<FPTR>) # While still input lines in the file...
{
if (/\x1b&d@$/) {
$aa = $_;
chomp $aa;
print STDOUT "\n" . $aa;
}
...
}
这会通过消除正则表达式的多个副本来简化代码。
答案 1 :(得分:1)
您可以使用\n
替换换行符。请参阅perldoc perlop中'Quote and Quote-like operators'中有关转义序列的部分。
也可以使用$
元字符。来自perldoc perlre:
$ Match the end of the line (or before newline at the end)
答案 2 :(得分:0)
该代码似乎寻找一个字节序列,然后是换行符,并在模式前面交换换向符。您可以使用\n
作为换行符(如果脚本是DOS格式,则为pr \r\n
),我认为以下内容相同:
while (<FPTR>) # While still input lines in the file...
{
if($_ =~ m/\x1b&d@\n/)
{
$aa=$_;
$aa =~ s/\x1b&d@\n/\n\x1b&d@/;
print STDOUT $aa;
}
...
}
答案 3 :(得分:0)
在处理
之前先尝试做一个chomp()while (<FPTR>) {
chomp;
....
}
答案 4 :(得分:0)
这是一个棘手的问题:
/\x1b&d@
/
这是转义字符后跟'&amp; d @'的转义字符。因此,我实际上可能会使用:
while (my $line = <FPTR>) {
if ( $line =~ /x1b&d@$/ ) {
chomp $line;
print $line;
}
}
我不明白为什么需要在$_
中复制$aa
,但如果确实有必要,请使用
if ( (my $copy = $line) =~ /x1b&d@$/ ) {
chomp $copy;
print $copy;
}
}
如果选择了其他文件句柄作为默认文件句柄,则只需指定STDOUT
作为文件句柄。