首页 > 解决方案 > 如何让它停止删除以前在文本文件中的内容?

问题描述

有一个有名字的文件,显示文件中的人,然后询问这个人是否要注册,同意 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";

标签: perl

解决方案


主要问题是您第二次打开文件时使用了错误的模式。从打开

如果 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,即使是打开输入 ( <) 也是如此。


推荐阅读