Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> прочитать строку в хэш-массив 
V
    Опции темы
fridy
Дата 10.1.2006, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Помогите чайнику!

В текстовый файл записываются данные в таком виде:
имя|URL|сообщение
имя|URL|сообщение

Нужно теперь получить их в переменные $name, $URL и $message.
Как записать в файл данные формы с грехом пополам разобрался,
а вот прочитать никак не получается!

Смог пока только прочитать строки целиком
Код

open (D1, "<./gb.txt");
@lines = <D1>;          
close(D1);              
chomp @lines;            

for($i=0; $i<=$#lines; $i++) {
  print $lines[$i]."<br>";
}


Вот как бы теперь прочитать $lines[$i] в хэш?
Насколько я понял нужно сделать именно это.
PM MAIL   Вверх
korob2001
Дата 10.1.2006, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



Да нет, думаю хеш тут не понадобится. Просто разбивай строку по символу |.
Код

open(F, "< $file") or die $!;
while (<F>) {
      my( $name, $url, $mess ) = split(/\|/);
      print "Name: $name<br/>";
      print "URL: $url<br/>";
      print "Mess: $mess<br/>";
      print "<hr/>";
}
close(F);

Заметь, что вовсе не стоит читать весь файл в память, т.е. в массив.

PS:
$lines[$i] - Это элемент массива, а не хеша.
$lines{$i} - Элемент ассоциативного массива, т.е. хеша.

Вот тебе несколько примеров работы с массивами, а с хешами напишу как-нить в другой раз, глаза уже слипаются. smile
Код

# Создаём массив
my @names = ("Andrey", "Sergey", "Alexandr");

################################################################################
# Покажим первый и последний элементы массива
print "Первый: $names[0]\n"; # Выведет: Коля
print "Последний: $names[-1]\n"; # Выведет: Саша
print "=" x 80, "\n\n"; # Просто разделитель


################################################################################
# Теперь выведем весь массив в STDOUT
print "Все элементы массива, каждый на отдельной строке\n";
print "$_\n" for ( @names );
print "=" x 80, "\n\n"; # Просто разделитель

################################################################################
# Теперь в обратном порядке
print "Массив в обратном порядке\n";
print "$_\n" for ( reverse @names );
print "=" x 80, "\n\n"; # Просто разделитель


################################################################################
# Теперь выведем отсортированный массив
print "Отсортированный массив\n";
print join("\n", sort {$a cmp $b} @names), "\n";
print "=" x 80, "\n\n"; # Просто разделитель


################################################################################
# Теперь выведем отсортированный массив, но в обратном порядке
print "Отсортированный массив, в обратном порядке.\n";
print "$_\n" foreach ( sort {$b cmp $a} @names );
print "=" x 80, "\n\n"; # Просто разделитель


################################################################################
# Выведем общее кол-во имён в массиве
print "Кол-во элементов: " . scalar @names . "\n";
print "=" x 80, "\n\n";


################################################################################
# Извлечём нулевой элемент массива и сохраним его в переменную, затем
# выведем этот элемент из переменной и покажем сколько осталось элементов
# в массиве и покажем содержимое массива.
my $first_name = shift @names;
print "Извлёк имя: $first_name\n";
print "Элементов в массиве: " . scalar @names . "\n";
print "Содержимое массива: " . join(" ", @names) . "\n";
print "=" x 80, "\n\n"; # просто разделитель


################################################################################
# Теперь добавим элемент, который мы извлекли из начала массива на пред идущем
# шаге, в конец массива. Покажем кол-во элементов и выведем содержимое массива.
push(@names, $first_name);
print "Добавил: $names[-1]\n";
print "Элементов: " . scalar @names . "\n";
print "Содержимое массива: @names\n";
print "=" x 80, "\n\n"; # просто разделитель


################################################################################
# Поменяем местами последний и первый элементы массива и снова покажем его
# содержимое.
print "Меняем местами первый и последний элементы\n";
($names[0],$names[-1]) = ($names[-1],$names[0]);
print "Массив после обмена: @names\n\n";
print "=" x 80, "\n\n"; # Просто разделитель


################################################################################
# Повторим обмен, только уже другим способом
print "Обменяем первый и последний элементы только другим спососбом.\n";
@names[0,-1] = @names[-1, 0];
print "Массив после повтороного обмена: @names\n";
print "=" x 80, "\n\n"; # Просто разделитель


################################################################################
# Покажем второй и третий элементы, при помощи среза массива.
print "Покажем предпоследний и последний элементы с помощью среза:\n";
print "Предпоследний и последний элементы: @names[-2, -1]\n";
print "=" x 80, "\n\n"; # Просто разделитель


################################################################################
# Превратим наш массив имён в массив символов и покажем массив, каждую букву, на
# отдельной строке.
@names = split("", join(" ", @names));
print join("\n", @names), "\n";
print "=" x 80, "\n\n"; # Просто разделитель

################################################################################
# теперь теперь вернём наш массив в исходное состояние, тоесть соберём из массива
# символов, массив имён и покажем каждый его елемент на отдельной строке.
@names = split(/\s+/, join("", @names));
print join("\n", @names), "\n";

И поверь это ещё далеко не всё. ;)))))) Тебе стоит обратить особое внимание на те участки где используетсчя split - он разбивает строку, а join наоборот собирает её.

Это сообщение отредактировал(а) korob2001 - 10.1.2006, 21:50


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
fridy
Дата 14.1.2006, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 10.1.2006

Репутация: нет
Всего: нет



Небыло доступа к инету поэтому поздно отвечаю...

Спасибо за такой подробный ответ!
Все попробовал, со всем разобрался.
Цитата(korob2001 @ 10.1.2006, 20:33 Найти цитируемый пост)

с хешами напишу как-нить в другой раз
Буду очень благодаренsmile

P.S. ИМХО split похожа на функцию list в PHP. Только list разбивает
и помещает в переменные не строку а массив и нужно сначала применить explode чтобы разбить строку по разделителю.
Как ни странно в некоторых случаях PERL оказывается более лаконичным чем PHP. Ну это так мысли вслух...

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0644 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.