URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2391
[ Назад ]

Исходное сообщение
"Можноли сократить..??"

Отправлено xtc , 16-Дек-03 01:00 
мне нужно все пробелы подряд заменить на 1 пробел

типа:
1071360152.546    219 192.168.0.141 TCP_MISS/304 95 GET http://linux.perm.ru/projects/sams/img/1.jpg - DEFAULT_PARENT/212.192.101.11 -
на:
1071360152.546 219 192.168.0.141 TCP_MISS/304 95 GET http://linux.perm.ru/projects/sams/img/1.jpg - DEFAULT_PARENT/212.192.101.11 -

Пробовал всякое разное, :) первое что придумал вот :))

$line =~ s/(\s\s\s\s\s\s)|(\s\s\s\s\s)|(\s\s\s\s)|(\s\s\s)|(\s\s)|(\s)/ /g;

Можно ли это сократить? я просто не мог понять как сделать чтоб сразу несколько на один, кроме этого :(((((


Если можно, помагите.

Заранее очень благодарен.


Содержание

Сообщения в этом обсуждении
"Можноли сократить..??"
Отправлено XMan , 16-Дек-03 01:21 
Лаба что ли ? У меня товарищ недавно тоже перл проходил в универе. Говорит, там народ приносил километры бумаги, на которых было решение задания, типа такого:

Найти в тексте все строки, в которых третье слово содержит 3 буквы n подряд или больше чем 5 букв m в произвольном порядке, и вывести эти строки.

Хотя это всё укладывается в одно одну строку условия. Судя по всему, твоё решение из той же оперы :)

---

$line =~ s/\s+/ /g;

Можно более правильно, но менее красиво:

$line =~ s/\s{2,}/ /g;

PS. И не забывай делать chomp($line) перед обработкой, а то ведь перенос - это тоже пробельный символ. Или замени \s на пробел, если уверен, что табуляции нигде в строке нету :)


"Можноли сократить..??"
Отправлено xtc , 16-Дек-03 01:35 
>$line =~ s/\s+/ /g;

Вроде пробовал так, щас еще проверю


>Можно более правильно, но менее красиво:
>
>$line =~ s/\s{2,}/ /g;
>
>PS. И не забывай делать chomp($line) перед обработкой, а то ведь перенос
>- это тоже пробельный символ. Или замени \s на пробел, если
>уверен, что табуляции нигде в строке нету :)

Пишу прогу для обработки логов сквида в реальном времени..... Ж)))

А вот такую херь плохо кушаю :))
Щас еще раз проверю $line =~ s/\s+/ /g; Ну помойму делал так.


"Можноли сократить..??"
Отправлено xtc , 16-Дек-03 01:38 
>$line =~ s/\s+/ /g;

Сработало :)) Я заместо плюса ставил * Ж)) и плюс ставил спереди :))

>Можно более правильно, но менее красиво:
>
>$line =~ s/\s{2,}/ /g;

Спасиб..  просто уже так давно сижу, разбирался с File::Tail :))

И я в общем говоря всегда плохо понимал все Эти замены :)) не всегда они мне надобились. :)

Спасиб еще раз.


"Можноли сократить..??"
Отправлено xtc , 16-Дек-03 01:43 
>
>$line =~ s/\s{2,}/ /g;

а можно расшифровать Это?? что к чему 2 и запятая?


"Можноли сократить..??"
Отправлено OldOwl , 16-Дек-03 10:48 
>>$line =~ s/\s{2,}/ /g;
>
>а можно расшифровать Это?? что к чему 2 и запятая?

{2,} - "2 и более".
Можно юзать по-разному:
{N} - ровно N
{N,M} - от N до M
и т.д.


"Можноли сократить..??"
Отправлено xtc , 16-Дек-03 16:12 
>>>$line =~ s/\s{2,}/ /g;
>>
>>а можно расшифровать Это?? что к чему 2 и запятая?
>
>{2,} - "2 и более".
>Можно юзать по-разному:
>{N} - ровно N
>{N,M} - от N до M
>и т.д.

Спасибо.


"Можноли сократить..??"
Отправлено XMan , 16-Дек-03 23:28 
Может я чего не понял, но для разбора лога сквида проще пользовать split :

@ar=split(/\s+/,$line);

А еще лучше делать примерно так:

while (<>) {
  ($time,...........)=split(/\s+/);
  # обработка полученных значений
};

:)