Файл усекается при открытии в Perl - PullRequest
0 голосов
/ 02 апреля 2012

Я новичок в Perl, извините, если это очевидно, но я посмотрел, как открыть файл и использовать флаги, но, как мне кажется, они не работают правильно, я сузил его до этих строк код.

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

Оба эти метода, похоже, удаляют содержимое моего файла. Я также проверил, правильно ли отформатирован флаг, и это, я знаю, я выполнил оба условия.

РЕДАКТИРОВАТЬ: кодовая паста большей части моего кода http://codepaste.net/n52sma

Ответы [ 4 ]

3 голосов
/ 02 апреля 2012

Впервые в 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 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 утверждении.

3 голосов
/ 02 апреля 2012

Вы должны использовать версию 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 голос
/ 02 апреля 2012

>> не сжимает и не усекает. Либо вы оказались в предложении «then», когда ожидали быть в предложении «else», либо проблема в другом месте.

Чтобы проверить, что $flag содержит:

use Data::Dumper;
local $Data::Dumper::Useqq = 1;
print(Dumper($flag));
0 голосов
/ 02 апреля 2012

Для справки я упомянул некоторые основные методы обработки файлов ниже.

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
...