26 Jun 2012 » Пакеты Perl
package MyPack;
$a = 1;
# найти хэш с таким именем в пакете main можно так
%main::func

# и так можно до бесконечности :)
# например
%main::main::main::func

%MyPack::func

$MyPack::a=1; # так можно записать первые 2 строчки

# например
%main::MyPack::func

 # получение указателя на скаляр:
 *$main::MyPack{'a'}{SCALAR};

Подключение модуля

use MyPack;

Чтобы выдавать в итоге выполнения модуля 1, необходимо в конце перлмодулей (то есть файлов *.pm) принято писать 1; Иначе может возникать ошибка типа модуль не загружен и.т.п.

Видимость

Имена переменных лексической области видимости ограничиваются блоком.

Если переменная на уровне файла, то видима до конца файла

$a=3;
$a_mm='a';
my ($a,@b) = (1,2,3);
print "$a\n";
print $main::a;

Выведет:

1
3
Read more...
26 Jun 2012 » IpParser.pl Perl
#!/usr/bin/perl -w
 $_=<<"EOD"
192.168.137.1
10.0.0.1
10.0.0.2.
423525.547547.7657.65765767567.567567.567567
lfdlhgdf.dhjgh.hg.g
10.0.0.3111
10.0.0.4.w
EOD
 ;
@ip= /(?:\d{1,3}\.){3}\d{1,3}(?<!\d\.)(?!\.\d|\d|\.\w)/g;
 $,=$/;
print @ip;
Read more...
26 Jun 2012 » Doubles.pl Perl
Устранение дублирующихся букв с помощью регулярных выражений Perl Read more...
26 Jun 2012 » Регулярные выражения Perl

Регулярные выражения Perl

Основной синтаксис

  • [ ] - символ, либо слайс, который может встретиться в поиске
  • **{ <число> }** - сколько раз встречается
  • **{<число>, <число>}** - промежуток сколько раз встречается. Если второго числа нет - то до бесконечности
  • * == {0, }
  • + == {1, }
  • ( ) - подстрока
  • . - почти все символы, кроме перевода строки
  • ** - экранирование следующего символа
  • \d - десятичные цифры == [0-9]
  • \D - всё кроме цифр
  • \w ** == [A-z]**
  • \W - всё кроме букв
  • ** ** - “ИЛИ”

Клини выяснил, что стандартные (математические) регулярные выражения не решают проблему парности строк.

  • (?{ }) - расширенное регулярное выражение
  • (? ) - группировка с захватом - ставит в соответствие переменным $1,$2.. те подстроки, которые удовлетворяют шаблону, заключённому в скобках
  • (?: ) - группировка без захвата
Read more...
26 Jun 2012 » Хэш-массивы Perl
%h = (k1 => 1, k2=>2, k3=> 3);

Функции:

@k=keys %h; #массив ключей
@v=values %h; #массив значений

Как следствие,

for ($i=0;$i<@k; $i++) { print "Error\n" unless $h{$k[$i]} eq $v[$i];}

будет работать.

each %h; #В массивном контексте выводит каждую пару (итератор), а в скалярном - только каждое значение.
while (($k,$v)= each %h) {print "$k\t=>$v\n";} # выводит весь хэш-массив.

Для множественного оператора присваивания в скалярном контексте соглашение, что будет возвращать количество присвоенных справа значений.

Read more...