我已经编写了这段代码,但它没有工作......白色空间仍然存在
open(FILE2, "<WordNetTest2.txt");
my @lin=<FILE2>;
while (<FILE2>) {
s/\^\s+//g;
}
print FILE2 "@lin";
close(FILE2);
答案 0 :(得分:4)
您的代码存在一些问题:
open
的返回代码。 \^
使其成为字面值。尝试匹配行首的s/\A\s+//
或w/^\s+//
。 这样的事情:
#!/usr/bin/perl
use strict;
use warnings;
open ( my $input, "<", "WordNetTest2.txt" ) or die $!;
open ( my $output, ">", "WordNetTest2NEW.txt" ) or die $!;
while ( my $line = <$input> ) {
$line =~ s/^\s+//;
print {$output} $line;
}
close ( $input );
close ( $output );
#copy one over the other if so inclined
但是,使用sed
:
sed -i.bak -e 's/^ +//g' WordNetTest2.txt
答案 1 :(得分:2)
您的代码存在一些问题。
打开文件句柄进行阅读(更好的是open
的三参数版本,带有词法文件句柄和错误检查open my $fh , '<' , 'file.txt' or die "Cannot read file.txt: $!\n";
)。然后你读入数组@lin
中的完整文件,将文件句柄保留在EOF中。因此while循环无关。
现在,您尝试将未修改的数组打印到只读文件句柄,然后关闭文件句柄。
更好的是:
use strict ;
use warnings ;
my $filename = 'WordNetTest2.txt' ;
open my $fh , '<' , $filename or die "Cannot read '$filename': $!\n" ;
my @lines = <$fh> ;
close $fh ;
for ( @lines ) {
s/^\s+// ; # No need for global substitution
}
open $fh , '>' , $filename or die "Cannot write '$filename': $!\n" ;
print $fh @lines ;
close $fh ;
答案 2 :(得分:0)
你已经逃脱了你的插入符号:
s/\^\s+//g;
^--
这意味着它不再是&#34;字符串的开头&#34;正则表达式metachar。它变成了一个字面插入符号,意思是:
foo^ bar <--matches
foo bar <--no match, because no caret
答案 3 :(得分:0)
试试这个:
perl -i -pe 's/^\s+//' WordNetTest2.txt
答案 4 :(得分:0)
非常简单:
open(FILE2, "< WordNetTest2.txt");
my @lin=< FILE2>;
$str_file = join("", @lin);
print FILE2 "$str_file";
close(FILE2);
对我有用。