Perl 新手?我希望你使用use strict 和use warnings。
正如其他人所说,您应该使用测试来确保您的文件已打开。但是,这并不是真正的问题。事实上,我使用了你的代码,它对我来说似乎工作得很好。也许您应该尝试打印一些调试消息,看看它是否正在做您认为它正在做的事情:
use strict;
use warnings;
use autodie; #Will stop your program if the "open" doesn't work.
my $lUsername = "ABaker";
my $openFile = "somefile.txt";
if ($flag eq "T") {
print qq(DEBUG: Flag = "$flag": Deleting file "$lUsername/$openFile");
open xFile, ">" , "$lUsername/$openFile";
}
else {
print qq(DEBUG: Flag = "$flag": Appending file "$lUsername/$openFile");
open xFile, ">>", "$lUsername/$openFile";
}
您想使用strict 和warnings 以确保您没有遇到变量名问题。 use strict 强制您首先声明变量。例如,您是否设置$Flag,但随后使用$flag?也许$flag 是第一次设置的,但您第二次设置的是$Flag。
无论如何,DEBUG: 语句会让您更好地了解您的错误可能是什么。
顺便说一句,在 Perl 中,您正在检查 $flag 是否设置为 T 而不是 t。如果您想同时针对t 和T 进行测试,请测试是否是uc $flag eq 'T' 而不仅仅是$flag eq 'T'。
@Ukemi
我重新格式化以遵守使用严格,我还制作了打印语句以确保我在我想要的时候被截断,而不是在我不想要的时候。它仍在删除文件。虽然现在有时它根本不写,我会在链接中给出我的代码的大部分,如果你给它一次,我真的很感激。
您是否看到它说 截断,但文件是空的?您确定该文件已经存在吗?我将标志和所有内容放在调试语句中是有原因的。你打印的越多,你知道的就越多。试试下面这段代码:
$file = "lUsername/$openFile" #Use forward slashes vs. back slashes.
if ($flag eq "T") {
print qq(Flag = "$flag". Truncating file "$file"\n);
open $File , '>', $file
or die qq(Unable to open file "$file" for writing: $!\n);
}
else {
print qq(Flag = "$flag". Appending to file "$file"\n);
if (not -e $file) {
print qq(File "$file" does not exist. Will create it\n");
}
open $File , '>>', $file
or die qq(Unable to open file "$file" for appending: $!\n);
}
- 请注意,我将标记和文件名打印在引号中。这将允许我查看我的文件名中是否有任何隐藏字符。
- 我使用
qq(...) 方法来引用字符串,所以我可以在打印语句中使用引号。
- 还请注意,我在截断时检查文件是否存在。这样,我确保文件确实存在。
这应该指出您的逻辑中任何可能的错误。您可以做的另一件事是在完成文件写入后停止程序并验证文件是否按预期写入。
print "Write to file now:\n";
my $writeToFile = <>;
printf $File "$writeToFile";
close $File;
print "DEBUG: Temporary stop. Examine file\n";
<STDIN>; #DEBUG:
现在,如果你看到它说它正在附加到文件中,并且文件存在,但你仍然看到文件被覆盖,我们就会知道问题出在你的实际 open xFile, ">>" $file 语句中。