Автор Тема: Есть ли в Perl понятия текущий элемент массива и указатель на него?  (Прочитано 5524 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн metton

  • access granted
  • Старожил
  • ****
  • Сообщений: 320
  • +0/-0
  • 2
    • Просмотр профиля
    • http://bluejack.ru/
Есть ли в Perl такие понятия как "текущий элемент" и "указатель на текущий элемент"? Это есть в PHP а вот в Perl найти не могу...

Заранее спасибо!
 BlueJacking среди нас

Оффлайн Yaroslav

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 323
  • +0/-0
  • 0
    • Просмотр профиля
может это $_
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили \"Титаник\".

Оффлайн Mog.

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 828
  • +0/-0
  • 0
    • Просмотр профиля
Цитировать
Yaroslav:
может это $_
... или вообще переменную опускают, берется "текущий элемент"
например:
for (@x){print}
Все болезни от нервов, только сифилис от удовольствия

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Mog.
Тогда уже
foreach (@x) {
$_ - текущий элемент массива
}

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
to metton
По умолчанию аналога функции current в perl я думаю нету. Хотя могу и ошибиться.
Попробуй сам вести отсчет с помощью переменной.

А где это нужно?
Может есть другое решение?

to ALL
Прочитайте тему еще раз.
0 OK, 0:1

Оффлайн metton

  • access granted
  • Старожил
  • ****
  • Сообщений: 320
  • +0/-0
  • 2
    • Просмотр профиля
    • http://bluejack.ru/
Сразу извинюсь за неточно поставленный вопрос...
Хотя всё равно ondr меня понял - мне нужен именно аналог current. Т.е. чтобы знать текущий элемент не только в цикле но и выйдя из цикла, не перебрав все элементы.
Цитировать
Попробуй сам вести отсчет с помощью переменной.

Думал насчёт отдельной переменной. Но в моём случае это будет не очень эффективно. Массивов много. Просто думая как эффективнее это реализовать, я вспомнил, что в PHP указатели встроены.
В общем, как я понял, придётся самому решать проблему...

ЗЫ
Вопрос ещё открыт - может всё таки есть такое в Perl?
 BlueJacking среди нас

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Задачу в студию.
И как можно более подробно
The documentations is your friend

Оффлайн metton

  • access granted
  • Старожил
  • ****
  • Сообщений: 320
  • +0/-0
  • 2
    • Просмотр профиля
    • http://bluejack.ru/
2NeoNox
Цикл проходит массив поэлементно. При определённом условии он начинает обрабатывать (он сам в цикле, чтобы можно было как бы "менять" обрабатываемые массивы) другой массив, а затем возвращается к обработке прежнего. Так вот мне нужно вернуться к обработке прежнего массива именно в то место, где остановился.
 BlueJacking среди нас

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
Хм... И что тебе не нравится? Способов тут очень много. Вот самый наипростейший пример:

-----
...
...
for my $arr1 (@arr1) {
  ...
  ...
  if (условие1) {
    for my $arr2 (@arr2) {
      ...
      ...
      if (условие11) {
        for my $arr11 (@arr11) {

        }
      } else {
        ...
      }
    }
  } elsif (условие2) {
    for my $arr3 (@arr3) {

    }
  } else {
    ...
  }
  ...
  ...
}
...
...
-----


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

ps: Опиши задачу более точно. Лучше с примером.
0 OK, 0:1

Оффлайн metton

  • access granted
  • Старожил
  • ****
  • Сообщений: 320
  • +0/-0
  • 2
    • Просмотр профиля
    • http://bluejack.ru/
2ondr
Твой пример основан на том, что изначально известна структура данных. Мне - нет.
Пока остановился на хэше: ключ, определяющий нужный мне массив, значение - номер строки.

Что конкретно тебе непонятно в моём предыдущем сообщении? (там как раз описывается задача)
 BlueJacking среди нас

Оффлайн NeoNox

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3012
  • +0/-0
  • 0
    • Просмотр профиля
Ставь метки на циклы и выходи/переходи при этих определенных условиях. Что в этом сложного?
The documentations is your friend

Оффлайн mike

  • ProPerl\'er
  • Старожил
  • ****
  • Сообщений: 435
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Цитировать
metton:
Твой пример основан на том, что изначально известна структура данных. Мне - нет.

Структура данных у тебя - массив, насколько я понял ;)

А чисто для аналогии с ПХП можно написать простейший wrapper:

package ArrayIterator;

sub new {
my ($class, $array) = @_;
my $self = { array => $array, current => 0 };
return bless $self, $class
}

sub current {
return $_[0]->{array}->[$_[0]->{current}]
}

sub index {
return $_[0]->{current}
}

sub reset {
return $_[0]->{current} = 0
}

sub end {
return $_[0]->{current} = $#{$_[0]->{array}}
}

sub next {
my $self = shift;
return if $self->{current} >= $#{$self->{array}};
return $self->{array}->[++$self->{current}]
}

sub prev {
my $self = shift;
return if $self->{current} == 0;
return $self->{array}->[--$self->{current}]
}

1;
[ основной браузер когда-то был, теперь попробуй разберись =]

Оффлайн mike

  • ProPerl\'er
  • Старожил
  • ****
  • Сообщений: 435
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
А, еще... Пример как с этим работать:
use ArrayIterator;
use strict;

my @a = (1..10);
my $it = new ArrayIterator(\\@a);

do {
print $it->index()."=".$it->current()."\\n"
} while ($it->next());

print "Current element is:".$it->current()."\\n";
$it->reset();
print "Current element is:".$it->current()."\\n";
$it->end();
print "Current element is:".$it->current()."\\n";
do {
print $it->index()."=".$it->current()."\\n"
} while ($it->prev());
[ основной браузер когда-то был, теперь попробуй разберись =]

Оффлайн metton

  • access granted
  • Старожил
  • ****
  • Сообщений: 320
  • +0/-0
  • 2
    • Просмотр профиля
    • http://bluejack.ru/
2NeoNox
Цикла всего два: один внешний - оболочка. Другой - внутренний - основной. Основной проходит массив поэлементно. Если выполняются определённые условия, выходим из основного цикла и входим в него опять (в этом нам помогает внешний цикл) с новым массивом.
Может я тебя не понял, но как здесь использовать метки я себе представляю очень слабо. Точнее, вообще не представляю - цикл-то по существу один. Просто он выполняется несколько раз за счёт внешнего цикла.


2mike
Понял тебя :)
Хорошая идея, но не в моём случае. Мне кажется, будет жирновато делать отдельный модуль лишь для того чтобы узнать текущий элемент. (Или я не прав?)
Тот вариант, на котором я остановился по сути тот же, что предложил ты, только без использования модуля (см. мой предыдущий пост).
 BlueJacking среди нас

Оффлайн mike

  • ProPerl\'er
  • Старожил
  • ****
  • Сообщений: 435
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
Цитировать
metton:
Мне кажется, будет жирновато делать отдельный модуль лишь для того чтобы узнать текущий элемент.

ИМХО, рано или поздно ты все равно придешь к тому, чтобы написать набор функций, которые работают с твоим хешем. А будет он встроен в скрипт или вынесен в отдельный модуль - это уж как понравится. Если подобная проблема встретится в еще одном скрипте, то этот набор стоит вынести как минимум в отдельный файл.
[ основной браузер когда-то был, теперь попробуй разберись =]

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28