Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопросы новичка, подскажите что не так 
:(
    Опции темы
Firer
Дата 14.11.2008, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.11.2008
Где: Донецк, Украина

Репутация: нет
Всего: нет



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

Код

#!/usr/bin/perl -w

open (MYFILE, ">>с:\\forperl.txt") || die "$!";
@stuff=<MYFILE>;
#
print "@stuff";
print scalar(@stuff);
foreach (reverse(@stuff)) {
    print scalar(reverse($_));
        print MYFILE "scalar(reverse($_)) \n";
        if (!print MYFILE scalar(reverse($_)), "\n" ) {
        warn "Writing error to file forperl.txt: $!"}

}
close(MYFILE);
exit 0


Смысл в том, чтобы открыть файл на дозапись, после перекрутить все строки.
Проблема в том, что @stuff ничего не получает, но при этом предупреждений и ошибок нет.
Файл с:/forperl текстовый, в нем строки, разделенные символом переноса.

PS Подскажите также, что можно сделать, чтобы нормально отображалась кириллица при запуске?

Это сообщение отредактировал(а) Firer - 14.11.2008, 15:19
PM MAIL   Вверх
demond
Дата 14.11.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 20.2.2008

Репутация: нет
Всего: нет



Скрипт не запускал, а пробежался только взглядом:
1) путь к файлу c:\\forperl
2) его надо открыть на дозапись, а у вас открыт на чтение;
3) имена переменных вынести из кавычек.

Думаю этого будет достаточно, чтобы скрипт заработал.

PS Если скрипт не работает, имеет смысл писать текст ошибки.

Это сообщение отредактировал(а) demond - 14.11.2008, 15:18
PM MAIL   Вверх
ginnie
Дата 14.11.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Firer, предлагаю свой вариант

Код

#!/usr/bin/perl

use strict;
use warnings;

open (MYFILE, '+<', 'forperl.txt') or die "$!";
my @lines = <MYFILE>;
print @lines;
print scalar(@lines), $/;
seek MYFILE, 0, 0;
for my $line (reverse(@lines)) {
    chomp $line;
    my $reversed_line = reverse($line);
    print $reversed_line, $/;
    print MYFILE $reversed_line, $/;
}
close(MYFILE);
exit 0;



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Firer
Дата 14.11.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.11.2008
Где: Донецк, Украина

Репутация: нет
Всего: нет



demond, 


Цитата

1) путь к файлу c:\\forperl

без разницы. Windows и MS-DOS позволяют такие пути. Обратная наклонка (/), как и есть альтернатива для (\\) для путей.
Цитата

2) его надо открыть на дозапись, а у вас открыт на чтение;

С этим стратил, кинул стаурю версию. Уже отредактировал.
Цитата

3) имена переменных вынести из кавычек.

где именно? Если там, где print то это позволяет элементы матрицы при выводе разделять пробелами. 

Повторюсь еще раз 
Код
 print scalar(@stuff); 
 выдает 0, то есть пустую матрицу

Добавлено @ 15:27
ginnie, 

спасибо за вариант. Попробую запустить.
Но я только изучаю перл по книге "Perl за 24 часа" и хотел бы понять что именно не так в этой мелкой проге.
Плохо то, что книга отсканированная и ручной коррекции ошибок не было. Поэтому все казусы приходится искать самому

Добавлено @ 15:31
Цитата(demond @  14.11.2008,  15:11 Найти цитируемый пост)
PS Если скрипт не работает, имеет смысл писать текст ошибки.

Это сообщение отредактировал(а) demond - 14.11.2008, 15:18 


В том то и оно, что все ОК. Ни ошибок, ни придупреждений

Это сообщение отредактировал(а) Firer - 14.11.2008, 15:32
PM MAIL   Вверх
demond
Дата 14.11.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 20.2.2008

Репутация: нет
Всего: нет



код вида:
Код

print "@staff";

считается плохим тоном.
PM MAIL   Вверх
ginnie
Дата 14.11.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



demond, 0 выдается из-за '>>', т.к. это открытие файла только для добавления, чтение из файла не разрешено, но ошибка при чтении не выдается.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Firer
Дата 14.11.2008, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.11.2008
Где: Донецк, Украина

Репутация: нет
Всего: нет



Цитата(demond @  14.11.2008,  15:32 Найти цитируемый пост)
код вида:
Выделить всёкод Perl
1:
    
print "@staff";

считается плохим тоном. 


Аналог какой? 
Код

print @staff;

даст без пробелов, а еще один цикл добавлять не хочется. Если какой-то красивый аналог

Добавлено через 2 минуты и 34 секунды
ginnie, 
Все понятно. Дурдом. Не ожидал такого подвоха. Понимал, что вся проблема в этой строке, но ошибок не находил. Маленький еще  smile 
PM MAIL   Вверх
demond
Дата 14.11.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 20.2.2008

Репутация: нет
Всего: нет



ginnie, я знаю. Когда я писал комментарий файл вообще открывался на чтение.

Firer, например, так:
Код

foreach (@stuff) {print $_," ";}

PM MAIL   Вверх
Firer
Дата 14.11.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.11.2008
Где: Донецк, Украина

Репутация: нет
Всего: нет



Кстати может у кого-то есть книга Perl за 24 часа в электронном виде и хорошем качестве?

Это сообщение отредактировал(а) Firer - 14.11.2008, 15:38
PM MAIL   Вверх
ginnie
Дата 14.11.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Firer, аналогов несколько

Код

print join(' ', @staff);


Код

{
    local $, = ' ';
    print @staff;
}


Добавлено через 59 секунд
demond, извини, про open это я не тебе, а Firer! 


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Firer
Дата 25.11.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.11.2008
Где: Донецк, Украина

Репутация: нет
Всего: нет



Задание № 2

Написать короткую программу, которая бы:
  •  открывала файл
  • считывала его строки в массив
  • извлекала строки из каждой строки
  • находила все слова с количество смежных букв 4 и более, например yardstisck, thoughts;
Мой вариант такой:
Код

#!/usr/bin/perl -w

open(MY, "C:/squid.txt");
@file=<MY>;
@words=map {split ' ',$_} @file;
$j=0;

for ($i=0; $i<=scalar(@words); $i++) {
        if ($words[$i]=~m/[bcdfghjklmnpqrstvwxz]{4,99}/i){
           $new[$j]=$words[$i];
           $j++;
        }
}
print join("\n", @new);


Может кто-то подскажет как сделать лучше. Буду очень благодарен

PS Единственное но. Появляется сообщение: Use of unitilizad value within @words in pattern match at script.pl line 10, <MY> line 374

Это сообщение отредактировал(а) Firer - 25.11.2008, 15:37
PM MAIL   Вверх
n4n0bit
Дата 25.11.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 19.6.2008

Репутация: нет
Всего: 1



Код

#!/usr/bin/perl
use strict;
use warnings;

while( <> )
{
    chomp;
        
    foreach my $r ( split /\s+/ )
    {
        if( $r =~ /pass/ )
        {
            print "$r\n";
        }
    }
}


Это сообщение отредактировал(а) n4n0bit - 25.11.2008, 16:46
PM MAIL WWW Jabber   Вверх
ginnie
Дата 25.11.2008, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Код

use strict;
use warnings;

open(MY, "filesplit.txt");
my @file=<MY>;
print join($/, (grep /[bcdfghjklmnpqrstvwxz]{4}/i, (map {split /\W+/} @file)));
close MY;



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
amg
Дата 25.11.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



n4n0bit, Ваш код будет работать, если в каждой строке только одно слово, а это условием не предполагается

Firer, предупреждение, о котором Вы говорите, появляется из-за превышений границ массива.
Нужно $i<@words; либо $i<=$#words;

Полная аналогия Вашему коду, но покороче
Код
print join "\n", grep {/[bcdfghj-np-tvwxz]{4,}/} map {split} <>;

и немного аккуратнее с определением "слово"
Код
while (<>) {
  push @new, grep {/[^aeiouy]{4,}/i} /\b([a-z]+)\b/ig;
}
print join("\n", @new);


PM MAIL   Вверх
n4n0bit
Дата 25.11.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 19.6.2008

Репутация: нет
Всего: 1



Код

perl -e 'print join($/, (grep /[pass]{4}/i, (map {split /\W+/} <>)));' FileName


amg - я с вами не согласен.

Это сообщение отредактировал(а) n4n0bit - 25.11.2008, 16:58
PM MAIL WWW Jabber   Вверх
amg
Дата 25.11.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



ginnie как всегда успел вперед. И верно заметил, что достаточно {4}.
PM MAIL   Вверх
Firer
Дата 25.11.2008, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.11.2008
Где: Донецк, Украина

Репутация: нет
Всего: нет



smile 
Всем спасибо, у меня глаза разбегаются.

Только для меня кое-что немного сложновато. Особенно функция в функции

Я по привычке делаю все формально. Мозги вообще пока таким образом не работают.

Добавлено через 9 минут и 31 секунду
Как сделать шаблон для поиска времени по которому будут проходить форматы такого типа как 
  • 12:00am
  • 5:00pm
  • 8:30AM

и чтобі не проходили  3:00, 2:60am, 99:00am, 3:0am


Мой вариант
Код

m/\d[0-12][\s]?\:[\s]?\d[00-59][\s]?(a|p)m/i

формат: число от нуля до 12, потом необязательный пробел, потом ":", необязательный пробел, две цифры от 00 до 59, необязательный пробел, am или pm без учета регистра

Проблема в том, что необ. пробел не учитывается.

Может кто, что подскажет. Буду благодарен

Если напишите свой вариант, сделайте для меня формат, как сделал я
PM MAIL   Вверх
tolkien
Дата 26.11.2008, 03:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: 4
Всего: 4



Этот пример идет у вас для обучения регулярным выражениям? 

Если нет, то к чему такие сложности? Возмите простое рег выражение, а дальше сделайте проверку по конкретным полям как вам нужно.
PM MAIL   Вверх
Itsys
Дата 26.11.2008, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

Репутация: 2
Всего: 34



Регулярка должна быть немного другой:
Код

m/(1[0-2])?([0\s]9)?[\s]?\:[\s]?[0-5][0-9][\s]?(a|p)m/i


Не тестировал....
PM MAIL WWW Skype   Вверх
amg
Дата 26.11.2008, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(Firer @  25.11.2008,  17:39 Найти цитируемый пост)
Только для меня кое-что немного сложновато. Особенно функция в функции
Не обязательно воспринимать выраженя с map и grep как функция в функции. Мне, например, проще рассматривать их как конвейер: список пропускается через map/grep/sort, результат (тоже список) поступает следующей map/grep/sort и т.д. Такой подход позволяет делать более краткий и лучше читаемый код, чем с использованием циклов.

Цитата(Firer @  25.11.2008,  17:39 Найти цитируемый пост)
Как сделать шаблон для поиска времени по которому будут проходить форматы такого типа как
Здесь я согласен с tolkien: не нужно, хотя, как правило и можно, впихнуть все в регулярное выражение. Гораздо понятнее
Код
print "Valid date" if /(\d+):(\d+)\s*[ap]m/ && $1<=12 && $2<60;

PM MAIL   Вверх
n4n0bit
Дата 26.11.2008, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 19.6.2008

Репутация: нет
Всего: 1



amg красиво   smile 
PM MAIL WWW Jabber   Вверх
Firer
Дата 26.11.2008, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 3.11.2008
Где: Донецк, Украина

Репутация: нет
Всего: нет



amg, 

 
Код

print "Valid date" if /(\d+):(\d+)\s*[ap]m/ && $1<=12 && $2<60;


smile Здесь все знакомо, но что можно так не додумался

Хотя мне кажется или нет, что 03:0 AM тоже пройдет. и нужно ли здесь ставить \: вместо :
может тогда лучше

Код

print "Valid date" if /(\d+)\:(\d)\d\s*[ap]m/ && $1<=12 && $2<6;



Это сообщение отредактировал(а) Firer - 26.11.2008, 11:02
PM MAIL   Вверх
ginnie
Дата 26.11.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Код

print "Valid date" if /(\d{1,2}):(\d{2})\s*[ap]m/ && $1<=12 && $2<60;



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0664 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.