Regex Perl-can';t带空白行

Regex Perl-can';t带空白行,regex,perl,Regex,Perl,比如说,我有一个这样的文件(不是实际的内容,而是hextump): 如果我运行以下命令: #!/usr/bin/perl use strict; use warnings; use File::Slurp; $_ = read_file("file.txt"); s/^\s*$//mg; print; 产出为: 0000000 \n T h i s i s a f i l e \r 0000010 \n \n H

比如说,我有一个这样的文件(不是实际的内容,而是hextump):

如果我运行以下命令:

#!/usr/bin/perl
use strict;
use warnings;
use File::Slurp;
$_ = read_file("file.txt");

s/^\s*$//mg;
print;
产出为:

0000000  \n   T   h   i   s       i   s       a       f   i   l   e  \r
0000010  \n  \n   H   e   r   e   '   s       s   o   m   e       t   e
0000020   x   t  \r  \n
显然,空白线没有被剥离。


有人能指出我做错了什么吗?

在正则表达式中,
$
断言可能有点混乱。根据文档,它“匹配行尾(或在行尾换行之前)”。因此,它的行为大致类似于

(?=\n\z)|\z
使用
/m
修饰符,此更改为

(?=\n)|\z
这意味着匹配的子字符串中不包括
\n
。你想要:

s/^\s*\n//mg;
现在代码中仍有一些问题需要解决。主要是,一次读取整个文件并在其上运行正则表达式没有什么意义。相反,我会:

use strict; use warnings; use autodie;

open my $fh, "<", "file.txt";
while (<$fh>) {
  print if /\S/; # print if this line contains at least one non-space character
                 # this elegantly skips whitespace-only lines.
}

我自己的多行匹配不成功,因此我再次将内容拆分为多行:

#!/usr/bin/perl

use strict;
use warnings;

use File::Slurp;

my $content = read_file("test.txt"); # You should'nt set $_ explicitely

foreach (split(/\r\n/,$content)){
    if ($_ =~ /\S/){
        print $_ . "\n";
    }
}

您运行的是什么操作系统?@knittl为什么要用替换的返回值覆盖
$\uuu
中的文件内容?究竟为什么有人投票支持这一评论?
local $/ = local $\ = "\r\n"; # input and output line endings
while (<$fh>) {
  chomp;  # remove line endings
  print if /\S/; # print adds the line ending again.
}
#!/usr/bin/perl

use strict;
use warnings;

use File::Slurp;

my $content = read_file("test.txt"); # You should'nt set $_ explicitely

foreach (split(/\r\n/,$content)){
    if ($_ =~ /\S/){
        print $_ . "\n";
    }
}