Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Подскажите, как реализовать, пожалуйста  (Прочитано 16631 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vika
Постоялец

ru
Offline Offline
Пол: Женский

« : 17-01-2011 05:36 » 

Просматривала темы форума и наткнулась на то, что мне как раз нужно, на код уважаемого RXL
Код: (Perl)
#!/usr/bin/perl -W

use strict;

sub ip_to_n($)
{
  my ($ip_s) = @_;
  my $ip_n = 0;

  for my $part (split(/\./, $ip_s))
  {
    $ip_n <<= 8;
    $ip_n += $part;
  }

  return $ip_n;
}

sub n_to_ip($)
{
  my ($ip_n) = @_;

  return (($ip_n >> 24) & 0xff) . '.' . (($ip_n >> 16) & 0xff) . '.' . (($ip_n >> 8) & 0xff) . '.' . ($ip_n & 0xff);
}

sub get_rand_ip($$)
{
  my ($ip_from, $ip_to) = @_;
  my $ip_n;

  $ip_from = ip_to_n($ip_from);
  $ip_to = ip_to_n($ip_to);
  $ip_n = rand($ip_to - $ip_from + 1) + $ip_from;

  return n_to_ip($ip_n);
}

my $ip = get_rand_ip('95.24.0.0', '95.31.255.255');

print "Random IP: $ip\n";
Очень прошу, подмогните, как сдлеоать так, чтобы не вручную мучать скрипт, вводя диапазоны, а брать их из файла, рандомно... Т.е, брать диапазоны из файла, в котором они лежат в виде
  • 80.251.133.68 - 80.251.133.71
  • 80.251.133.172 - 80.251.133.175
Кое чего я сама допетрила, это как считать все в массив и как рандомно из него выбирать, но дальше никак, что то А черт его знает...
Код: (Perl)
open(M,"< files.txt") or die "Openning file: " . $!;
@files=<M>;
chomp(@files);
close(M);

my $files = $files[rand(scalar(@files))]; # правильно ли???
« Последнее редактирование: 17-01-2011 06:48 от McZim » Записан
McZim
Модератор

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #1 : 17-01-2011 06:54 » 

vika, все что тебе нужно, это считать диапазоны в переменные и передать их в функцию get_rand_ip. Либо еслиу тебя планируется много диапазонов, воспользуйся массивами, тогда функцию get_rand_ip, немного перепиши для работы с массивами.

Код: (Perl)
my $files = $files[rand(scalar(@files))]; # правильно ли???

Это ты вообще зачем делаешь, а ты сама запускала?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 17-01-2011 11:50 » 

vika,  что ты этим хотела сказать? Опиши словами алгоритм - пока ты это не сделаешь, ничего у тебя не выйдет.

Названия @files и $files - явно вводят в заблуждение. Быстрее уж lines...


Правила читала? Тему как надо называть? "Подскажите", "помогите", "пожалуйста", "help" - это слова не информативны.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
vika
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #3 : 17-01-2011 13:00 » 

vika, все что тебе нужно, это считать диапазоны в переменные и передать их в функцию get_rand_ip. Либо еслиу тебя планируется много диапазонов, воспользуйся массивами, тогда функцию get_rand_ip, немного перепиши для работы с массивами.

Код: (Perl)
my $files = $files[rand(scalar(@files))]; # правильно ли???

Это ты вообще зачем делаешь, а ты сама запускала?

Работать планируется с множеством диапазонов, я так и представляю себе работу с массивами...
Это я так предполагаю работу с массивом, выбирая из него случайную переменную (один из диапазонов)
А что именно переписать надо, тките носом в строку, пожалуйста...

Добавлено через 1 минуту и 48 секунд:
vika,  что ты этим хотела сказать? Опиши словами алгоритм - пока ты это не сделаешь, ничего у тебя не выйдет.

Названия @files и $files - явно вводят в заблуждение. Быстрее уж lines...


Правила читала? Тему как надо называть? "Подскажите", "помогите", "пожалуйста", "help" - это слова не информативны.
Алгоритм то простой, заменить диапазон списком диапазона, список поместить в массив, считать его и рандомно выбирать один из диапазонов...
Прошу прощения, что невнимательно читала правила
« Последнее редактирование: 17-01-2011 13:02 от vika » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 17-01-2011 16:54 » 

С точки зрения массивов у тебя все правильно, а вот с точки зрения логики - не понятно.

Это не алгоритм - это описание задачи. Алгоритм - это описание логики. Опиши по шагам действия и сама же их в уме или на бумажке выполняй и увидишь просчеты и ошибки.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
vika
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #5 : 18-01-2011 17:58 » 

как-то так, на большее, к сожалению, у меня не хватило мозгов Жаль

Код: (Perl)
open(A,"< geo.txt") or die "Openning file: " . $!;

@geo=<A>;

chomp(@geo);

close(A);

$k = 1;

while ($k<150) {

$value = $geo[ int(rand(@geo)) ];

$value =~ m%([^\-]+)%;
$i = $1;

$value =~ m% \- ([^\'\n']+)%;
$j = $1;

my $ip = get_rand_ip($i, $j);

print "$ip\n";

++$k;

}
« Последнее редактирование: 18-01-2011 19:51 от McZim » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 18-01-2011 18:50 » 

vika, словами... словами... а уж потом кодом...
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 19-01-2011 04:32 » 

vika, бекслеш, если он означает сам себя, надо удваивать. Исключение - текст в одинарных кавычках. Если же он у тебя как escape-символ, то перед минусом он не нужен.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
vika
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #8 : 21-01-2011 17:39 » 

Спасибо, я учла... А как вообще на ваш взгля, код имеет право на существование...? К сожалению, объяснить логику программы я вряд ли могу, как-то не получается словами все раскрыть, я всегда сначала писала код, а потом задумывалась, как он работает... Вижу слабые стороны моей реализации - блок ip адресов может быть достаточно приличным по размеру и все это в память Жаль, хотела как-то так сделать
Код: (Perl)
srand;
rand($.) < 1 && ($line = $_) while <>;
# $line - случайно выбранная строка
но что то не работает... И еще, регулярки мне кажется, корявенькие... С ума сойти... Хотя, все работает... Быть такого не может
« Последнее редактирование: 21-01-2011 17:52 от McZim » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 22-01-2011 15:37 » 

Я бы переписал регулярное выражение на более понятное и надежное. И форматировать надо код для читаемости.
Сливать все в массив тоже не всегда хорошо, особенно если данные нужны один раз - лучше обрабатывать в цикле чтения из файла.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
vika
Постоялец

ru
Offline Offline
Пол: Женский

« Ответ #10 : 22-01-2011 16:51 » 

Понятно, спасибо
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines