Никак не получается передать в PATTERN значение переменнойforech $line (@DATA)
{
if ($ip_dst =~ /$line/)
{
print "$line $ip_dst/n";
}
}Не работает. Не понимает в качестве шаблона значение $line
всё работает:
=================================================
@DATA = ("12345", "23456", "34567", "45678");
$ip_dst = "00003456789";
foreach $line (@DATA) {
if ($ip_dst =~ /$line/) {
print "$line $ip_dst\n";
}
}
==================================================
скорее всего, причина в твоих значениях @DATA и $ip_dst
### 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;
....
ключ = > значение
%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});
не сработало
для случая
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";
}
========================================
> for ($i = 1; $i < @{$hash{$key}}; $i++) {а точно не нужен scalar @{$hash{$key}} или @#{$hash{$key}} ?
в скалярном контексте такая штука:
@{$hash{$key}}
возвращает кол.-во элементов
а можно и так: $#{$hash{$key}}
>в скалярном контексте такая штука:
> @{$hash{$key}}
>возвращает кол.-во элементов
>а можно и так: $#{$hash{$key}}ты хочешь сказать что в твоём варианте $i < @{$hash{$key}} изначально понимается в скалярном контексте и явно прописвать это не нужно?
>ты хочешь сказать что в твоём варианте $i < @{$hash{$key}} изначально понимается
>в скалярном контексте и явно прописвать это не нужно?
да, но лучше делать это явно, т.к. потом при модификации программы можно это прохлопать и получить странное поведение.
да, нужно уточнить, $#{$hash{$key}} возвращает индекс последнего элемента, а не кол.-во
>>ты хочешь сказать что в твоём варианте $i < @{$hash{$key}} изначально понимается
>>в скалярном контексте и явно прописвать это не нужно?
>да, но лучше делать это явно, т.к. потом при модификации программы можно
>это прохлопать и получить странное поведение.
>да, нужно уточнить, $#{$hash{$key}} возвращает индекс последнего элемента, а не кол.-во
забыл, старость не радость :-(
а для чего сие надо?
или можно и так:
%hash = ('123' => [1, 2, 3, 77, 5]);
%hash_out = (%hash_out, $ip_src, "$new_traffic_out_ps{$ip_src}\t$new_traffic_out_bs{$ip_src}");
Вот так прошло
Хэш с миллионом записей создать и вывести.. перл сможет?
да, я такие вещи на перле делал, но время отработки зависит от машины, размера данных в хеше и эффективности алгоритма
это не совсем эффективно в плане кол.-ва операций, кот, нужно будет проделать интерпретатору Perl.
такую конструкцию можно заменить след.:
$hash_out{$ip_src} = "$new_traffic_out_ps{$ip_src}\t$new_traffic_out_bs{$ip_src}";
-- получится дешевле
Отлично спасибо.
А что с шаблонами может быть не так.
Сколько будет обрабатываться примерно хэш из полторамиллиона записей на машинах
P 100
P3 500
ihor
$hash_out{$ip_src} = "$new_traffic_out_ps{$ip_src}\t$new_traffic_out_bs{$ip_src}";Все же это ключи - один эелемент
А еще способ что бы два элемента
>А еще способ что бы два элемента
в смысле, как сделать хэш такого вида:
(key1, key2) => value
?
ну то, что я использовал, это либо сконструировать из двух ключей один, и использовать его, напр.
$hash{"$key1#$key2"} = $value;
или сделать нечто подобное:
$hash{$key1} = {};
${$hash{$key1}}{$key2} = $value;
зависит от задачи -- что больше подходит.
я тут ещё подумал о хеше с 10^6 ключей -
пожалуй не получалось у меня таких больших хешей, в каждый момент времени записей там было меньше, а итераций в циклах бывало и больше 10^7.
для менеджера памяти Perl-а это будет та ещё работа, по началу всё будет живенкько, а потом с ростом кол.-ва ключей, всё хуже и хуже. потом пойдёт активный своппнг и станет ещё хуже, а потом, скорее всего, Perl скажет что у него не хватает памяти.
я думаю, тут как раз на уровне алгоритма нужно думать, как от этого уйти.
если никак - м.б. придётся использовать напр. хеши и файлы, или делать несколько проходов по файлам с данными, т.е. каким-то образом сделать декомпозицию задачи/данных