我是perl的新手,如果这很明显,我很抱歉,但我研究了如何打开文件和使用标志,但就我的生活而言,它们似乎不起作用,我把它缩小到了这几行代码。
if ($flag eq "T"){
open xFile, ">" , "$lUsername\$openFile";
}
else
{
open xFile, ">>", "$lUsername\$openFile";
}
这两种方法似乎都删除了我的文件内容。我还检查了标志的格式是否正确,事实上,我知道这两个条件都符合。
编辑:代码粘贴我的大部分代码http://codepaste.net/n52sma
Perl新手?我希望你使用的是严格使用和使用警告。
正如其他人所说,您应该使用测试来确保您的文件是打开的。然而,这并不是真正的问题。事实上,我使用了你的代码,它似乎对我来说很好。也许你应该尝试打印一些调试消息,看看它是否在做你认为它在做的事情:
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 itn");
}
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 filen";
<STDIN>; #DEBUG:
现在,如果你看到它说它正在附加到文件中,并且文件存在,并且你仍然看到文件被覆盖,我们就会知道问题出在你实际的open xFile, ">>" $file
语句中。
您应该使用open
的三参数版本、词法文件句柄并检查是否存在错误:
# Writing to file (clobbering it if it exists)
open my $file , '>', $filename
or die "Unable to write to file '$filename': $!";
# Appending to file
open my $file , '>>', $filename
or die "Unable to append to file '$filename': $!";
>>
不会阻塞或截断。要么你在预期的"else"子句中出现了"then"子句,要么问题出在了其他地方。
检查$flag
包含的内容:
use Data::Dumper;
local $Data::Dumper::Useqq = 1;
print(Dumper($flag));
为了供您参考,我在下面提到了一些基本的文件处理技术。
open FILE, "filename.txt" or die $!;
上面的命令将FILE文件句柄与文件filename.txt相关联。您可以使用文件句柄读取文件。如果文件不存在,或者由于任何其他原因无法读取,那么脚本将终止,并在$!变量
open FILEHANDLE, MODE, EXPR
可用模式如下:
read < #this mode will read the file
write > # this mode will create the new file. If the file already exists it will truncate and overwrite.
append >> #this will append the contents if the file already exists,else it will create new one.
如果您对此感到困惑,可以使用名为File::Slurp;我已经提到了使用File::Slurp模块的示例代码。
use strict;
use File::Slurp;
my $read_mode=read_file("test.txt"); #to read file contents
write_file("test2.txt",$read_mode); #to write file
my @all_files=read_dir("/home/desktop",keep_dot_dot=>0); #read a dir
write_file("test2.txt",{append=>1},"@all_files"); #Append mode