Xpoint
   [напомнить пароль]

Помогите глупой блондиночке

Метки: [без меток]
2009-04-21 14:15:11 [обр] Нютик[досье]

Здравствуйте. Мне просто безумно необходима Ваша помощь. Никак не могу подружиться с Perl, видимо просто не тот склад ума, а в университете заставляют учить и делать лабораторные работы. Пожалуйста помогите решить парочку задуч, думаю они для Вас будут очень простенькие:)

  1. Напишите программу, позволяющую преобразовать входной файл в выходной путем замены одной введенной строки на другую, введенную с клавиатуры строку. Выполните эту программу с несколькими файлами (количество определяется преподавателем). Напишите программу чтения списка имен файлов и выдачи информации о том, какие файлы доступны для чтения, для записи и (или) для выполнения, а какие файлы не существуют.
  1. Необходимо проверить правильность алгебраической формулы, содержащей операторы +, -, *, /, и скобки. Проверка формулы должна быть инфиксная.
  1. Описать процедуру DigitCountSum(K, C, S), находящую количество C цифр целого положительного числа K, а также их сумму S (K — входной, C и S — выходные параметры целого типа). С помощью этой процедуры найти количество и сумму цифр для каждого из пяти данных целых чисел.

Буду весьма благодарна

спустя 1 час 40 минут [обр] Thirteensmay(15/157)[досье]
- Дураки всегда найдутся.
- Сейчас модно говорить не "дураки", а "энтузиасты".
- Ага, у нас теперь две проблемы - энтузиасты и рельеф.
спустя 1 час 10 минут [обр] Lynn «Кофеман»(3/571)[досье]
А диплом за вас не получить?
спустя 31 минуту [обр] Алексей Севрюков(198/1280)[досье]
Нютик[досье] не совсем понимаю зачем идти учиться на факультет, в котором Вы совершенно не разбираетесь. Идите в секретари, а еще лучше на ресепшн, там Ваш склад ума возможно подойдет.
спустя 29 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]
Нютик[досье], а я бы мог помочь, если бы вы доказали (всего один раз), что действительно блондиночка, и действительно глупая. Но Тюмень - это слишком далеко.
спустя 12 часов [обр] Нютик[досье]
Ну зря вы так со мной... Диплом за меня не прошу получить, просто у меня небольшие проблемы с perl. Как не странно, все сессии закрываю сама без сторонних лиц. Бывают слабости у человека, но раз у Вас такое отношение, то спасибо хотя бы за то, что просто посмотрели эту тему.. Вы все очень милые. Иногда в жизни возникают небольшие проблемы, и иногда нужна человеку помощь со стороны.
спустя 2 часа 10 минут [обр] Прокаев2(0/35)[досье]
попробуйте www.rentacoder.com
я перл тоже не люблю ;)
спустя 47 минут [обр] Нютик[досье]
Спасибо, обязательно попробую:) хоть один дельный совет, а то одни плевки:)
спустя 2 часа 56 минут [обр] Thirteensmay(15/157)[досье]
Ктож вам виноват ?, сами выбрали такой путь - привыкайте.
спустя 3 часа 14 минут [обр] Нютик[досье]
Откуда Вы знаете какой путь я выбрала?
спустя 12 минут [обр] Lynn «Кофеман»(3/571)[досье]

Из названия темы, очевидно.

Серьёзно, вы пытались сами решить эти задачи?

спустя 51 минуту [обр] Thirteensmay(15/157)[досье]
И к сожалению не только из названия. Думаю намека Lynn «Кофеман»[досье] вполне достаточно (перечитайте свой первый пост), если же нет, то я конечно могу разложить вам все по полочкам, но это будет не лицеприятно, так что думаю не стоит ;)
спустя 5 минут [обр] Нютик[досье]
Название - всего лишь название. И если честно, то не очень приятно, когда смеются над твоими проблемами, но это все ерунда
Я не из тех людей которые из-за ерунды просят помощи.. Не могу понять причину почему до меня не доходит как это сделать.. Я просто не вижу решения.. Я примерно представляю от чего надо отталкиваться, как оно должно работать, но реализовать не могу.. Мне помоли сделать 3е задание, я посмотрела на размер и простоту кода и мне стало стыдно..
спустя 16 минут [обр] Thirteensmay(15/157)[досье]
Вы не пытались, если же всетаки пытались, то скажите что конкретно вас ставит в тупик при решении например первого задания ? что вы пробовали делать ? как в общих чертах представляете себе решение ?
спустя 27 минут [обр] Нютик[досье]

Ну как я понимаю, есть файл с некоторыми данными из которого надо прочитать информацию (или несколько файлов). Пропысывается путь к этим файлам (думаю лучше это сделать через меню: 1- такой то файл, 2- такой то файл и т.д.). Так же через меню осуществляется возможность чтения и записи в выбранный файл.
Файл открывается через функцию типа open(NEWFH, "">file.txt") - для замены содежимого; и просто Open для чтения из файла.

А ставит меня в тупик то, что я не могу понять как же это все реализовывать

спустя 8 минут [обр] Алексей Севрюков(198/1280)[досье]

Нютик[досье] первая задача решается путем простого чтения мана. В частности Вам нужно почитать про:

  1. Работу с командной строкой. Там все крайне просто и есть куча примеров в самом мане.
  2. Работу функции open, примеры так же есть в мане.
  3. Циклы.
  4. Про регулярные выражения и escaping.

Все эти сведения есть в мануале и практически в любой книжке по Perl.

Задача решается пошагово:

  1. сначала пишете кусок для чтения параметров из командной строки, проверяете что Все работает верно.
  2. дописываете цикл, в котором пробегаетесь по файлам из командной строки, открываете каждый файл на чтение, читаете из него и закрываете. Либо выводе сообщение об ошибке доступа к файлу и переходите к следующему.
  3. Дописываете регулярное выражение, которое производит замену в тексте, прочитанном из файла.
  4. открываете тот же файл, но уже на запись и записываете туда результат замены. закрываете файл.

И вуаля!
Не нужно пытаться решить задачу целиком, разбейте ее на несколько подзадач, реализуйте их, проверьте результаты и переходите к следующей. А после останется только склеить несколько операций в единый функционал.

спустя 8 минут [обр] Нютик[досье]
Спасибо за толчок;) Непременно попробую исходя из Вашего совета. А потом напишу о результатах:) Еще раз спасибо
спустя 10 минут [обр] Thirteensmay(15/157)[досье]

Алексей, ну че вы ее сразу с головой окунули ;) захлебнется нафиг, проще надо, проще... В коем веке попался экземпляр подающий признаки жизни ;) а вы...

Нютик[досье] Ненадо меню, не просили, сделайте чтение имя файла с клавиатуры, это проще, и то, потом. Для начала достаточно забить его жестко в переменной вначале программы. То что вы знаете что есть функции работы с файлами уже очень хорошо, это половина решения. Решайте потихоньку, по частям, сначала откройте файл и прочитайте его содержимое в переменную, пока этого будет достаточно, дальше я готов вам подсказывать как и что делать, но начать должны вы. Итак, напишите программу чтения файла в переменную и покажите ее здесь. Задача достаточно простая, пару строк кода, в документации Perl и в сети есть куча готовых примеров. См. раздел "Работа с файлами". Потестировать ее будет достаточно легко, переменную можно будет вывести на консоль с помощью команды print и посмотреть прочитался ли в нее файл. Ждем кода или конкретных вопросов что не получается.

спустя 3 часа 34 минуты [обр] Нютик[досье]
сообщение промодерировано
Мой мозг умер:( Я нашла кучу примеров и как-то не очень.. Подскажите, я пыталась открыть файл и вывести его содержимое..
#!/usr/bin/perl -w
open(FILE, "C:\f1.txt");
while(defined($a=<FILE>)) 
 {print $a;};
close(FILE);
#!/usr/bin/perl -w
open(FILE, "C:\f1.txt") || die;
while($line= ) 
 {print $line;}
close(FILE);
#!/usr/bin/perl -w
open(FILE, "C:\f1.txt");
@ff=<FILE>;
close(FILE);
foreach $line (@ff) {
print "$line\n";
#!/usr/bin/perl -w
open(FILE, "C:\f1.txt") || die;
   while ($line = <FILE>)
       {print $line;}
close(FILE);
спустя 11 часов [обр] Алексей Севрюков(198/1280)[досье]
Открываем файл и заносим все его содержимое в переменную:
#!/usr/bin/perl
use strict; # всегда и везде, в каждой программе ставим эту строчку и молимся на strict
my $text; # тут будем хранить содержимое файла
{
local $/; # сбрасываем переменную-разделитель при чтении из файла, только в данных фигурных скобках
open(FILE,"<",'c:\\f1,txt') or die "Не могу открыть файл: $!";
$text=<FILE>; # считываем ВЕСЬ файл сразу, а не построчно, так как выше мы сбросили системную переменную
close(FILE) or die "Не могу закрыть файл: $!";
}

print "Я прочитала текст из файла, вот он:\n".$text;
спустя 19 минут [обр] Thirteensmay(15/157)[досье]

Нютик[досье] Что не очень то ? все нормально.
Давайте оттолкнемся от примера Алексей Севрюков[досье]
Скажите работает ли это у вас ? Все ли вы в этом коде понимаете ? если что то непонятно то скажите что.

P.S. Используйте синтаксис форматирования своих постов http://xpoint.ru/help/formatting.xhtml так будет лучше ;)

спустя 5 часов [обр] Нютик[досье]
Работает:) Да и в принципи все понятно кроме local $/;
Не могу толком понять что именно она делает, какую переменную-разделитель она сбрасывает.
И очень жалко, что я на нечто подобное не наткнулась в интернете:)
Теперь буду отталкиваться от этого кода и менять в open режимы (для дозаписи, перезаписи) и смотреть что получится:)
Вы молодцы, что решили именно таким образом помочь мне:)
спустя 4 минуты [обр] Нютик[досье]
Сразу вопрос сходу, когда открывается файл для записи, нужно ли писать local $/;?
спустя 26 минут [обр] Thirteensmay(15/157)[досье]
$/ это специальная переменная (вообще их много - http://wdh.suncloud.ru/perlvar.htm) которая устанавливает какой символ перл должен считать разделителем строк, по умолчанию разделитель строк - \n, т.е. символ с кодом 10, именно этим кодом обычно разделяются строки в текстовых файлах. Конструкция $text = <FILE> читает из FILE последовательно по одной строке, однако если предварительно $/ обнулить то перл проигнорирует разделитель внутри файла и прочитает его весь как одну строку. Конструкция local $/; переопределяет глобальную переменную $/ в рамках текущего блока {} (в котором идет чтение), переопределяет ни на что, все действия внутри нашего блока будут считать что разделителя никакого нет, что нам и надо чтобы прочитать сразу все а не построчно. Надеюсь понятно ;)
спустя 3 минуты [обр] Алексей Севрюков(198/1280)[досье]

Нютик[досье] читайте ман: perldoc perlvar. По умолчанию эта переменная содержит символ перевода строки \n. Это разделитель строк при чтении из файла. Т.е. при чтении Perl отдает файл частями, разделителем которых является \n. Если мы обнуляем переменную (local $/ делает эту переменную локальной и так как никакого значения не присвоено, дается значение undef), Perl читает файл целиком до самого конца. В принципе, если Вы не совсем понимаете, то тоже самое можно сделать и с помощью:

open(FILE,...);
my $text=join("", <FILE>);
close(FILE);

т.е. одной строкой читаем строки из файла и объединяем их с помощью perldoc join. Но этот подход по эффективности намного хуже когда требуется получить содержимое файла целиком.

Переменная $/ используется только при чтении файла, при записи она не учитывается.

спустя 17 минут [обр] Thirteensmay(15/157)[досье]
Нютик[досье] Соответственно, когда вы хотите что то в файл записать, надо сначала подумать как вы хотите это сделать, с каким то разделителем построчно или одним целым куском, и установить нужный разделитель если надо. Вообще при записи это менее актуально т.к. разделитель вы в записываемую строку можете внедрить явно, перед записью. Более того, вся эта чешупень связана с режимом доступа к файлам текстовый/бинарный.
В нашем случае разделители в записываемых данных уже будут (мы их изначально считали), и скорее всего записывать данные мы будем одним куском, короче $/ при записи можно и нужно не переопределять, и вообще если уж мы говорим о записи то не $/ а $\ (см. список спецпеременных, я привел ссылку выше).
спустя 27 минут [обр] Thirteensmay(15/157)[досье]
Нютик[досье] Далее можно будет организовать ввод с клавиатуры четырех переменных - имя исходного файла, имя выходного файла, строку которую надо найти, и строку на которую ее надо заменить. После чего полученные значения подставить в функции open() и блок замены строк который мы напишем позже. А пока ждем от вас кода который читает файл в переменную, а потом записывает эту переменную в другой файл, или вопросов что не получается. В любом случае код в студию.
спустя 5 часов [обр] Нютик[досье]
У меня получилось!!!!
#!/usr/bin/perl
use strict;
my $text;
my @contents;
{
local $/;
open(FILE,"<",'c:\\f1.txt') or die "Не могу открыть файл: $!";
open(FILE2,">",'c:\\f2.txt') or die "Не могу открыть файл: $!";
@contents=<FILE>;
print FILE2 @contents;
close(FILE) or die "Не могу закрыть файл: $!";
close(FILE2) or die "Не могу закрыть файл: $!";
}
print "Я скопировала текст:\n".$text;
спустя 3 часа 1 минуту [обр] Иван Неретин(3/8)[досье]
Нютик[досье], переменная @contents - это массив, на что нам как бы намекает первый символ в её имени. Поэтому можно и не сбрасывать $/. (Прочитаем массив, запишем массив.) А тогда и фигурные скобки не нужны.
Также не нужна переменная $text.
спустя 8 часов [обр] Thirteensmay(15/157)[досье]

Нютик[досье] А зачем массив ? Вы прочитали файл целиком в его первый элемент, смысл ? Пусть лучше будет скаляр $content = <FILE> так прямее. В любом случае замечательно что у вас начинает потихоньку получаться. Итак имеем:

#!/usr/bin/perl
use strict; 

my $content;

{
  local $/; 

  open(IFILE, '<', 'c:\f1.txt') or die $!;
  $content = <IFILE>;
  close(IFILE) or die $!;
}

open(OFILE, '>', 'c:\f2.txt') or die $!;
print OFILE $content;
close(OFILE) or die $!;

Теперь надо организовать ввод с клавиатуры четырех переменных (я писал выше), вообще технологичнее было бы организовать их как параметры, но в нашем случае не принципиально и проще запросить их из самой программы. Т.е. вам надо найти в документации функцию которая считывает строку с клавиатуры, что то типа readline, точно не помню, посмотрите сами, и опять таки для простоты четырьмя последовательными вызовами этой функции в начале программы определить 4 соответствующих переменных. А затем 2 из них, те которые отвечают за имена файлов, подставить в соответствующие функции open(), таким образом мы получим гибкую программу а не жестко работающую с теми файлами и строками которые указаны у нее внутри, задача это подразумевает. Ждем очередного кода от вас или вопросов что не получается.

P.S. Да, посмотрел сейчас документацию, строку с клавиатуры можно считать так: $line = <STDIN>; или $line = readline(*STDIN); перед этим естественно принтом надо выводить подсказки для пользователя что мы ждем от него ввода, иначе непонятно, курсорчик мигает, программа ничего не делает.

спустя 1 день 2 часа [обр] Нютик[досье]
Так прикольно, когда начинает нолучаться:)
#!/usr/bin/perl
use strict; 
my $text; 
*my $line;*
print "Введите запись\n"; 
*$line = <STDIN>;*
{
local $/; 
open(FILE,">>",'c:\\f1.txt') or die "Не могу открыть файл: $!";
*if (!print FILE $line, "\n")*
 {warn "ошибка при записи в файл f1.txt:$!;"}
close(FILE) or die "Не могу закрыть файл: $!";
}
print "Запись добавлена\n".$text;
спустя 59 секунд [обр] Нютик[досье]
Эх, хотела выделить жирным то что добавила:)
Поэтому звездочки не в счет:)
спустя 3 часа 48 минут [обр] Нютик[досье]

В общем я снова застряла:) Пытаюсь найти в интернете нечто, с помощью чего можно открыть каталог и просмотреть данные в нем.
Думаю сделать следующее: при запуске приложения выводится что-то наподобии меню с перечнем файлов


1 - f1.txt
2 - f2.txt
3 - f3.exe
f1: 1 - чтение
    2 - запись
    3 - дозапись
f2: 1 - чтение
f3: 1 - выполнение


а потом естественно все это соеденить с вышепроделанным:)

спустя 28 минут [обр] Нютик[досье]
#!/usr/bin/perl
use strict; 
my @files;
opendir(DIR, "C:\\papka");
@files = sort(grep(/pl$/, readdir(DIR)));
closedir(DIR); 
foreach (@files) {print("$_\n") unless -d;}

Не получается:(
спустя 4 часа 27 минут [обр] Алексей Севрюков(198/1280)[досье]
Нютик[досье] нет такой ошибки "не получается". Есть ошибка "не запускается вообще", "не выводит список файлов, хотя они присутствуют в папке" и т.д. И где у Вас проверка на ошибки opendir?
спустя 2 часа 11 минут [обр] Нютик[досье]
Ну оно же и без прописанной ошибки работает (хотя у себя после Вашего замечания, Алексей Севрюков[досье], я прописала).. Как я понимаю, он ее видит, но хотелось бы чтобы выводилось ее содержимое.. А что именно добавить надо не могу понять
спустя 9 часов [обр] Алексей Севрюков(198/1280)[досье]
Нютик[досье] Так, у Вас скрипт ищет файлы, оканчивающиеся на pl, фактически - Perl-скрипты. Они у Вас имеются в заданной папке?
спустя 1 час 55 минут [обр] Нютик[досье]
Алексей Севрюков[досье], нет. У меня там только 2 файлика с которыми я работала до этого: f1, f2
спустя 1 час 16 минут [обр] Алексей Севрюков(198/1280)[досье]
Нютик[досье] Ну так, а что Вы тогда хотите )))
Убираем grep, именно он фильтрует результат:
#!/usr/bin/perl
use strict; 

opendir(DIR, "C:\\papka") or die "Can't open dir: $!";
foreach( sort (readdir(DIR)) )
 {
  print "$_\n" unless -d; # выводим всё кроме директорий
 }
closedir(DIR) or die "Can't close dir: $!";
спустя 1 час 34 минуты [обр] Нютик[досье]
Получается что grep фильтрует их по pl? И если бы они у меня там были, то он выводил бы их?
спустя 22 часа [обр] Алексей Севрюков(198/1280)[досье]
Нютик[досье] Да. Читайте ман perldoc grep )))
Powered by POEM™ Engine Copyright © 2002-2005