我有一些代码在perl中逐行清理文件。代码的一部分检查空格行并删除这些空格。根据我的逻辑,它也应该删除只是空行的行,但它不会。
$file = "myfile.txt";
open (IN, $file) || die "Cannot open file ".$file." for read";
@lines=<IN>;
close IN;
open (OUT, ">", $file) || die "Cannot open file ".$file." for write";
foreach $line (@lines)
{
#removes all spaces from lines and but won't remove empty lines (it should).
$line =~ tr/ //d;
#remove double quotes from file
$line =~ s/\x22//g;
print OUT $line;
}
close OUT;
如何添加此代码以删除所有仅为空行的行?转此:
This is "line 1".
This is "line 2".
This is "line 4".
This is "line 5".
进入这个:
Thisisline1.
Thisisline2.
Thisisline4.
Thisisline5.
答案 0 :(得分:3)
以下是您原来的内容:
>perl -MO=Deparse -i.bak -nlwe "tr/ //d; print if length"
BEGIN { $^I = ".bak"; }
BEGIN { $^W = 1; }
BEGIN { $/ = "\n"; $\ = "\n"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
tr/ //d;
print $_ if length $_;
}
与现在的情况存在显着差异。具体来说,您不会考虑换行。您可以使用以下内容:
for my $line (@lines) {
$line =~ s/["\s]//g;
print OUT "$line\n" if length($line);
}
\s
匹配包括换行符在内的所有空格。
答案 1 :(得分:1)
您可以使用chomp($line)
删除换行符,然后检查$line
是否等于空字符串。
这也将避免进一步修改您的代码。
答案 2 :(得分:0)
只需使用$INPLACE_EDIT
修改文件:
use strict;
use warnings;
my $file = "myfile.txt";
local @ARGV = $file;
local $^I = '.bak';
while (<>) {
tr/ "//d; # Remove spaces and double quotes
print if ! /^$/; # Skip blank lines
}
# unlink "$file$^I"; # Optionally delete backup
有关修改文件的其他方法,请查看perlfaq5 - How do I change, delete, or insert a line in a file, or append to the beginning of a file?
答案 3 :(得分:0)
当处于这样的循环中时,无论是在新数组中返回还是正在打印,我总是只使用:
next if($line =~ s/^\s*&/);
应该跳过处理空行。