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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Читаю Фридла, есть вопрос, по поводу задачи о повторяющихся словах 
:(
    Опции темы
russians
Дата 20.7.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

#!/bin/perl

$/ = ".\n"; # Особый режим чтения: фрагменты завершаются комбинацией символов "точка-новая строка"

while(<>)
{
        next unless s
        {

                \b
                        ( [a-z]+ )

                        (
                                (
                                        \s
                                        |
                                        <[^>]+>
                                )+
                        )
                (\l\b)

        }
"\e[7m;1\e[m;2\e[7m;4\e[m".igx;

s/^([^\e]*\n)+//mg;
s/^/$ARGV; /mg;
print;
}



Вот как то медленно до меня доходит логика поиска, особенно последние строчки.
"\e[7m;1\e[m;2\e[7m;4\e[m".igx; - что это такое?
Фридл пишет, что это цветовое выделение, но почему именно такой странный способ?
и почему \e[7m;1, а не \e[7m;$1?

s/^([^\e]*\n)+//mg;
s/^/$ARGV; /mg; - что это такое?

всё, что выше - в принципе ясно.

заранее благодарен

p.s. модераторы, если не трудно - перенесите тему в раздел Perl, пожалуйста smile

Это сообщение отредактировал(а) russians - 20.7.2010, 18:09
PM MAIL   Вверх
spin2
Дата 20.7.2010, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 15.12.2005
Где: Москва-Одесса

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



Цитата

"\e[7m;1\e[m;2\e[7m;4\e[m"

Это escape-последовательности. Зачем такой странный способ - может просто, чтобы поразить воображение читателя. А иногда escape-последовательности действительно полезны.
Цитата

s/^([^\e]*\n)+//mg;
s/^/$ARGV; /mg;

Это из раздела про регулярные выражения. s/// - делает замену того, что подходит под шаблон, заданный между первыми слешами, в то, что прописано между вторыми слешами, при этом руководствуясь тем, что написано после слешей.
^ - начало строки, \e - ESCAPE, \n - перевод строки, * - 0 и  больше раз, + - один и больше раз.
  


--------------------
"С кем тяжело молчать, с тем не о чем говорить" (Метерлинк)
блог
Все об ICQ-ботах
PM MAIL WWW ICQ Skype Jabber   Вверх
russians
Дата 20.7.2010, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



spin2, я имел в виду последнюю строчку:
s/^/$ARGV; /mg;
был вопрос, откуда мы берём $ARGV smile
Сейчас уже нашёл smile
Мне понятно, что это escape-последовательности, просто непривычна запись, 

"\e[7m;    1    \e[m;    2        \e[7m;     4      \e[m"

1 2 4 здесь каким образом переменные? Здесь они просто числа...

имеется в виду, что мы выделяем $1 и $4, а $2 что посередине делает?

и откуда по коду мы берём 4? у нас 3 скобки smile

Это сообщение отредактировал(а) russians - 20.7.2010, 23:23
PM MAIL   Вверх
russians
Дата 22.7.2010, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так что, кто нибудь сможет объяснить причуды языка? smile
PM MAIL   Вверх
arto
Дата 22.7.2010, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



# perl -Mstrict -Wc =( cat )
#!/bin/perl
$/ = ".\n"; # Особый режим чтения: фрагменты завершаются комбинацией символов "точка-новая строка"
^D
Bareword "igx" not allowed while "strict subs" in use at /tmp/zshq8WVoB line 6.
/tmp/zshq8WVoB had compilation errors.
#

вы уверены, что точно привели код примера?
PM MAIL ICQ   Вверх
russians
Дата 24.7.2010, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, уверен.

Код

--- first.pl    2010-07-24 02:14:18.000000000 +0400
+++ second.pl    2010-07-24 02:15:21.000000000 +0400
@@ -1,69 +1,22 @@
-$/ = ".\n"; # (1) Особый режим чтения; фрагменты завершаются
-
-              #  комбинацией символов "точка-новая строка"
-
- 
-
-while (<>) # (2)
-
+#!/bin/perl
+$/ = ".\n"; # Особый режим чтения: фрагменты завершаются комбинацией символов "точка-новая строка"
+while(<>)
 {
-
-    next unless s # (3)
-
-    { # (Начало регулярного выражения)
-
-           # Отдельное слово
-
-        \b           # Начало слова
-
-           ( [a-z]+ ) # Сохранить слово в $1 (и \1)
-
- 
-
-        ### Дальше может следовать произвольное количество пропусков
-
-        ### и/или тегов
-
-        (            # Сохранить в $2
-
-           (            # ($3 - группировка для конструкции выбора)
-
-              \s        # пропуски (в том числе и символы новой строки)
-
-              |         # -или-
-
-              <[^>]+> # теги в угловых скобках
-
-              )+     # По крайней мере один из перечисленных элементов,
-
-                  # но может быть и больше.
-
+        next unless s
+        {
+                \b
+                        ( [a-z]+ )
+                        (
+                                (
+                                        \s
+                                        |
+                                        <[^>]+>
+                                )+
         )
-
- 
-
-        ### Снова искать первое слово:
-
-        (\1\b)       # \b гарантирует, что найденное слово
-
-                  # не находится внутри другого слова.
-
-        # (Конец регулярного выражения)
-
+                (\l\b)
     }
-
-    # После регулярного выражения следует строка замены
-
-    # с модификаторами /i, /g и /x.
-
-    “\e[7m;1\e[m;2\e[7m;4\e[m”.igx; # (4)
-
- 
-
-    s/^([^\e]*\n)+//mg;    # (5) Удалить непомеченные строки
-
-    s/^/$ARGV: /mg;        # (6) Начинать строку с имени файла
-
+"\e[7m;1\e[m;2\e[7m;4\e[m".igx;
+s/^([^\e]*\n)+//mg;
+s/^/$ARGV; /mg;
     print;
-
 }



first.pl - оригинал.
second.pl - то, что я привёл в начале.

P.S. Да, господа разработчики форума, а можете добавить в листинг подсветки цвета для diff? smile

Это сообщение отредактировал(а) russians - 24.7.2010, 14:11
PM MAIL   Вверх
arto
Дата 24.7.2010, 20:20 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



дело в том, что ваш скрипт не работает, выдает ошибку.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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