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


Автор: SkyFlex 1.4.2006, 10:58
Как выделить под строковую переменную определенную длинну.
например $: = "$name $adress"
необходимо чтобы переменная $name всегда занимала 20 символов в строке.
smile

Автор: korob2001 1.4.2006, 13:36
Код

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

Автор: Ivan Kolesnikov 3.4.2006, 06:32
Или
Код

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

Если пробелы нужно добавлять справа, а не слева

Автор: SkyFlex 3.4.2006, 17:41
а равное количество пробелов справа и слева можно ставить с помощью sprintf?

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

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

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

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

Автор: sharq 4.4.2006, 18:33
SkyFlex,
Код

/\bиван\b/i


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

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


smile

Автор: BlackLFL 12.4.2006, 15:26
Цитата(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.


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

Автор: korob2001 5.5.2006, 23:24
Насчёт вывода фиксированной строки выровненной по центру, написал такую подпрограмму:
Код
#!/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-х символов, то было бы не плохо создать отдельную тему для данного вопроса. Пожалуйста, соблюдайте http://forum.vingrad.ru/index.php?act=SR&f=27.
Исключить такие элементы можно пройдя в цикле по всему массиву и одбросить не нужные елементы. Например:
Код
#!/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);
  

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

нужно вывести $1 $2, 
$2 при этом должно быть в верхнем регистре. подскажите пожалуйста. 
Можно конечно использовать схему =~s///, мб есть проще способ?

Автор: Nab 22.8.2006, 02:41
Цитата(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

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

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

Автор: alyam 22.8.2006, 12:56
локаль пытаюсь установить, как выше указано - выдается ошибка:
#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

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

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

Автор: rschnz 22.8.2006, 20:58
Вопрос по регулярным выражениям smile

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

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

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

В моем же случае вместо " надо поставить слово - маркер конца. Но [] ведь только для символов smile Подскажите рациональный способ сделать это, желательно с использование regex.

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

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

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

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

Автор: alyam 26.8.2006, 02:54
подскажите как сделать:

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

Автор: Nab 26.8.2006, 05:08
Цитата(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;


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

Автор: alyam 26.8.2006, 13:02
с файлом работает. а если это например чат, в котором аналигичным образом надо обработать строки, тогда получится что выводится строка сама по себе, потом я снова вывожу ее print  $_ (притом без цвета !).

Автор: Nab 26.8.2006, 13:30
А поподробней можно?

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

Автор: nitr 26.8.2006, 15:16
alyam, новую тему запости...

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

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

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

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

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

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

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


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