URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 45500
[ Назад ]

Исходное сообщение
"Perl регулярные выражение"

Отправлено A Clockwork Orange , 25-Июн-04 10:22 
Никак не получается передать в PATTERN значение переменной

forech $line (@DATA)
{
if ($ip_dst =~ /$line/)
  {
  print "$line $ip_dst/n";
  }
}

Не работает. Не понимает в качестве шаблона значение $line


Содержание

Сообщения в этом обсуждении
"Perl регулярные выражение"
Отправлено ihor , 25-Июн-04 10:43 
всё работает:
=================================================
@DATA = ("12345", "23456", "34567", "45678");
$ip_dst = "00003456789";
foreach $line (@DATA) {
  if ($ip_dst =~ /$line/) {
    print "$line $ip_dst\n";
  }
}
==================================================
скорее всего, причина в твоих значениях @DATA и $ip_dst


"Perl регулярные выражение"
Отправлено A Clockwork Orange , 25-Июн-04 11:52 
### nets ###
192.168.1
...

open (DATA, "$nets");
@data = <DATA>;
close (DATA);

....
if ( $_ =~ /(\d+\.\d+\.\d+\.\d+)\s*(\d+\.\d+\.\d+\.\d+)\s*(\d+)\s+(\d+)/)
                {
                $ip_src = $1;
                $ip_dst = $2;
                $pkts = $3;
                $bits = $4;
....


"хэш"
Отправлено A Clockwork Orange , 25-Июн-04 12:01 
ключ = > значение

%hash_in = (%hash_in, $ip_dst, $new_traffic_in{$ip_dst});

А как сделать подобно вверхнему такой хэш

key => значение1, значение2

Пробовал
%hash_in = (%hash_in, $ip_dst, $new_traffic_in_1{$ip_dst}, $new_traffic_in_2{$ip_dst});
не сработало


"хэш"
Отправлено ihor , 25-Июн-04 12:28 
для случая
  key => value1, value2, ... , valuen
можно поместить value1, value2, ... , valuen в массив, а затем ссылку на него связать с ключём. вот пример такой техники:
================================================
my %hash;

$hash{'123'} = []; # содали пустой массив и ссылку на него
                   # поместили в хеш с ключём '123'
push (@{$hash{'123'}}, (1 ,2 ,3 ,4 ,5));
#
# можно было-бы сделать и так:
# my @array = (1 ,2 ,3 ,4 ,5);
# $hash{'123'} = \@array;
#


foreach $key (keys (%hash)) {
  print "$key => (";
  print ${$hash{$key}}[0];
  for ($i = 1; $i < @{$hash{$key}}; $i++) {
    print ", " . ${$hash{$key}}[$i];
  }
  print ")\n";
}
========================================


"хэш"
Отправлено DogEater , 25-Июн-04 12:39 
>  for ($i = 1; $i < @{$hash{$key}}; $i++) {

а точно не нужен scalar @{$hash{$key}} или @#{$hash{$key}} ?



"хэш"
Отправлено ihor , 25-Июн-04 12:54 
в скалярном контексте такая штука:
  @{$hash{$key}}
возвращает кол.-во элементов
а можно и так:   $#{$hash{$key}}



"хэш"
Отправлено DogEater , 25-Июн-04 12:59 
>в скалярном контексте такая штука:
>  @{$hash{$key}}
>возвращает кол.-во элементов
>а можно и так:   $#{$hash{$key}}

ты хочешь сказать что в твоём варианте $i < @{$hash{$key}} изначально понимается в скалярном контексте и  явно прописвать это не нужно?


"хэш"
Отправлено ihor , 25-Июн-04 13:04 
>ты хочешь сказать что в твоём варианте $i < @{$hash{$key}} изначально понимается
>в скалярном контексте и  явно прописвать это не нужно?
да, но лучше делать это явно, т.к. потом при модификации программы можно это прохлопать и получить странное поведение.
да, нужно уточнить, $#{$hash{$key}} возвращает индекс последнего элемента, а не кол.-во


"хэш"
Отправлено DogEater , 25-Июн-04 14:59 
>>ты хочешь сказать что в твоём варианте $i < @{$hash{$key}} изначально понимается
>>в скалярном контексте и  явно прописвать это не нужно?
>да, но лучше делать это явно, т.к. потом при модификации программы можно
>это прохлопать и получить странное поведение.
>да, нужно уточнить, $#{$hash{$key}} возвращает индекс последнего элемента, а не кол.-во
забыл, старость не радость  :-(



"хэш"
Отправлено DogEater , 25-Июн-04 12:32 
а для чего сие надо?

"хэш"
Отправлено ihor , 25-Июн-04 12:34 
или можно и так:
%hash = ('123' => [1, 2, 3, 77, 5]);



"хэш"
Отправлено A Clockwork Orange , 25-Июн-04 13:10 
%hash_out = (%hash_out, $ip_src, "$new_traffic_out_ps{$ip_src}\t$new_traffic_out_bs{$ip_src}");
Вот так прошло

"хэш"
Отправлено A Clockwork Orange , 25-Июн-04 13:14 
Хэш с миллионом записей создать и вывести.. перл сможет?

"хэш"
Отправлено ihor , 25-Июн-04 13:19 
да, я такие вещи на перле делал, но время отработки зависит от машины, размера данных в хеше и эффективности алгоритма



"хэш"
Отправлено ihor , 25-Июн-04 13:16 
это не совсем эффективно в плане кол.-ва операций, кот, нужно будет проделать интерпретатору Perl.
такую конструкцию можно заменить след.:
$hash_out{$ip_src} = "$new_traffic_out_ps{$ip_src}\t$new_traffic_out_bs{$ip_src}";
-- получится дешевле


"хэш"
Отправлено A Clockwork Orange , 25-Июн-04 13:50 
Отлично спасибо.
А что с шаблонами может быть не так.
Сколько будет обрабатываться примерно хэш из полторамиллиона записей на машинах
P  100
P3 500

"хэш"
Отправлено A Clockwork Orange , 25-Июн-04 14:43 
ihor
$hash_out{$ip_src} = "$new_traffic_out_ps{$ip_src}\t$new_traffic_out_bs{$ip_src}";

Все же это ключи - один эелемент
А еще способ что бы два элемента


"хэш"
Отправлено ihor , 25-Июн-04 15:12 
>А еще способ что бы два элемента
в смысле, как сделать хэш такого вида:
  (key1, key2) => value
?
ну то, что я использовал, это либо сконструировать из двух ключей один, и использовать его, напр.
  $hash{"$key1#$key2"} = $value;
или сделать нечто подобное:
  $hash{$key1} = {};
  ${$hash{$key1}}{$key2} = $value;
зависит от задачи -- что больше подходит.
я тут ещё подумал о хеше с 10^6 ключей -
пожалуй не получалось у меня таких больших хешей, в каждый момент времени записей там было меньше, а итераций в циклах бывало и больше 10^7.
для менеджера памяти Perl-а это будет та ещё работа, по началу всё будет живенкько, а потом с ростом кол.-ва ключей, всё хуже и хуже. потом пойдёт активный своппнг и станет ещё хуже, а потом, скорее всего, Perl скажет что у него не хватает памяти.
я думаю, тут как раз на уровне алгоритма нужно думать, как от этого уйти.
если никак - м.б. придётся использовать напр. хеши и файлы, или делать несколько проходов по файлам с данными, т.е. каким-то образом сделать декомпозицию задачи/данных