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;


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

sasha999 ★★★★
()
Ответ на: комментарий от sdio

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

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

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

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


WinLin
() автор топика
Ответ на: комментарий от WinLin

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

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

kto_tama ★★★★★
()
Ответ на: комментарий от WinLin

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

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

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

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

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

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

Hjorn
()
Ответ на: комментарий от Hjorn

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

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

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

WinLin
() автор топика
Ответ на: комментарий от WinLin

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

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

Hjorn
()
Ответ на: комментарий от Hjorn

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

хм а это почему?

ode
()
Ответ на: комментарий от ode

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

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

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

WinLin
() автор топика
Ответ на: комментарий от WinLin

Поставил Net::LDAP 0.34 от 11.02.2007.
use Net::LDAP 0.34;

Результат такой же.

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