在Perl中打开时,文件被截断



我是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";
}

您希望使用strictwarnings以确保变量名没有问题。use strict强制您首先声明变量。例如,您是否设置了$Flag,但随后使用了$flag?也许$flag是第一次设置为通过,但您在第二次设置$Flag

无论如何,DEBUG:语句会让你更好地了解你的错误可能是什么

顺便说一下,在Perl中,您正在检查$flag是否设置为T而不是t。如果要同时针对tT进行测试,请测试是否为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

相关内容

  • 没有找到相关文章

最新更新