如何在同一文件中替换perl代码中的^M字符

如何在同一文件中替换perl代码中的^M字符,perl,Perl,我希望删除perl代码中的control-M字符文件(而不是perl一行程序) 我尝试了这个,但它会写入新文件。在同一个文件中怎么做 #!/usr/bin/perl open (IN, '<', "FILE.dat") or die "$!"; open (OUT, '>', "FILE.dat.cpy") or die "$!"; while(<IN>) { $line = $_; $line=~ tr/\015//d; print OUT "

我希望删除perl代码中的control-M字符文件(而不是perl一行程序)

我尝试了这个,但它会写入新文件。在同一个文件中怎么做

#!/usr/bin/perl

open (IN, '<', "FILE.dat") or die "$!";
open (OUT, '>', "FILE.dat.cpy") or die "$!";
while(<IN>)
{
    $line = $_;
    $line=~ tr/\015//d;
    print OUT "$line";
}
close (IN);
close (OUT);
#/usr/bin/perl
打开(在,,“FILE.dat.cpy”)或死“$!”;
while()
{
$line=$\;
$line=~tr/\015//d;
打印出“$line”;
}
关闭(IN);
收尾;

以字符串形式存储内部文件

#!/usr/bin/perl

my $content = ''
open (IN, '<', "FILE.dat") or die "$!";
while(<IN>)
{
    $line = $_;
    $line=~ tr/\015//d;
    $content .$line
}
close (IN);

open (OUT, '>', "FILE.dat") or die "$!";
print OUT $line;
close (OUT);
#/usr/bin/perl
我的$content=''
打开(在“,”FILE.dat“)或死“$!”;
打印$line;
收尾;

可以使用
$^I
变量来完成

use autodie;
local $^I = "";
local @ARGV = "FILE.dat";

while (my $line = <>) {
  $line=~ tr/\r//d;

  print $line;
}
使用autodie;
本地$^I=“”;
local@ARGV=“FILE.dat”;
while(我的$line=){
$line=~tr/\r//d;
打印$行;
}

$^I-就地编辑扩展名的当前值。使用undef禁用就地编辑


因此,默认情况下是
undef
,空字符串用于在位编辑,非空字符串将作为后缀添加到备份文件名中。

您不必担心将编辑的内容复制到新文件,然后重命名。这是编辑内容的标准方法,除非您处理的是具有固定记录的文件

查看并观察大多数编辑内容的方法,其中大多数最终将复制到新文件

我的建议是使用mpapec演示的就地编辑。唯一的补充是Windows强制您指定备份,因此只需在处理后添加
取消链接
行即可

use strict;
use warnings;
use autodie;

my $file = 'FILE.dat';

local @ARGV = $file;
local $^I = '.bak';

while (<>) {
    tr/\r//d;
    print;
}

unlink "$file$^I";

除非先将源文件的全部内容读入内存,否则无法一次性完成。如果后续写入失败,则可能会出现错误。是的:
-i指定由构造处理的文件要就地编辑。它通过重命名输入文件,以原始名称打开输出文件,并选择该输出文件作为print()语句的默认值来完成此操作。
。请看@ikegami true,这是可能的,但这不是小事,显然超出了OP的能力。OP所要求的显然不是他想要的,因为他不理解他所要求的。他真正想要的是
perl-pi-e'tr/\015//d'文件
@Alnitak然后他应该接受mpapec的答案。作为将来的参考,他可以使用perl-MO=Deparse-pie'tr/\015//d'来获取一行程序的完整版本。在幕后,它创建了一个临时文件。@choroba在perldoc的某个地方提到过这个吗?我想lsof显示了这一点。
use strict;
use warnings;
use autodie;

use Fcntl qw(:seek);

my $file = 'afile.dat';

open my $fh, '+<:raw', $file;
my $data = do {local $/; <$fh>};
seek $fh, SEEK_SET, 0;
truncate $fh, 0;

$data =~ tr/\r//d;

print $fh $data;
close $fh;