我尝试学习Perl并遇到一些问题。我试图覆盖原始文件,但它没有工作。请帮我。
#!/usr/bin/perl -w
use diagnostics;
use warnings;
use strict;
open (FILE, '>>apple.txt');
while (<FILE>){
s/is/at/; # Substitute 'is' for 'at'
print FILE;
close (FILE);
}
我尝试将所有is
更改为at
并将结果写入原始文件。
也许我错过了什么。
答案 0 :(得分:4)
如果您要花费任何时间在Perl中编程,那么花时间阅读Perl FAQ是非常值得的。第4节中回答的问题之一似乎很有用。
How do I change, delete, or insert a line in a file, or append to the beginning of a file?
答案是这样开始的:
从文本中插入,更改或删除行的基本思路 文件涉及读取和打印文件到您想要的点 进行更改,进行更改,然后阅读并打印其余部分 的文件。 Perl不提供对线路的随机访问(尤其是 因为记录输入分隔符
$/
是可变的),尽管是模块 例如Tie::File可以伪造它。执行这些任务的Perl程序采用打开文件的基本形式, 打印它的线,然后关闭 文件:
open my $in, '<', $file or die "Can't read old file: $!"; open my $out, '>', "$file.new" or die "Can't write new file: $!"; while( <$in> ) { print $out $_; } close $out;
对您当前代码的一些评论:
-w
和use warnings
。大多数人只使用后者。open()
的三参数版本和词法文件句柄 - open my $file_handle, '>>', 'apple.txt'
。open()
的返回值并采取适当的措施。通常人们会使用die()
- open my $file_handle, '>>', 'apple.txt' or die "Can't open file: $!
。答案 1 :(得分:0)
Perl通常不支持直接访问文件。 最好将更改的内容写入临时文件, 关闭输入和输出文件,并将临时文件重命名为输入。
或者,如果这是唯一你想做的事,你可以使用 一个单行命令,如:
perl -p -i -e "s/is/at/" -- apple.txt
大致相同。
或者,如果您非常想要对此操作进行编程 在你自己,然后:
-i[extension]
选项的说明,关于你的代码的评论:
open (FILE, '>>apple.txt');
打开文件,当前位置指针位于文件末尾, 所以 print 命令添加文本,而不是覆盖文件 从一开始。
答案 2 :(得分:0)
有一个名为Tie::File
的模块可以执行请求:
use Tie::File;
my $inputFile = "test.txt";
my @array = ();
tie @array, 'Tie::File', $inputFile || die "Error: Couldn't tie the \"$inputFile\" file: $!";
my $len = join "\n", @array;
if($len=~m/is/) { $len=~s/is/at/g; }
@array = split/\n/, $len;
untie @array;