Официальный документ предлагает три различных способа:
1) Использование lookbehind и lookahead (требуется oniguruma )
12500.to_s.gsub(/(?<=\d)(?=(?:\d{3})+\z)/, ' ')
# => "12 500"
2) Используя только lookahead. Идентичен ответу Стинслага.
3) Не используя ни взгляд, ни взгляд назад
s = 12500.to_s
nil while s.sub!(/(.*\d)(\d{3})/, '\1 \2')
s # => "12 500"
Как кодовый заголовок сказал , вам придется перебирать индексы массива вместо его элементов. Я предпочитаю этот вариант циклу для
в стиле C:
for my $i (0 .. $#x) {
print "$i: $x[$i]\n";
}
В Perl до 5.10 вы можете сказать
#!/usr/bin/perl
use strict;
use warnings;
my @a = qw/a b c d e/;
my $index;
for my $elem (@a) {
print "At index ", $index++, ", I saw $elem\n";
}
#or
for my $index (0 .. $#a) {
print "At index $index I saw $a[$elem]\n";
}
В Perl 5.10 вы используете состояние для объявления переменной, которая никогда не будет повторно инициализирована (в отличие от переменных, созданных с помощью ] мой ). Это позволяет вам сохранить переменную $ index
в меньшей области, но это может привести к ошибкам (если вы войдете в цикл второй раз, оно все равно будет иметь последнее значение):
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
my @a = qw/a b c d e/;
for my $elem (@a) {
state $index;
say "At index ", $index++, ", I saw $elem";
}
В Perl 5.12 вы можно сказать
#!/usr/bin/perl
use 5.012; # This enables strict
use warnings;
my @a = qw/a b c d e/;
while (my ($index, $elem) = each @a) {
say "At index $index I saw $elem";
}
Но имейте в виду: у вас есть ограничения на то, что вам разрешено делать с @a
, при повторении с каждый
.
Сейчас это вам не поможет, но в Perl 6 вы сможете сказать
#!/usr/bin/perl6
my @a = <a b c d e>;
for @a Z 0 .. Inf -> $elem, $index {
say "at index $index, I saw $elem"
}
Оператор Z
объединяет два списка вместе (т.е. берет один элемент из первого списка, затем один элемент из второго, затем один элемент из первого и так далее). Второй список - это ленивый список, который содержит все целые числа от 0 до бесконечности (по крайней мере, теоретически). -> $ elem, $ index
говорит, что мы берем сразу два значения из результата zip. Остальное должно выглядеть нормально для вас (если вы еще не знакомы с функцией , скажем,
из 5.10).
Нет, вы должны создать свой собственный счетчик. Еще один пример:
my $index;
foreach (@x) {
print $index++;
}
при использовании для индексации
my $index;
foreach (@x) {
print $x[$index]+$y[$index];
$index++;
}
И, конечно же, вы можете использовать local $ index;
вместо my $ index;
и так далее.
perldoc perlvar
, похоже, не предлагает такой переменной.
Не с foreach
.
Если вам определенно нужна мощность элемента в массиве, используйте итератор «for»:
for ($i=0; $i<@x; ++$i) {
print "Element at index $i is " , $x[$i] , "\n";
}
Вот такой способ:
use List::Rubyish;
$list = List::Rubyish->new( [ qw<a b c> ] );
$list->each_index( sub { say "\$_=$_" } );
См. List :: Rubyish .
В большинстве случаев вам не нужно знать индекс. Вы можете сделать это:
my @arr = (1, 2, 3);
foreach (@arr) {
$_++;
}
print join(", ", @arr);
В этом случае вывод будет 2, 3, 4 , поскольку foreach устанавливает псевдоним для фактического элемента, а не только для его копии.
autobox::Core
предоставляет, среди многих других вещей, удобный for
метод:
use autobox::Core;
['a'..'z']->for( sub{
my ($index, $value) = @_;
say "$index => $value";
});
Альтернативно, посмотрите на модуль итератора, например: Array::Iterator
use Array::Iterator;
my $iter = Array::Iterator->new( ['a'..'z'] );
while ($iter->hasNext) {
$iter->getNext;
say $iter->currentIndex . ' => ' . $iter->current;
}
Также смотрите: