имеется текстовый файл с полями, разделенными табуляциями и/или пробелами. количество полей во всех строках строго одинаковое, но к их количеству привязываться нельзя.подскажите, как лучше загрузить такой файл в двумерный массив в Перле?
пока приходится использовать вот такую корявую конструкцию:
open($fcq,$cq);
while(<$fcq>)
{
chomp;
@p=split;
$j=0;
foreach (@p)
{
$t[$i][$j++]=$_;
}
$i++;
}
close($fcq);а еще лучше бы загрузить в хэш, чтобы первое поле было индексом в хэше, а остальные элементами массива, привязанного именного к этому имени.
т.е. обращение к конкретному полю происходило бы примерно так:
$massiv{"vasya"}[1]=100;заранее большое спасибо!
PS. буду очень благодарен, если еще дадите ссылочку на внятное описание сложных структур данных в Перле, тех же двумерных массивов и т.п.
Хеш, говоришь...while(<$fcq>) {
@{$hash{$i++}}=split;
};?
> PS. буду очень благодарен, если еще дадите ссылочку на внятное описание сложных структур данных в Перле, тех же двумерных массивов и т.п.
Вообще-то обычной ламы (O'Reily) хватает, чтобы понять, что в перле массивы могут быть хоть треугольными и содержать в себе всё, что угодно - от скаляров до структур, хешей и других массивов :)
>Вообще-то обычной ламы (O'Reily) хватает, чтобы понять, что в перле массивы могут
>быть хоть треугольными и содержать в себе всё, что угодно -
>от скаляров до структур, хешей и других массивов :)обычная лама у меня есть, сижу, штудирую... и не только ее...
но попалась мне там такая фраза: "Массив не становится элементом в списке, поскольку может содержать только скалярные значения, а не другие масивы."
вот эта фраза меня и смутила...и конструкции @{...} я нигде не встречал... а в скаляр массив не засунешь...
Спасибо! буду дальше грызть :)
и вот догрыз я до такого момента:
$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";
}
с полями, разделенными табуляциями...почему бы это? ведь вроде запись-то равнозначная, а результат разный...
все оказалось еще хуже...
во втором случае оказалось, что строки из массива разбиты на элементы вообще произвольными кусками... даже не обязательно по разделительным символам...
Ну ты ж подсунул split-у в качестве выражения по которому разбивать то, что вернула chomp ? Если внимательно почитать ман, то:It returns the total number of characters removed from all its arguments.
Чего ж ты хотел... :)
PS. Теоретически, оно разбивает по разделителям "1". То есть, строка, вида:
asd11xcv312tgпревратится в массив:
'asd','','','xcv3','2tg'
Кавычки для наглядности.
да, похоже, что на самом деле по единицам разбивает...а насчет chomp - я думал что запись chomp; в программе означает то же самое, что $_=comp($_); вот поэтому так лихо и засунул его внутрь split-а...
спасибо большое за помощь!
>имеется текстовый файл с полями, разделенными табуляциями и/или пробелами. количество полей во
>всех строках строго одинаковое, но к их количеству привязываться нельзя.
>
>подскажите, как лучше загрузить такой файл в двумерный массив в Перле?
>пока приходится использовать вот такую корявую конструкцию:
>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
2 arto
Спасибо большое, конструкция [split] мне в голову бы не пришла :)теперь у меня есть даже выбор в решениях :)