Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > прочитать строку в хэш-массив


Автор: fridy 10.1.2006, 17:48
Помогите чайнику!

В текстовый файл записываются данные в таком виде:
имя|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] в хэш?
Насколько я понял нужно сделать именно это.

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

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 наоборот собирает её.

Автор: fridy 14.1.2006, 16:50
Небыло доступа к инету поэтому поздно отвечаю...

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)