在Perl中打开时文件被截断

时间:2012-04-02 11:25:13

标签: perl file append truncate

我是perl的新手,很抱歉,如果这是显而易见的,但我抬头看了如何打开文件,并使用旗帜,但对于我的生活,他们似乎没有正常工作我缩小到这些线代码。

    if ($flag eq "T"){
        open xFile, ">" , "$lUsername\\$openFile";
    }
    else
    {
        open xFile, ">>", "$lUsername\\$openFile";
    }

这两种方法似乎都删除了我文件的内容。我还检查了标志是否格式正确,它是,我知道一个事实,我已经在两个条件下。

编辑:代码的大部分代码http://codepaste.net/n52sma

4 个答案:

答案 0 :(得分:3)

您应该使用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': $!";

答案 1 :(得分:3)

Perl新手?我希望您使用use strictuse 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";
}

您希望使用strictwarnings,以确保您没有变量名称的问题。 use strict强制您先声明变量。例如,您是设置$Flag,还是使用$flag?可能$flag第一次设置,但您第二次设置$Flag

无论如何,DEBUG:语句可以让您更好地了解您的错误。

顺便说一句,在Perl中,您正在检查$flag是否设置为T而不是t。如果您要针对tT进行测试,请测试uc $flag eq 'T'而不仅仅是$flag eq 'T'


@Ukemi

  

我重新格式化以遵守严格使用,我还制作了打印声明,以确保我在我想要的时候,但不是在我不想的时候。它仍然是删除文件。虽然现在有时它只是不写,但我会在链接中提供更大部分的代码,如果你给它一次,id会非常感激。

您是否看到截断,但该文件为空?你确定该文件已经存在吗?我将调试语句中的标志和所有内容放在一起是有原因的。打印得越多,知道的越多。请尝试以下代码部分:

$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语句中使用引号。
  • 还要注意我在截断时检查文件是否存在。这样,我确保文件确实存在。

这应该指出逻辑中可能存在的任何错误。您可以做的另一件事是在完成文件写出后停止程序并验证文件是否按预期写出。

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语句中。

答案 2 :(得分:1)

>>不会破坏或截断。如果您希望处于“else”子句中,或者问题出在其他地方,您最终会进入“then”子句。

检查$flag包含的内容:

use Data::Dumper;
local $Data::Dumper::Useqq = 1;
print(Dumper($flag));

答案 3 :(得分:-3)

供您参考,我在下面提到了一些基本的文件处理技术。

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