我有一个文件(prac.txt),其中包含以下内容:
"line1"
"line2"
"Hello World"
"line3"
我想阅读整个文件并将“hello world”替换为“第3行”。我写了代码但它只是在执行时挂起。任何人都可以指导我..?看起来我的正则表达式需要一些改变。
这是我的代码:
my @tmp = ();
my $FILE;
open ( $FILE, '<', 'prac.txt') or die "Can't open prac.txt\n";
while($FILE) {
my $cur_line = $_;
if($cur_line =~ /\"Hello\"/){
push(@tmp, " \" line 3\"; \n");
}
else {
push(@tmp, $cur_line);
}
}
close($FILE);
open ($FILE, '>', 'prac.txt') or die "Can't open file\n";
print FILE @tmp;
close($FILE);
任何帮助将不胜感激。感谢
答案 0 :(得分:1)
代码存在一些问题。这是一个工作版本,我在需要进行更改的地方发表评论。
#!/usr/bin/perl
use strict;
use warnings;
my @tmp = ();
my $FILE;
open ( $FILE, '<', 'prac.txt') or die "Can't open prac.txt\n";
# You need to use the diamond operator `<>` around `$FILE` to read in the file.
while(<$FILE>) {
my $cur_line = $_;
# Make sure this regex matches your input file
if($cur_line =~ /"Hello World"/){
push(@tmp, " \" line 3\"; \n");
}
else {
push(@tmp, $cur_line);
}
}
close($FILE);
open ($FILE, '>', 'prac.txt') or die "Can't open file\n";
# You need a `$` in front of `FILE`
print $FILE @tmp;
close($FILE);
另外,我想用open
的正确3参数形式和词法文件句柄说好。
答案 1 :(得分:0)
in perl one-liner
perl -i -lpe '$_ = q{"Line 3"} if /"Hello World"/' prac.txt
或者扩展为完整的脚本:
use strict;
use warnings;
local @ARGV = 'prac.txt';
local $^I = '.bak';
while (<>) {
$_ = qq{"Line 3"\n} if /"Hello World"/;
print;
}
# unlink "prac.txt$^I"; # Uncomment to delete backup.
答案 2 :(得分:0)
您错过了$FILE
中while
周围的尖括号。它应该是
while (<$FILE>)
或者
for my $cur_line (<$FILE>)
您应该在脚本的顶部包含此内容,以便更好地报告错误:
use strict;
use warnings;
答案 3 :(得分:0)
但这可以更轻松地完成:
perl -i -p -e 's/Hello World/line3/' prac.txt