perl - 如何让它停止删除以前在文本文件中的内容?
问题描述
有一个有名字的文件,显示文件中的人,然后询问这个人是否要注册,同意 Y,提示他们输入他们的名字,然后将他们的名字添加到文件的末尾(如果他们说 y)使用 Perl 将名称附加到文件的末尾。
这是作业,下面的代码大部分是功能性的。但是,当您输入名称时,它将删除之前可能已在文件中的所有其他名称。
my $file = "name.txt";
# Use the open() function to open the file.
unless(open FILE, $file) {
# Die with error message
# if we can't open it.
die "\nUnable to open $file\n";
}
while(my $line = <FILE>) {
print $line;
}
open (fh, ">", "name.txt");
print "Do you want to sign up? \n";
$choice = <STDIN>;
$y = "yes\n";
if ($choice eq $y) {
print "Enter your name\n";
}
$a = <>;
# Writing to the file
print fh $a;
close(fh) or "Couldn't close the file";
解决方案
主要问题是您第二次打开文件时使用了错误的模式。从打开:
如果 MODE 为 >,则打开文件进行输出,现有文件首先被截断(“clobbered”)并新创建不存在的文件。如果 MODE 为>>,则打开文件以进行追加,如有必要,将再次创建。
您的文件被覆盖的原因是您使用 打开它>
,这会破坏您现有的文件。正如文档所述,您需要使用>>
将行附加到文件末尾。
另一个问题是,即使用户输入no
而不是yes
,代码仍然会提示输入名称,然后将名称写入文件。除非用户输入yes
,否则您不想写入文件,因此所有代码都属于if
块内。
这是编写代码的更传统方法:
use warnings;
use strict;
my $file = 'name.txt';
open my $fh, '<', $file or die "\nUnable to open $file: $!\n";
while (my $line = <$fh>) {
print $line;
}
close $fh;
print "Do you want to sign up? \n";
my $choice = <STDIN>;
my $y = "yes\n";
if ($choice eq $y) {
print "Enter your name\n";
my $name = <>;
open $fh, '>>', $file;
print $fh $name;
close $fh;
}
strict
使用和很重要warnings
。使用词法文件句柄 ( $fh
) 代替裸文件句柄 ( FILE
) 有很多好处。显式地使用模式 for 是一种很好的做法open
,即使是打开输入 ( <
) 也是如此。
推荐阅读
- .net - 使用Orleans,如何实现分布式数据存储的分布式计算?
- android - 匕首 2 视图模型和 ViewModelProvider.Factory
- vb.net - 使用 BindingSource 中的文本框搜索 DataGridView
- java - Intellij 如何不将标签放在单独的行上?
- javascript - 弹出窗口内的 Kendo React Grid:为什么 getComputedStyle 为 IE11 和 Edge 返回 null,而不是 Chrome、Opera 和 Firefox?
- c# - C# - 在 ReadAllBytes 之后清除 RAM
- java - 使用从 SQLite 概括的数据填充 RecyclerView/ListView
- ios - 我想将 Apple Pay 集成到我的应用中。Apple 会照顾收款方吗?
- swift - 在 Timer 中调用函数
- python - 我可以使用 pandas to_sql 方法添加约束吗?