LINUX.ORG.RU

Perl регулярное выражение


0

0

Нужно преобразовать "Имя Отчество" в "И.О.".
Если имя_отчество состоит из двух слов, то преобразует нормально.
Для одного слова "Александр" выдает "А.р." или "..",
если покопаться в запросе (\w*\s*).
Почему-то не берет первый знак, а проверяет все выражение.

#!/usr/bin/perl

use strict;
use encoding "utf8";

#my $str = "Александр Михайлович";
my $str = "Александр";
$str =~ /^(.)\w+\s+(.)/;
print $1,".\n";
print $2,".\n";

1;


Re: Perl регулярное выражение

а чего ты хочешь-то ? во втором случае $str не попадает под regex, естественно $1 и $2 пустые . меняй программную логику.

sasha999 ★★★★ ()
Ответ на: Re: Perl регулярное выражение от sdio

Re: Perl регулярное выражение

Вот спасибо!
Заодно спрошу еще несколько моментов.

Зачем нужен \b, без него вроде работает:
my $sn="";
while ($str =~ /\s*(.)\w+/g) {
$sn = $sn . uc($1) . ".";
};

Чем нужно(рекомендуется) склеивать строки в Perl5?
Вроде в Perl6 точка используется для других целей.

use encoding "utf8";
Правильно использовать?


WinLin ()
Ответ на: Re: Perl регулярное выражение от WinLin

Re: Perl регулярное выражение

>>Чем нужно(рекомендуется) склеивать строки в Perl5?
вроде точка по жизни была

>>Вроде в Perl6 точка используется для других целей.
и откуда вы такие шустрые беретесь ?

kto_tama ★★★★★ ()
Ответ на: Re: Perl регулярное выражение от WinLin

Re: Perl регулярное выражение

> Зачем нужен \b, без него вроде работает.

Здесь не нужен. А вообще это метасимвол "граница слова". То есть позиция между \w и \W.

> Чем нужно(рекомендуется) склеивать строки в Perl5?

В твоём примере можно и конкатенацию делать (точкой). Но если нужно из множества мелких строк собрать одну большую, то эффективнее эти строки помещать в массив, а потом склеивать join'ом.

> use encoding "utf8"; Правильно использовать?

Правильно. Только если ты выводишь юникодные строки на stdout, то нужно ещё выполнять: binmode(STDOUT, ':utf8'); А при открытии файлов указывать правильную кодировку во втором аргументе open.

Hjorn ()
Ответ на: Re: Perl регулярное выражение от Hjorn

Re: Perl регулярное выражение

Ubuntu 6.0.6. Perl 5.8.7. Локаль - utf8.

Работаю c модулями Net::LDAP.
Эффекты разные:
- если не указывать use encoding "utf8", то можно найти английские
строки или поиск *.
- если указать use encoding "utf8", то найдено 0 строк.

LDAP вроде сразу выдает в utf8.
Что делать?

WinLin ()
Ответ на: Re: Perl регулярное выражение от WinLin

Re: Perl регулярное выражение

Возможно, что библиотека по каким то причинам не устанавливает utf8 флаг для получаемых данных. Поройся в документации для Net::LDAP, погугли на эту тему. Может быть нужно просто обновить модуль.

Вообще, прагма use encoding 'utf8' или просто use utf8 служит только для указания кодировки скрипта. То есть для того, чтобы строковые литералы распознавались правильно. Для данных, получаемых извне, нужно прикладывать дополнительные усилия, чтобы они были правильно поняты встроенными функциями Perl. По идее, об этом должна заботиться библиотека, получающая данные из некоторого источника.

Hjorn ()
Ответ на: Re: Perl регулярное выражение от ode

Re: Perl регулярное выражение

Это просто песня.
В интернете ничего похожего не нашел!

Поиск "(cn=*)" через Net::LDAP:
1) use encoding "utf8" - находит 0 записей;

2) без use encoding "utf8" - находит 159 записей,
при этом не работают регулярные выражения и строковые функции.

WinLin ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.