The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Perl регулярные выражение"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы OpenNET: Виртуальная конференция (Public)
Изначальное сообщение [Проследить за развитием треда]

"Perl регулярные выражение"
Сообщение от A Clockwork Orange Искать по авторуВ закладки on 25-Июн-04, 10:22  (MSK)
Никак не получается передать в PATTERN значение переменной

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

  • Perl регулярные выражение, ihor, 10:43 , 25-Июн-04, (1)
    • Perl регулярные выражение, A Clockwork Orange, 11:52 , 25-Июн-04, (2)
      • хэш, A Clockwork Orange, 12:01 , 25-Июн-04, (3)
        • хэш, ihor, 12:28 , 25-Июн-04, (4)
          • хэш, DogEater, 12:39 , 25-Июн-04, (7)
            • хэш, ihor, 12:54 , 25-Июн-04, (8)
              • хэш, DogEater, 12:59 , 25-Июн-04, (9)
                • хэш, ihor, 13:04 , 25-Июн-04, (10)
                  • хэш, DogEater, 14:59 , 25-Июн-04, (17)
        • хэш, DogEater, 12:32 , 25-Июн-04, (5)
        • хэш, ihor, 12:34 , 25-Июн-04, (6)
          • хэш, A Clockwork Orange, 13:10 , 25-Июн-04, (11)
            • хэш, A Clockwork Orange, 13:14 , 25-Июн-04, (12)
              • хэш, ihor, 13:19 , 25-Июн-04, (14)
            • хэш, ihor, 13:16 , 25-Июн-04, (13)
              • хэш, A Clockwork Orange, 13:50 , 25-Июн-04, (15)
                • хэш, A Clockwork Orange, 14:43 , 25-Июн-04, (16)
                  • хэш, ihor, 15:12 , 25-Июн-04, (18)

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Perl регулярные выражение"
Сообщение от A Clockwork Orange Искать по авторуВ закладки on 25-Июн-04, 11:52  (MSK)
### 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;
....

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "хэш"
Сообщение от A Clockwork Orange Искать по авторуВ закладки on 25-Июн-04, 12:01  (MSK)
ключ = > значение

%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});
не сработало

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "хэш"
Сообщение от ihor Искать по авторуВ закладки on 25-Июн-04, 12:28  (MSK)
для случая
  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";
}
========================================

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "хэш"
Сообщение от DogEater Искать по авторуВ закладки(??) on 25-Июн-04, 12:39  (MSK)
>  for ($i = 1; $i < @{$hash{$key}}; $i++) {

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


  Рекомендовать в FAQ | Cообщить модератору | Наверх

8. "хэш"
Сообщение от ihor Искать по авторуВ закладки on 25-Июн-04, 12:54  (MSK)
в скалярном контексте такая штука:
  @{$hash{$key}}
возвращает кол.-во элементов
а можно и так:   $#{$hash{$key}}


  Рекомендовать в FAQ | Cообщить модератору | Наверх

9. "хэш"
Сообщение от DogEater Искать по авторуВ закладки(??) on 25-Июн-04, 12:59  (MSK)
>в скалярном контексте такая штука:
>  @{$hash{$key}}
>возвращает кол.-во элементов
>а можно и так:   $#{$hash{$key}}

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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


  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "хэш"
Сообщение от DogEater Искать по авторуВ закладки(??) on 25-Июн-04, 12:32  (MSK)
а для чего сие надо?
  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "хэш"
Сообщение от ihor Искать по авторуВ закладки on 25-Июн-04, 12:34  (MSK)
или можно и так:
%hash = ('123' => [1, 2, 3, 77, 5]);


  Рекомендовать в FAQ | Cообщить модератору | Наверх

11. "хэш"
Сообщение от A Clockwork Orange Искать по авторуВ закладки on 25-Июн-04, 13:10  (MSK)
%hash_out = (%hash_out, $ip_src, "$new_traffic_out_ps{$ip_src}\t$new_traffic_out_bs{$ip_src}");
Вот так прошло
  Рекомендовать в FAQ | Cообщить модератору | Наверх

12. "хэш"
Сообщение от A Clockwork Orange Искать по авторуВ закладки on 25-Июн-04, 13:14  (MSK)
Хэш с миллионом записей создать и вывести.. перл сможет?
  Рекомендовать в FAQ | Cообщить модератору | Наверх

14. "хэш"
Сообщение от ihor Искать по авторуВ закладки on 25-Июн-04, 13:19  (MSK)
да, я такие вещи на перле делал, но время отработки зависит от машины, размера данных в хеше и эффективности алгоритма


  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

15. "хэш"
Сообщение от A Clockwork Orange Искать по авторуВ закладки on 25-Июн-04, 13:50  (MSK)
Отлично спасибо.
А что с шаблонами может быть не так.
Сколько будет обрабатываться примерно хэш из полторамиллиона записей на машинах
P  100
P3 500
  Рекомендовать в FAQ | Cообщить модератору | Наверх

16. "хэш"
Сообщение от A Clockwork Orange Искать по авторуВ закладки on 25-Июн-04, 14:43  (MSK)
ihor
$hash_out{$ip_src} = "$new_traffic_out_ps{$ip_src}\t$new_traffic_out_bs{$ip_src}";

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру