Показаны сообщения с ярлыком perl. Показать все сообщения
Показаны сообщения с ярлыком perl. Показать все сообщения

5 мар. 2009 г.

Менее востребованные регуляки (Regexp)

IP адрес
\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b


MAC адрес
^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$


Имя домена
^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$


Число с плавающей точкой
[-+]?(?:\b[0-9]+(?:\.[0-9]*)?|\.[0-9]+\b)(?:[eE][-+]?[0-9]+\b)?


Римское число
^(?i:(?=[MDCLXVI])((M{0,3})((C[DM])|(D?C{0,3}))?((X[LC])|(L?XX{0,2})|L)?((I[VX])|(V?(II{0,2}))|V)?))$


Дата формата dd-MM-yyyy
(0[1-9]|[12][0-9]|3[01])([- /.])(0[1-9]|1[012])\2(19|20)\d\d

11 февр. 2009 г.

Исключение из массива повторяющихся записей

Цель: Исключение из массива повторяющихся записей.
Дано: @cur_list - исходный массив
Решение:

my @new_list; # массив куда будут помещены "отфильтованные" значения
my @cur_list;
my %seen; #хеш для работы
@new_list = grep {$_ && !$seen{$_}++} @cur_list;

Парсинг конфиг-файлов (.conf, .cnf)

Цель:

Нужен был perl-скрипт парсинга конф-файлов (.conf) без загрузки дополнительный модулей.


Дано:

Конфигурационный файл progname.conf, следующего содержания:

[PART1]
#Раздел первый
# Кратко опишем раздел этим комментарием
var1=value1 # Параметр и значение без разделителей
var2 = value2 # Параметр и значение разделитель пробел
var3 = value3 # Параметр и значение разделитель tab

[Part2]
# Раздел второй
# Кратко опишем раздел этим комментарием
var1 = "value 1 1 1" # строка значения в кавычках
var2 = value 2 2 two # строка значения без кавычек


Решение:

Решение не моё, нагугленное и немного подправленное под собственные нужды.

Создадим файл progname.pl
#touch ./progname.pl
#chmod a+x ./progname.pl


Вписываем следующие строки в него:

#!/usr/bin/perl
use strict;

sub ReadConfig {
my $file=shift;
die "Config not found" unless(-e $file);
my %config;
my $key;
open(CONF,"<",$file) || die "can't open config file: $!";
while() {
chomp;
~s/^[\ \t]+//;
next if /^#|^$/;
$key=$1 if /^\[(\w+)\]/;
if($key) {
next if /^\[/;
my($var,$value)=split(/=/,$_);
$var=~s/^[\t \ ]+|[\t \ ]+$//;
$value=~s/^[\t \ ]+|[\t \ ]+$//;
$value=~s/[\ \t]*#(.+)$//;
$value=$1 if /"(.+)"/g;
$config{uc($key)}{uc($var)}=$value;
}
}
return %config;
}


my %config=ReadConfig('./progname.conf');

foreach my $cnf (sort keys %config) {
print "[".$cnf."]\n";
foreach my $cnfv (sort keys %{$config{$cnf}}) {
print "\t".$cnfv."=".$config{$cnf}{$cnfv}."\n";
}
}


Примечание: Возможно не учтены многие моменты конфиг-файлов, но заданным требованиям отвечал вполне.