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

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> регулярные выражения, операции над строками 
:(
    Опции темы
SkyFlex
Дата 1.4.2006, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как выделить под строковую переменную определенную длинну.
например $: = "$name $adress"
необходимо чтобы переменная $name всегда занимала 20 символов в строке.
smile
PM MAIL   Вверх
korob2001
Дата 1.4.2006, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Код

my $name = sprintf("%20s", "Denis");



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Ivan Kolesnikov
Дата 3.4.2006, 06:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 9.3.2005
Где: г. Новокузнецк

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



Или
Код

my $name = sprintf("%-20s", "Denis");

Если пробелы нужно добавлять справа, а не слева
--------------------
PM MAIL ICQ   Вверх
SkyFlex
Дата 3.4.2006, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а равное количество пробелов справа и слева можно ставить с помощью sprintf?
PM MAIL   Вверх
korob2001
Дата 3.4.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Цитата(SkyFlex @ 3.4.2006, 14:41 Найти цитируемый пост)
а равное количество пробелов справа и слева можно ставить с помощью sprintf?

А зачем тебе? smile


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
SkyFlex
Дата 4.4.2006, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ну да...в принципе мне это не нужно...так для сведения )
подскажите мне лучше как действуют enable и disable.
естьпроцедура sub a {...}, которая выполняет ряд действий.
возможно ли сделать enable(a) или disable(a).
А над блоком можно ли произвести подобные действия?
И как можно задать приоритет на выполнение процедур?

Это сообщение отредактировал(а) SkyFlex - 4.4.2006, 10:18
PM MAIL   Вверх
SkyFlex
Дата 4.4.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Обрабатываю строки:
'Иван Петров'
'ИВАН Петров'
'иван ПЕТРОВ'
'Петр иванов'
и т.д. множество имен и фамилий.
Необходимо если встретится имя иван вне зависимости от регистра обработать и вывести в файл фамилию.
Подскажите регулярное выражение

Это сообщение отредактировал(а) SkyFlex - 4.4.2006, 13:36
PM MAIL   Вверх
sharq
Дата 4.4.2006, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

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



SkyFlex,
Код

/\bиван\b/i


На некоторых машинах, придется установить локаль:
Код

use locale;
use POSIX qw (locale_h);
setlocale(LC_CTYPE, 'ru_RU.CP1251');
setlocale(LC_ALL, 'ru_RU.CP1251');


smile



--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
BlackLFL
Дата 12.4.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(SkyFlex @ 4.4.2006, 10:54 Найти цитируемый пост)
подскажите мне лучше как действуют enable и disable.
естьпроцедура sub a {...}, которая выполняет ряд действий.
возможно ли сделать enable(a) или disable(a).


perldoc lock
Цитата

    lock THING
            This function places an advisory lock on a shared variable, or
            referenced object contained in *THING* until the lock goes out
            of scope.

            lock() is a "weak keyword" : this means that if you've defined a
            function by this name (before any calls to it), that function
            will be called instead. (However, if you've said "use threads",
            lock() is always a keyword.) See threads.


PM WWW   Вверх
SkyFlex
Дата 4.5.2006, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



$_='Дождь на улице'
@x=split(/ /,$_);
#необходимо убрать из массива @x элементы длина которых меньше 3
#т.е. в данном примере 'на'
Подскажите, пожалуйста, если ли функция исключения из массива элементов... 

Это сообщение отредактировал(а) SkyFlex - 4.5.2006, 16:59
PM MAIL   Вверх
korob2001
Дата 5.5.2006, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Насчёт вывода фиксированной строки выровненной по центру, написал такую подпрограмму:
Код
#!/usr/bin/perl -w
use strict;

sub  fixed_string {
    my $str   = shift || "";
    my $len   = shift || 80;
    my $align = shift || "left";
    return "" unless $str;
    if ( lc($align) eq "left" ) {
         return sprintf("%-${len}s", $str);
    } elsif ( lc($align) eq "right" ) {
         return sprintf("%${len}s", $str);
    } else {
         my $l = int( ($len / 2) - (length($str) / 2) );
         return sprintf("%${len}s", " " x $l . $str . " " x $l);
    }
}

my $name = fixed_string("Denis", 20, "center");
print "xxx\[$name\]xxx";

По поводу исключения елементов массива, длина которых меньше 3-х символов, то было бы не плохо создать отдельную тему для данного вопроса. Пожалуйста, соблюдайте правила форума.
Исключить такие элементы можно пройдя в цикле по всему массиву и одбросить не нужные елементы. Например:
Код
#!/usr/bin/perl -w
use strict;

# Тестовый массив
my @arr = ("This", "is", "a", "array");
# Массив в который будем
my @res = ();
# Минимально допустимая длина элемента, в символах
my $min = 3;

for (@arr) { push(@res,$_) if length($_) >= $min };

# выводим содержимое массива
print join("\n", @res);
  

Это сообщение отредактировал(а) korob2001 - 5.5.2006, 23:25


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
alyam
Дата 22.8.2006, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



обрабатываю строки:
'^(.*) (рубль|рублей|рубля)\.$';

нужно вывести $1 $2, 
$2 при этом должно быть в верхнем регистре. подскажите пожалуйста. 
Можно конечно использовать схему =~s///, мб есть проще способ?
PM MAIL   Вверх
Nab
Дата 22.8.2006, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(alyam @  22.8.2006,  02:16 Найти цитируемый пост)
обрабатываю строки:
'^(.*) (рубль|рублей|рубля)\.$';
Как именно?

Цитата(alyam @  22.8.2006,  02:16 Найти цитируемый пост)
нужно вывести $1 $2, 
что мешает?

Цитата(alyam @  22.8.2006,  02:16 Найти цитируемый пост)
$2 при этом должно быть в верхнем регистре. подскажите пожалуйста. 
 Смотрите функции uc, ucfirst, lc, lcfirst и sprintf.


Цитата(alyam @  22.8.2006,  02:16 Найти цитируемый пост)
Можно конечно использовать схему =~s///, мб есть проще способ?
Куда уж проще smile


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
alyam
Дата 22.8.2006, 04:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



вывести надо в переменную $:
$:="$1 $2"
и как тут использовать функцию uc?

Это сообщение отредактировал(а) alyam - 22.8.2006, 04:15
PM MAIL   Вверх
amg
Дата 22.8.2006, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Например:
$: = "$1 " . uc($2);
(точка - оператор конкатенации (слияния) строк).
Чтобы это работало с русскими буквами, нужно подключить локаль (см. выше).

Это сообщение отредактировал(а) amg - 22.8.2006, 06:58
PM MAIL   Вверх
alyam
Дата 22.8.2006, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



локаль пытаюсь установить, как выше указано - выдается ошибка:
#perl: Can't locate loadable object for module POSIX in @INC (@INC contains: . D:/MMC D:/MMC) at main.c line 50 BEGIN failed--compilation aborted at D:/MMC /mmc.ini line 9.

даже если я posix.pm скопирую, и xsloader.pm в d:/mmc

PM MAIL   Вверх
amg
Дата 22.8.2006, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



С локалью лучше разобраться, жить будет проще. А уж если не получится, то в крайнем случае можно сделать свой uc.
Код

...
$: = "$1 " . uc_my($2);
...
sub uc_my {
  my $str = shift;
  $str =~ tr/ёйцукенгшщзхъфывапролджэячсмитьбю/ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ/;
  return $str;
}

PM MAIL   Вверх
rschnz
Дата 22.8.2006, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вопрос по регулярным выражениям smile

Имеется некоторый сайт, в html которого есть несколько блоков (упрощенно) <aaa> text </bbb>, т.е. известны маркеры начала и конца блоков, текст которых необходимо выделить. 

Проблема в том, что text - это произвольный текст, в котором - единственное, что известно - не встречается маркер конца. Если бы это был, например, некоторый URL, то я сделал бы так:
Код

my @imgs = $html =~ m/<a href="([^"]+jpg).*"/ig;

В моем же случае вместо " надо поставить слово - маркер конца. Но [] ведь только для символов smile Подскажите рациональный способ сделать это, желательно с использование regex.
PM MAIL   Вверх
amg
Дата 23.8.2006, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата
... есть несколько блоков (упрощенно) <aaa> text </bbb>, т.е. известны маркеры начала и конца блоков, текст которых необходимо выделить. ... text - это произвольный текст, в котором - единственное, что известно - не встречается маркер конца.

Код
$block = '<aaa> text </bbb>';

# Самое простое
$block =~ m/<aaa>(.+?)<\/bbb>/;

# Если маркеров конца может быть несколько
$block =~ m/<aaa>(.+?)<\/(?:bbb|ccc|ddd)>/;

PM MAIL   Вверх
alyam
Дата 26.8.2006, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



подскажите как сделать:

в файле несколько строк.
каждая строка обрабатывается и выводится на экран.
нужно если строка содержит многоточие в начале, то ее необходимо добавить к предыдущей и вывести в одну строку.
как это сделать? запоминать строку, затем проверять следующую строку на наличие многоточия и выводить в зависимости от этого ? 
помоему не рационально, потому что первая строка выводится вне зависимости от того какая за ней следует.
можно ли перенести строку с многоточием на строчку выше? как проигнорировать символ перевода строки? ))
PM MAIL   Вверх
Nab
Дата 26.8.2006, 05:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(alyam @  26.8.2006,  02:54 Найти цитируемый пост)
можно ли перенести строку с многоточием на строчку выше? как проигнорировать символ перевода строки? ))

Это элементарно, Ватсон, просто не выводить его....  smile

А идея такова:
Код

# этот переключатель чтобы не выводить перевод строки в самом начале
$first = 1;
#читаем файл
open FILE, "<file.txt" || die "Cannot open file.txt $!";
while (<FILE>) {
# убираем перевод строки
    chomp;
# выводим его если не многоточие или не первая строка
    print "\n" unless /^\s*\.+/ && $first;
# выводим саму строку.
    print;
# не первая строка
    $first &&= 0;
}
# Ну и вывод завершающего перевода строки, по необходимости...
print "\n";

1;


Я код не проверял, но идея должна быть понятна ...


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
alyam
Дата 26.8.2006, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



с файлом работает. а если это например чат, в котором аналигичным образом надо обработать строки, тогда получится что выводится строка сама по себе, потом я снова вывожу ее print  $_ (притом без цвета !).
PM MAIL   Вверх
Nab
Дата 26.8.2006, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А поподробней можно?


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
alyam
Дата 26.8.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



объяснять долго и сложно. если интересно почитай тут http://haali.cs.msu.ru/mmc/sample.mmcrc
PM MAIL   Вверх
nitr
Дата 26.8.2006, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

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



alyam, новую тему запости...


--------------------
PM   Вверх
Nab
Дата 26.8.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(alyam @ 26.8.2006,  14:17)
объяснять долго и сложно. если интересно почитай тут http://haali.cs.msu.ru/mmc/sample.mmcrc

Отвечать  долго и сложно, если хочешь, купи себе книжку...

А если нужен ответ, то будьте добры изложите свою проблему....


--------------------
 Чтобы правильно задать вопрос нужно знать больше половины ответа...
Perl Community 
FREESCO in Ukraine 
PM MAIL   Вверх
alyam
Дата 26.8.2006, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



хорошо попытаюсь объяснить.
Триггеры.
Триггеру передаются запрошенные совпадения ($1-$9) и пришедшая от сервера строка, на которую этот триггер настроен. (На самом деле триггеру передаются 2 строки: $_ - это строка без цветов, и $; -  строка с цветами во внутреннем формате mmc.) Триггер МОЖЕТ изменять эти строки, но:
    1) это не рекомендуется
    2) если триггер изменяет строки, он должен сам следить за соответствием строк $_ и $;
Кроме того, существует специальная переменная, $:. Из нее нельзя читать, но ей можно присваивать, и если ей присвоить строку с цветами, то эта строка попадет и в $;, а в $_ будет записана эта же строка без цветов.

пример:
trig {CODE} '.*';
#триггер будет обрабатывать каждую строку приходящую от сервера
если стока начинается с многоточия, как проигнорировать символ перевода строки?

т.е. если написать
trig {chomp} '.*';
или trig {chomp} $_, что одно и тоже
то это не приведет ни к какому результату

Это сообщение отредактировал(а) alyam - 26.8.2006, 19:51
PM MAIL   Вверх
korob2001
Дата 26.8.2006, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



alyam - создайте новый топик.
Модератор: Читаем правила форума. Один топик - один вопрос.
Тема закрыта.




--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Страницы: (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.0764 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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