Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.62.45] |
|
Сообщ.
#1
,
|
|
|
Извините если глупости спрашиваю,
но дайте пож толковый ответ. все это на perl есть функция которая читает файл в массив и передает в качестве результата ссылку на этот массив sub ReadFileToArray { my $r_data = [ ]; open (F, "file.txt"); @$rdata = <F>; close(F); return $rdata; } вот так я ее вызываю $rarray = &ReadFileToArray; потом можно работать вот так к примеру foreach (@$rarray) { что то делаем с $_ } вопрос если сделать undef $rarray или $#$rarray =-1 то освобождается ли память в которую читались данные из файла и вобще лучше чтобы функция возвращала сам массив а не ссылку на него мне сказали если возвращает ссылку то это намного быстрей и эффективней помогите разобраться! |
Сообщ.
#2
,
|
|
|
По поводу того что быстрее тебе сказали правильно, так как не копируется весь массив, а передается ссылка на память где он находится. А по поводу очистки незнаю.
|
Сообщ.
#3
,
|
|||
|
За памятью следит сам Perl. Память объект уничтожается и память высвобождается тогда, когда на него не осталось ссылок. Для отслеживания этого в каждом объекте существует счётчик ссылок на него же. У кого там записан "0" - тот следует уничтожить. И, конечно, после работы программы весь использованный блок памяти тоже очищается. Так дело обстоит в Perl 5. В более ранних версиях Perl не было счётчиков ссылок на объекты. И приходилось уничтожать их явно. Так, уничтожив скаляр и сразу создав новый, можно было получить доступ к данным уничтоженной переменной. А для чего, собственно, файл считывать в массив и хранить как указатель?
|
Сообщ.
#4
,
|
|
|
А для чего, собственно, файл считывать в массив и хранить как указатель?
У меня в текстовых файлах базы с оглавлением каталога каталог товаров и т.д. и в разные функци передаются ссылки на эти базы ну например: построить меню &GetMenuCatalog($rarray, $id_category) построить страницу с товарами указанной категории &GetCatalog($rarray_tovary, $id_category) у меня ссылка на базу категорий каталога передается не одной функции а многим а в каждой из них читать файл с базой как я понимаю не эффективно |
Сообщ.
#5
,
|
|
|
sub readFileToArray
{ my$fh=shift||*STDIN; my@arr=<$fh>; chomp@arr; +\@arr } Обьясните как это работает прокоментируйте строки |
Сообщ.
#6
,
|
|||||||
|
Понял. Тогда так:
То же самое, только менее оптимизированно:
|
Сообщ.
#7
,
|
|
|
Ну в целом у меня тоже самое вот
только в такую функцию переадется путь к нужному файлу return $value и +$value - это одно и тоже? |
Сообщ.
#8
,
|
|
|
если это-последняя операция,то да,т.к. +something возвращает something, а блок возвращает значение последнего действия в нем
а вы уверены,что 1-ый пост работает. там вроде возвращается ссылка на локальный массив... или я неправ? : |
Сообщ.
#9
,
|
|
|
Это Perl. Не C, не Pascal.
Это Perl. Здесь объект удалится неявно только после того, как исчезнут ссылки на него. Так что пройдёт и такой номер. |