На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
! Внимательно изучите правила раздела перед созданием темы
0. ПРИЛАГАЙТЕ СВОИ СКРИПТЫ.
1. Прежде чем создать топик, используйте поиск. Возможно это уже обсуждалось.
2. В топике указывайте ОС, режим работы скрипта (CLI|CGI). Очень желателен вывод лог-файлов и того места, куда у вас назначен вывод данных (STDOUT|STDERR)
3. Помните: вы знаете что вы хотите, а форумчане - нет. Поэтому следуйте простому правилу: грамотный развернутый вопрос - грамотный развернутый ответ.
Модераторы: ANDLL
  
    > array in Perl
      Извините если глупости спрашиваю,
      но дайте пож толковый ответ.
      все это на perl

      есть функция которая читает файл в массив и передает
      в качестве результата ссылку на этот массив

      sub ReadFileToArray {
      my $r_data = [ ];
      open (F, "file.txt");
      @$rdata = <F>;
      close(F);
      return $rdata;
      }

      вот так я ее вызываю
      $rarray = &ReadFileToArray;
      потом можно работать вот так к примеру
      foreach (@$rarray) { что то делаем с $_ }

      вопрос если сделать undef $rarray или $#$rarray =-1
      то освобождается ли память в которую читались
      данные из файла
      и вобще лучше чтобы функция возвращала сам массив а не
      ссылку на него
      мне сказали если возвращает ссылку то это намного быстрей и эффективней

      помогите разобраться!
        По поводу того что быстрее тебе сказали правильно, так как не копируется весь массив, а передается ссылка на память где он находится. А по поводу очистки незнаю.
          За памятью следит сам Perl. Память объект уничтожается и память высвобождается тогда, когда на него не осталось ссылок. Для отслеживания этого в каждом объекте существует счётчик ссылок на него же. У кого там записан "0" - тот следует уничтожить.
          И, конечно, после работы программы весь использованный блок памяти тоже очищается.

          Так дело обстоит в Perl 5.
          В более ранних версиях Perl не было счётчиков ссылок на объекты. И приходилось уничтожать их явно. Так, уничтожив скаляр и сразу создав новый, можно было получить доступ к данным уничтоженной переменной.

          А для чего, собственно, файл считывать в массив и хранить как указатель?
          CODE
          sub readFileToArray
          {
            my$fh=shift||*STDIN;
            my@arr=<$fh>;
            chomp@arr;
            +\@arr
          }
          Сообщение отредактировано: Tishaishii -
            А для чего, собственно, файл считывать в массив и хранить как указатель?

            У меня в текстовых файлах базы с

            оглавлением каталога
            каталог товаров и т.д.

            и в разные функци передаются ссылки на эти базы
            ну например:
            построить меню
            &GetMenuCatalog($rarray, $id_category)
            построить страницу с товарами указанной категории
            &GetCatalog($rarray_tovary, $id_category)

            у меня ссылка на базу категорий каталога
            передается не одной функции а многим
            а в каждой из них читать файл с базой как я
            понимаю не эффективно
              sub readFileToArray
              {
              my$fh=shift||*STDIN;
              my@arr=<$fh>;
              chomp@arr;
              +\@arr
              }

              Обьясните как это работает
              прокоментируйте строки
                QUOTE (Гость Novichok @ 21.11.03, 13:48)
                sub readFileToArray
                {
                  my$fh=shift||*STDIN;
                  my@arr=<$fh>;
                  chomp@arr;
                  +\@arr
                }

                Обьясните как это работает
                прокоментируйте строки

                Понял. Тогда так:
                CODE

                sub readFileToArray
                {
                 my$fh=shift||*STDIN;#Создаём локальную  для данного блока скалярную переменную $fh и присвоим 1й элемент списка аргументов, переданных функции (ожидается указатель на файловую переменную). Если передано пустое поле или 1й элемент не существует, то присвоим $fh указатель на файловую переменную входного потока (STDIN) для "универсальности".
                 my$arr=shift||[];#Создаём локальную  для данного блока скалярную переменную $arr и присвоим 2й элемент (хотя он снова первый) списка аргументов, переданных функции (ожидается указатель на список). Если передано пустое поле или 2й элемент не существует, то присвоим $arr указатель на безымянный список для "универсальности".
                 @$arr=<$fh>;#Читая из $fh, присвоим каждому элементу списка по ссылке $arr каждую строку
                 chomp@arr;#Уберём из значения каждого элемента списка по ссылке $arr все крайние пробельные символы (как [\r\n]).
                 +$arr#Возвернём ссылку на $arr
                }



                То же самое, только менее оптимизированно:
                CODE
                sub readFileToArray
                {
                 my$fh=shift||*STDIN;
                 my$arr=shift||[];
                 while(<$fh>)
                 {
                      chomp;
                      push@$arr
                 }
                 +$arr
                }
                Сообщение отредактировано: Tishaishii -
                  Ну в целом у меня тоже самое вот
                  только в такую функцию переадется
                  путь к нужному файлу

                  return $value и +$value - это одно и тоже?
                    если это-последняя операция,то да,т.к. +something возвращает something, а блок возвращает значение последнего действия в нем

                    а вы уверены,что 1-ый пост работает. там вроде возвращается ссылка на локальный массив... или я неправ? : blink.gif
                    Сообщение отредактировано: Misha_Muhin -
                      Это Perl. Не C, не Pascal.
                      Это Perl.

                      Здесь объект удалится неявно только после того, как исчезнут ссылки на него.
                      Так что пройдёт и такой номер.
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0295 ]   [ 15 queries used ]   [ Generated: 9.05.24, 10:31 GMT ]