URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2532
[ Назад ]

Исходное сообщение
"как загрузить текстовый файл в двумерный массив?"

Отправлено Michael , 03-Фев-04 13:38 
имеется текстовый файл с полями, разделенными табуляциями и/или пробелами. количество полей во всех строках строго одинаковое, но к их количеству привязываться нельзя.

подскажите, как лучше загрузить такой файл в двумерный массив в Перле?
пока приходится использовать вот такую корявую конструкцию:
open($fcq,$cq);
while(<$fcq>)
{
  chomp;
  @p=split;
  $j=0;
  foreach (@p)
  {
    $t[$i][$j++]=$_;
  }
  $i++;
}
close($fcq);

а еще лучше бы загрузить в хэш, чтобы первое поле было индексом в хэше, а остальные элементами массива, привязанного именного к этому имени.
т.е. обращение к конкретному полю происходило бы примерно так:
$massiv{"vasya"}[1]=100;

заранее большое спасибо!

PS. буду очень благодарен, если еще дадите ссылочку на внятное описание сложных структур данных в Перле, тех же двумерных массивов и т.п.


Содержание

Сообщения в этом обсуждении
"как загрузить текстовый файл в двумерный массив?"
Отправлено XMan , 03-Фев-04 17:01 
Хеш, говоришь...

while(<$fcq>) {
  @{$hash{$i++}}=split;
};

?

> PS. буду очень благодарен, если еще дадите ссылочку на внятное описание сложных структур данных в Перле, тех же двумерных массивов и т.п.

Вообще-то обычной ламы (O'Reily) хватает, чтобы понять, что в перле массивы могут быть хоть треугольными и содержать в себе всё, что угодно - от скаляров до структур, хешей и других массивов :)


"как загрузить текстовый файл в двумерный массив?"
Отправлено Michael , 03-Фев-04 18:09 
>Вообще-то обычной ламы (O'Reily) хватает, чтобы понять, что в перле массивы могут
>быть хоть треугольными и содержать в себе всё, что угодно -
>от скаляров до структур, хешей и других массивов :)

обычная лама у меня есть, сижу, штудирую... и не только ее...
но попалась мне там такая фраза: "Массив не становится элементом в списке, поскольку может содержать только скалярные значения, а не другие масивы."
вот эта фраза меня и смутила...

и конструкции @{...} я нигде не встречал... а в скаляр массив не засунешь...

Спасибо! буду дальше грызть :)


"как загрузить текстовый файл в двумерный массив?"
Отправлено Michael , 03-Фев-04 19:40 
и вот догрыз я до такого момента:
$i=0;
open($fcq,$cq);
while(<$fcq>)
{
  chomp;
  @{$t[$i++]}=split;
}
close($fcq);
foreach(@t)
{
print "@{$_}\n";
}
выдает весь массив построчно с полями, разделенными пробелами, а
$i=0;
open($fcq,$cq);
while(<$fcq>)
{
  @{$t[$i++]}=split(chomp);
}
close($fcq);
foreach(@t)
{
print "@{$_}\n";
}
с полями, разделенными табуляциями...

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


"как загрузить текстовый файл в двумерный массив?"
Отправлено Michael , 03-Фев-04 19:45 
все оказалось еще хуже...
во втором случае оказалось, что строки из массива разбиты на элементы вообще произвольными кусками... даже не обязательно по разделительным символам...

"как загрузить текстовый файл в двумерный массив?"
Отправлено XMan , 04-Фев-04 06:00 
Ну ты ж подсунул split-у в качестве выражения по которому разбивать то, что вернула chomp ? Если внимательно почитать ман, то:

It returns the total number of characters removed from all its arguments.

Чего ж ты хотел... :)

PS. Теоретически, оно разбивает по разделителям "1". То есть, строка, вида:
asd11xcv312tg

превратится в массив:

'asd','','','xcv3','2tg'

Кавычки для наглядности.


"как загрузить текстовый файл в двумерный массив?"
Отправлено Michael , 04-Фев-04 09:47 
да, похоже, что на самом деле по единицам разбивает...

а насчет chomp - я думал что запись chomp; в программе означает то же самое, что $_=comp($_); вот поэтому так лихо и засунул его внутрь split-а...

спасибо большое за помощь!


"как загрузить текстовый файл в двумерный массив?"
Отправлено arto , 03-Фев-04 21:09 
>имеется текстовый файл с полями, разделенными табуляциями и/или пробелами. количество полей во
>всех строках строго одинаковое, но к их количеству привязываться нельзя.
>
>подскажите, как лучше загрузить такой файл в двумерный массив в Перле?
>пока приходится использовать вот такую корявую конструкцию:
>open(F,$cq);

while (<F>) {
  push @array,[ split ];
}

>close(F);
>
>а еще лучше бы загрузить в хэш, чтобы первое поле было индексом
>в хэше, а остальные элементами массива, привязанного именного к этому имени.

while (<F>) {
  my @ary = split;
  $hash{shift @ary} = \@ary;
}

>т.е. обращение к конкретному полю происходило бы примерно так:
>$massiv{"vasya"}[1]=100;
>
>заранее большое спасибо!
>
>PS. буду очень благодарен, если еще дадите ссылочку на внятное описание сложных
>структур данных в Перле, тех же двумерных массивов и т.п.

perldoc perldsc
perldoc perllol
perldoc perldata


"как загрузить текстовый файл в двумерный массив?"
Отправлено Michael , 04-Фев-04 09:55 
2 arto
Спасибо большое, конструкция [split] мне в голову бы не пришла :)

теперь у меня есть даже выбор в решениях :)