Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Не открывается файл для записи


Автор: emian 26.8.2010, 11:44
Здравствуйте всем!
Пишу простейший скрипт, который берет по строчке из одного файла, и заносит эти строчки в новый файл, за исключением указанных в условии.
Сам скрипт вот:
Код

sysopen(input,"input.txt",O_RDONLY) || die;
sysopen(output,"output.txt",O_WRONLY|O_TRUNC|O_CREATE) || die;

while ($l = <input>)
{
    if (!($l[0]=="¦" && $l[1]==" " && $l[3]==" " && $l[10]==" "))
    {
        print output $l."\n";
    }
}

close(input);
close(output);

Файл input.txt лежит рядом со скриптом. output.txt по идее должен создаться.
В консоле получается вот что:
Код

----------------------------------------------
 Welcome to Strawberry Perl Portable Edition!
 * URL - http://www.strawberryperl.com/
 * see README.portable.TXT for more info
----------------------------------------------
Perl executable: S:\perl\perl\bin\perl.exe
Perl version   : 5.12.1

Microsoft Windows [Версия 5.2.3790]
(С) Корпорация Майкрософт, 1985-2003.

S:\perl>perl ex.pl
Died at ex.pl line 2.

S:\perl>

То ли я чего-то не понимаю, то ли...
Прошу помощи...

Автор: Jimy 26.8.2010, 11:56
O_CREAT

без "E" в конце

Добавлено через 6 минут и 48 секунд
И, кстати, вот эта конструкция работать не будет:

Код

 if (!($l[0]=="¦" && $l[1]==" " && $l[3]==" " && $l[10]==" "))

Автор: dva300 26.8.2010, 12:18
use strict; - и откроете для себя массу интересных вещей


Автор: emian 27.8.2010, 06:37
Ух... Давно на перле не писал, подзабыл...
Поменял на CREAT и изменил условие...
Код
sysopen(input,"input.txt",O_RDONLY) || die;
sysopen(output,"output.txt",O_WRONLY|O_TRUNC|O_CREAT) || die;

while ($l = <input>)
{
    if (length($l)>=11)
    {
        if (substr($l,0,1)=="¦" && substr($l,2,1)==" " && substr($l,10,1)==" ")
        {
            print output "DELETED\n";
        }
        else
        {
            print output $l."\n";
        }
    }
    else
    {
        print output $l."\n";
    }
}

close(input);
close(output);

Но результат оказался тот же...
Код

S:\perl>perl ex.pl
Died at ex.pl line 2.

Автор: Jimy 27.8.2010, 10:11
Не могу сказать в чем дело. Строка №2 корректная. Возможно это связано с какими-то ограничениями доступа для пользователя создающего файл.
Попробуйте открывать файлы с помощью функции open.

Это все равно не будет работать корректно:
Код

if (substr($l,0,1)=="¦" && substr($l,2,1)==" " && substr($l,10,1)==" ") {

}


В изначальной строке было 2 ошибки, Вы исправили одну из них smile
Для проверки равенства строк используется оператор "eq", а не "==".
"==" - для проверки равенства чисел

Для поиска строк по шаблону обычно используют регулярные выражения.
Это регулярное выражение найдет нужные строки (первый символ "|", третий и одиннадцатый - пробелы):
Код

if ($l =~ /^\|.\s.{7}\s/) {

}


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)