Perl:如何删除文件每行开头的空格?

Perl:如何删除文件每行开头的空格?,perl,Perl,我已经写了这段代码,但它不起作用。空白仍然存在 open(FILE2, "<WordNetTest2.txt"); my @lin=<FILE2>; while (<FILE2>) { s/\^\s+//g; } print FILE2 "@lin"; close(FILE2); open(FILE2),您已跳过插入符号: s/\^\s+//g; ^-- 这意味着它不再是“字符串的开始”正则表达式元字符。它变成了文字插入符号,意思是: foo^ b

我已经写了这段代码,但它不起作用。空白仍然存在

open(FILE2, "<WordNetTest2.txt");
my @lin=<FILE2>;
while (<FILE2>) {
    s/\^\s+//g;
}
print FILE2 "@lin";
close(FILE2);

open(FILE2),您已跳过插入符号:

s/\^\s+//g;
  ^--
这意味着它不再是“字符串的开始”正则表达式元字符。它变成了文字插入符号,意思是:

foo^  bar      <--matches
foo   bar      <--no match, because no caret

foo^bar您的代码有几个问题

打开文件句柄进行读取(最好是三参数版本的
open
,带有词法文件句柄和错误检查
打开我的$fh',,$filename或die“无法写入“$filename”:$!\n”;
打印$fh@行;
收盘价$fh;
试试这个:

perl -i -pe 's/^\s+//' WordNetTest2.txt

您的代码有几个问题:

  • 3.公开辩论要好得多
  • 您应该真正检查
    open
    的返回代码
  • 将文件分配给阵列将读取整个文件。这在您的情况下是多余的,并且会浪费内存(这是较大文件的一个考虑因素)
  • 但是当你这样做的时候,while循环之后就没有什么可读的了
  • 您正在打开一个要读取的文件,这意味着该文件未打开以进行写入
  • 您的正则表达式已损坏。转义
    \^
    使其成为文字。请尝试
    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
这很容易:

open(FILE2, "< WordNetTest2.txt");
my @lin=< FILE2>;
$str_file = join("", @lin);
print FILE2 "$str_file";
close(FILE2);
open(FILE2,;
$str_file=join(“,@lin);
打印文件2“$str_文件”;
关闭(文件2);

它对我很有用。

\^
是错误的。这将它转换为插入符号文字,并且不再被视为“字符串的开头”"。您告诉正则表达式在文本中查找一个文本
^
,后跟一个或多个空格字符。@MarcB您应该将其作为答案提交。我的Perl有点生疏,但不会
@lin=
将整个文件拖入数组
@lin
,将文件句柄保留在EOF?即使它没有,您也会p在文件中的行上,在每行上执行替换,并丢弃结果。好的,那么它应该像s/^\s+//g..但我马上就尝试了。这也不起作用。我如何使它起作用?虽然正确,但我认为您的答案将受益于对发生的事情的更多解释。非常感谢您对pointi的感谢找出我的错误。我现在就知道了!!当你写die$时,还有一件事,die是用来显示错误消息的,对吧…什么是$!意思?$!意思是“打开时生成的错误”(在本例中)。因此,如果你的文件不可读,它会告诉你这就是为什么它不工作的原因。(如果你愿意,可以在你的文件上通过
chmod a-r
进行测试)非常感谢mch指出我的错误!!现在开始工作:)
sed -i.bak -e 's/^ +//g' WordNetTest2.txt
open(FILE2, "< WordNetTest2.txt");
my @lin=< FILE2>;
$str_file = join("", @lin);
print FILE2 "$str_file";
close(FILE2);