мне нужно все пробелы подряд заменить на 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;
Можно ли это сократить? я просто не мог понять как сделать чтоб сразу несколько на один, кроме этого :(((((
Если можно, помагите.Заранее очень благодарен.
Лаба что ли ? У меня товарищ недавно тоже перл проходил в универе. Говорит, там народ приносил километры бумаги, на которых было решение задания, типа такого:Найти в тексте все строки, в которых третье слово содержит 3 буквы n подряд или больше чем 5 букв m в произвольном порядке, и вывести эти строки.
Хотя это всё укладывается в одно одну строку условия. Судя по всему, твоё решение из той же оперы :)
---
$line =~ s/\s+/ /g;
Можно более правильно, но менее красиво:
$line =~ s/\s{2,}/ /g;
PS. И не забывай делать chomp($line) перед обработкой, а то ведь перенос - это тоже пробельный символ. Или замени \s на пробел, если уверен, что табуляции нигде в строке нету :)
>$line =~ s/\s+/ /g;Вроде пробовал так, щас еще проверю
>Можно более правильно, но менее красиво:
>
>$line =~ s/\s{2,}/ /g;
>
>PS. И не забывай делать chomp($line) перед обработкой, а то ведь перенос
>- это тоже пробельный символ. Или замени \s на пробел, если
>уверен, что табуляции нигде в строке нету :)Пишу прогу для обработки логов сквида в реальном времени..... Ж)))
А вот такую херь плохо кушаю :))
Щас еще раз проверю $line =~ s/\s+/ /g; Ну помойму делал так.
>$line =~ s/\s+/ /g;Сработало :)) Я заместо плюса ставил * Ж)) и плюс ставил спереди :))
>Можно более правильно, но менее красиво:
>
>$line =~ s/\s{2,}/ /g;Спасиб.. просто уже так давно сижу, разбирался с File::Tail :))
И я в общем говоря всегда плохо понимал все Эти замены :)) не всегда они мне надобились. :)
Спасиб еще раз.
>
>$line =~ s/\s{2,}/ /g;а можно расшифровать Это?? что к чему 2 и запятая?
>>$line =~ s/\s{2,}/ /g;
>
>а можно расшифровать Это?? что к чему 2 и запятая?{2,} - "2 и более".
Можно юзать по-разному:
{N} - ровно N
{N,M} - от N до M
и т.д.
>>>$line =~ s/\s{2,}/ /g;
>>
>>а можно расшифровать Это?? что к чему 2 и запятая?
>
>{2,} - "2 и более".
>Можно юзать по-разному:
>{N} - ровно N
>{N,M} - от N до M
>и т.д.Спасибо.
Может я чего не понял, но для разбора лога сквида проще пользовать split :@ar=split(/\s+/,$line);
А еще лучше делать примерно так:
while (<>) {
($time,...........)=split(/\s+/);
# обработка полученных значений
};:)