Pull to refresh

Comments 22

Жаль только перловиков маловато ;) Да и те, имхо, по старинке работают: ip & mask == subnet :)
UFO just landed and posted this here
Да главное запомнить простенький регексп и всё наладится ;) Это, так сказать, аналог aton()
$addr =~ s/(\d+)\.(\d+)\.(\d+)\.(\d+)/($1
блин, парсер — лох :(
$addr =~ s/(\d+)\.(\d+)\.(\d+)\.(\d+)/($1<<24)+($2<<16)+($3<<8)+$4/e;
UFO just landed and posted this here
в контексте тегов не бывает последовательности << либо >>, парсер легко это может отслеживать, и нормальные парсеры так и делают, заменяя такие случаи автоматически. Потому я даже как-то не задумываюсь в таких ситуациях. Вот вам пример, что бы вы меньше «умничали» :)

perl -MHTML::Scrubber -e "$html=q[<h1>Simple << test</h1>]; $s=HTML::Scrubber->new( allow=> [] ); print $s->scrub($html);"

Посмотрите результат и убедитесь.
для ип 130.244.255.255 (теле2)
в 32 битной системе такой регэксп будет выдавать
-2097872897
Да ладно :)
Вот пажалста

$ cat 1.pl
#!/usr/bin/perl -w

my $ip = '130.244.255.255';
$ip =~ s/(\d+)\.(\d+)\.(\d+)\.(\d+)/($1<<24)+($2<<16)+($3<<8)+$4/e;
print sprintf("%u, 0x%X\n", $ip, $ip);

$ ./1.pl
2197094399, 0x82F4FFFF

Да и какая разница signed или unsigned число на экране? Биты то установлены в нормальном виде и это главное.
php-программисты еще ленивее чем делфисты…
perl* ну хотя php'шники тоже лентяи
м? это перл вообще-то. Хоть читайте пост, перед тем как писать.
который очень эффективно решает данную проблему, метод основан на Patricia Tree.

Вы хотите сказать что оно работает быстрее операции AND? o_O
оно не только быстрее, но еще и удобнее при больших объемах информации.
Ой, молодой человек, негоже врать ;) Вы хотя бы внутрь заглядывали? Тесты писали? Сравнивали? А ведь еще подобные модули, коих валом на CPAN.

Вот вам исходничики, извольте разобраться и протестировать:
cpan.uwinnipeg.ca/htdocs/Net-Patricia/Net/Patricia.pm.html

Посмотрите, какой там оверхед везде, даже на этапе add_string(), не говоря уже про остальное. В функциях использованы те же стандартные функции, например, inet_aton(), применяются те же самые побитовые операции. Но с диким оверхедом.

Откуда в таком случае будет быстрее?
И в дополнение:
search.cpan.org/search?dist=Net-Netmask
search.cpan.org/search?dist=Net-IP
search.cpan.org/search?dist=Net-IP-Match
search.cpan.org/search?dist=Net-IPv4Addr
search.cpan.org/search?dist=NetAddr-IP

И небольшое обсуждение:
www.opennet.ru/tips/info/206.shtml

Это так, для общего развития :) Это к тому, например, что Patricia отсутствует под Win32, а эти — есть.
Извините но операция and выполняется за один такт машинного времени. Операции перевода из строки в inet_addr являются posix функциями. На операции одной проверки оно быть не может. Оно может быть быстрее на стадии поиска относительно другой либы, да и то сомнительно.
дык там внутри и есть скорей всего AND, просто нада ж еще привести записи вида 192.168.0.0/24 к числовой форме и выполнить операции ;)
См. выше привести запись вида к числовой форме входит в стандарт POSIX и реализовано во всех системах поддерживающих его.
UFO just landed and posted this here
Да легко :) Вот эти модули работают с IPv6: Net-Netmask, Net-IP, Net-IPv6Addr, NetAddr-IP
Sign up to leave a comment.

Articles