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