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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обрезать строку, Детский вопрос ввел меня в ступор 
:(
    Опции темы
rcdimon
Дата 2.11.2008, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем привет... Элементарнейшая задачка- есть строка, если она длинее определенного числа символов- обрезать ее.

В голову мне пришел сразу такой вариант

Код

$String =~ s/^(.{,40}).*/$1/m;


Но к моему удивлению он не работает.. Почему- не понимаю  smile 

Есть конечно вариант порезать тсроку на символы в помощью split и соединить в цикле первые 40 элементов... Но это уж совсем в лоб...

Есть красивое решение этой проблемы?
PM MAIL ICQ   Вверх
FooBar
Дата 2.11.2008, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Опытный
**


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

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



Я так и думал, что где-то туплю ) Бывает такое  smile 
PM MAIL ICQ   Вверх
kavkaz
Дата 2.11.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



{,40} – говорит выбрать до 40 символов, и якобы является максимальным квантификатором
.* – вот это точно максимальный квантификатор, и если вы сказали {,40}(обратите внимание на запятую), то он оставит этому квантификатору 0 симовлов, в то время как сам (.*) заберет все символы.

в общем запятую уберите и, кажется, будет вам счастье

ps не читал что то нигде чтоб у кантификаторов был приоритет "жадности", но кажется он есть 
PM MAIL ICQ Skype   Вверх
amg
Дата 2.11.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



FooBar правильно сказал:
$str = substr $str, 0, 40;

А регулярное выражение не работало по простой причине: нет квантификатора {,40}. Вот так работает:
$str =~ s/(.{40}).*/$1/;

Ну вот, пока писал и проверял, уже ответили.

Это сообщение отредактировал(а) amg - 2.11.2008, 14:32
PM MAIL   Вверх
zyxerr
Дата 5.11.2008, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



в дополнение к этому вопросу. У меня есть переменная $a. Ее значение меняется (50 или 75 или 100) и мне надо использовать это число как квантификатор.  Запись \s{$a} - не работает, как еще можно сделать?
PM MAIL   Вверх
KSURi
Дата 5.11.2008, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

C:\>perl -e"$a=10;$_=qr/\s{$a}/;print"
(?-xism:\s{10})
C:\>


Это сообщение отредактировал(а) KSURi - 5.11.2008, 17:41


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
ginnie
Дата 5.11.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Присоединяюсь к KSURi,

Код

perl -e 'my $factor = 3; my $string = "a" x 20; $string =~ /(a{$factor})/ and print $1, $/;'


Код

aaa



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Dima85
Дата 24.11.2008, 03:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый вечер.
А может есть альтернатива этому:
Код

if (length($user[1]) > 15) { $user[1] = substr($user[1], 0, 15) . qq~...~; } 

Работающая быстрее.
PM MAIL   Вверх
amg
Дата 24.11.2008, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Сильно быстрее -- вряд ли. Но попробуйте на всякий случай
Код
substr($user[1], 15) = '...' if length($user[1]) > 15;

Код
$user[1] =~ s/(.{15}).+/$1.../;

PM MAIL   Вверх
Dima85
Дата 24.11.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


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

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


 




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


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

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