Forum Webscript.Ru
Программирование => Perl => Тема начата: metton от 29 Сентября 2003, 23:36:25
-
Есть ли в Perl такие понятия как "текущий элемент" и "указатель на текущий элемент"? Это есть в PHP а вот в Perl найти не могу...
Заранее спасибо!
-
может это $_
-
Yaroslav:
может это $_
... или вообще переменную опускают, берется "текущий элемент"
например:
for (@x){print}
-
Mog.
Тогда уже
foreach (@x) {
$_ - текущий элемент массива
}
-
to metton
По умолчанию аналога функции current в perl я думаю нету. Хотя могу и ошибиться.
Попробуй сам вести отсчет с помощью переменной.
А где это нужно?
Может есть другое решение?
to ALL
Прочитайте тему еще раз.
-
Сразу извинюсь за неточно поставленный вопрос...
Хотя всё равно ondr меня понял - мне нужен именно аналог current. Т.е. чтобы знать текущий элемент не только в цикле но и выйдя из цикла, не перебрав все элементы.
Попробуй сам вести отсчет с помощью переменной.
Думал насчёт отдельной переменной. Но в моём случае это будет не очень эффективно. Массивов много. Просто думая как эффективнее это реализовать, я вспомнил, что в PHP указатели встроены.
В общем, как я понял, придётся самому решать проблему...
ЗЫ
Вопрос ещё открыт - может всё таки есть такое в Perl?
-
Задачу в студию.
И как можно более подробно
-
2NeoNox
Цикл проходит массив поэлементно. При определённом условии он начинает обрабатывать (он сам в цикле, чтобы можно было как бы "менять" обрабатываемые массивы) другой массив, а затем возвращается к обработке прежнего. Так вот мне нужно вернуться к обработке прежнего массива именно в то место, где остановился.
-
Хм... И что тебе не нравится? Способов тут очень много. Вот самый наипростейший пример:
-----
...
...
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: Опиши задачу более точно. Лучше с примером.
-
2ondr
Твой пример основан на том, что изначально известна структура данных. Мне - нет.
Пока остановился на хэше: ключ, определяющий нужный мне массив, значение - номер строки.
Что конкретно тебе непонятно в моём предыдущем сообщении? (там как раз описывается задача)
-
Ставь метки на циклы и выходи/переходи при этих определенных условиях. Что в этом сложного?
-
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;
-
А, еще... Пример как с этим работать:
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());
-
2NeoNox
Цикла всего два: один внешний - оболочка. Другой - внутренний - основной. Основной проходит массив поэлементно. Если выполняются определённые условия, выходим из основного цикла и входим в него опять (в этом нам помогает внешний цикл) с новым массивом.
Может я тебя не понял, но как здесь использовать метки я себе представляю очень слабо. Точнее, вообще не представляю - цикл-то по существу один. Просто он выполняется несколько раз за счёт внешнего цикла.
2mike
Понял тебя :)
Хорошая идея, но не в моём случае. Мне кажется, будет жирновато делать отдельный модуль лишь для того чтобы узнать текущий элемент. (Или я не прав?)
Тот вариант, на котором я остановился по сути тот же, что предложил ты, только без использования модуля (см. мой предыдущий пост).
-
metton:
Мне кажется, будет жирновато делать отдельный модуль лишь для того чтобы узнать текущий элемент.
ИМХО, рано или поздно ты все равно придешь к тому, чтобы написать набор функций, которые работают с твоим хешем. А будет он встроен в скрипт или вынесен в отдельный модуль - это уж как понравится. Если подобная проблема встретится в еще одном скрипте, то этот набор стоит вынести как минимум в отдельный файл.