如何从此代码中删除换行符?

时间:2010-03-06 13:48:56

标签: perl

我在一个遗留脚本中有以下代码:

while (<FPTR>)  # While still input lines in the file...
{
  if($_ =~ /\x1b&d@
/)
  {
    $aa=$_;
    $aa =~ s/\x1b&d@
/
\x1b&d@/;
    print STDOUT $aa;
  }
...
}

请您解释一下 - 这段代码做了什么以及如何用正确的代码替换它? 我不喜欢“if”和“=〜”中有换行符。 是否可以更改此代码?

5 个答案:

答案 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作为文件句柄。