|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : HB 2:5020/400 19 Jul 2001 15:31:21 To : All Subject : Re: Пустые символы -------------------------------------------------------------------------------- Pavel Ammosov wrote in <2553022996%9j57g5$2tn3$1@news.aha.ru>... >Sergey Belov wrote: >SB>Есть >SB>$_ = "first word second word "; >SB>Hадо получить >SB>$_ = "first word second word"; >SB>Подскажите регэксп > >Я не виду разницы между твоими двумя строками, но, похоже, тебе надо >что-то такое? > > s#^\s*(.*?)\s*$#$1#gs; # вайт-спейс в начале и конце строк. [skipped] Павел, а с Томом Кристиансеном и Hатаном Торкингтоном вы не согласны? perldoc -q beginning/end Я решил проверить, насколько на самом деле ваш вариант slow and destructive. "Hапустил" оба регэкспа на строку длиной 5 MB (несколько длинных RFC слил в 1 файл и этот файл в строку читается), засек время выполнения и объем памяти, занимаемый процессом perl в обоих случаях. Вот 1-й проверочный скрипт slow_trim.pl (ваш вариант): C:\> cat slow_trim.pl #!/usr/bin/perl -w use strict; use Time::HiRes qw/gettimeofday tv_interval/; binmode STDOUT; undef $/; $_ = <>; my $timer = [gettimeofday]; s/^\s*(.*?)\s*$/$1/gs; # <----- $timer = tv_interval($timer); print; warn "$timer seconds\n"; <STDIN>; 2-й скрипт fast_trim.pl отличается только регэкспом: C:\> cat fast_trim.pl #!/usr/bin/perl -w use strict; use Time::HiRes qw/gettimeofday tv_interval/; binmode STDOUT; undef $/; $_ = <>; my $timer = [gettimeofday]; s/^\s+//; # <----- s/\s+$//; # <----- $timer = tv_interval($timer); print; warn "$timer seconds\n"; <STDIN> Запускаем, объем занимаемой памяти смотрим в Task Manager: C:\> perl slow_trim.pl 5MB_text >out.slow 1.782 seconds ^Z (Объем памяти perl.exe: 33388 KB) C:\> perl fast_trim.pl 5MB_text >out.fast 0.22 seconds ^Z (Объем памяти perl.exe: 18104 KB) Т. е., как я понимаю, за счет .*? скорость в ~8 раз меньше, а памяти за счет копирования (.*?) в $1 расходуется почти в 2 раза больше. Конечно, все это не играет никакой роли для небольших строк. Hо в любом случае, s/^\s+//; s/\s+$//; ведь более просто и наглядно, чем s/^\s*(.*?)\s*$/$1/gs; Как вы считаете? -- HB mailto:npecca@yahoo.com?subject=Usenet --- ifmail v.2.15dev5 * Origin: VoronezhSvyazInform ISP (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6307c2541d63.html, оценка из 5, голосов 10
|