Могу ли я использовать размер массива, не помещая его в переменную - PullRequest
0 голосов
/ 23 января 2019

В настоящее время я делаю это, чтобы прочитать отдельное содержимое массива

my $size = @words;
for(my $x = 0; $x < $size, $x++)
{
   print $words[$x]; 
}

Можно ли пропустить присвоение $ size?Способ приведения массива и иметь на одну строку меньше?

т.е.

for(my $x = 0; $x < $(@word), $x++)
{
   print $words[$x]; 
}

Не могу найти правильный синтаксис.

Спасибо

Ответы [ 4 ]

0 голосов
/ 24 января 2019

Синтаксис, который вы ищете, на самом деле вообще не синтаксис.Если вы используете переменную массива в любом месте, где Perl знает, что вы должны использовать скалярное значение (например, в качестве операнда для оператора сравнения), тогда Perl даст вам количество элементов в массиве.

Итак, основываясь на вашемНапример, это будет работать:

# Note: I've corrected a syntax error here.
# I replaced a comma with a semicolon
for (my $x = 0; $x < @words; $x++)
{
   print $words[$x]; 
}

Но есть несколько способов, которыми мы можем улучшить это.Во-первых, давайте избавимся от уродливого и потенциально запутанного цикла в стиле C for и заменим его на гораздо более простой для понимания foreach.

foreach my $x (0 .. @words - 1)
{
   print $words[$x]; 
}

Мы также можем улучшить это @words - 1.Вместо этого мы можем использовать $#words, что дает окончательный индекс в массиве @words.

foreach my $x (0 .. $#words)
{
   print $words[$x]; 
}

Наконец, нам не нужен здесь индексный номер, поскольку мы просто используем его для доступакаждый элемент массива по очереди.Намного лучше перебирать элементы массива, а не индексы.

foreach my $element (@words)
{
   print $element; 
}
0 голосов
/ 23 января 2019

Лучше использовать foreach, но, к вашему конкретному вопросу, @foo в скалярном контексте разрешается до длины массива, а $#foo разрешается до индекса последнего элемента:

foreach my $word (@words) { ... } # preferred

for(my $i = 0; $i < @words; ++$i) { my $word = $words[$i]; ... } # ok sometimes

for(my $i = 0; $i <= $#words; ++$i) { my $word = $words[$i]; ... } # same thing

(при условии, что вы не играли с $[, чего не следует делать).

0 голосов
/ 24 января 2019

Заменить

for (my $i = 0; $i < $(@words), $i++) { ... $words[$i] ... }

на

for (my $i = 0; $i < @words; $i++) { ... $words[$i] ... }

Как и в вашем назначении, массив, вычисленный в скалярном контексте, дает свой размер.


Тем не менееиспользование цикла в стиле C является сложным и расточительным.

Лучшее решение, если вам нужен индекс:

for my $i (0..$#words) { ... $words[$i] ... }

Лучшее решение, если вам не нужен индекс:

for my $word (@words) { ... $word ... }
0 голосов
/ 23 января 2019

Да, for имеет встроенный итератор массива , for и foreach - синонимы.

for my $word (@words) {
    print $word;
}

Это предпочтительный способ перебора массивов вPerl.Циклы for в стиле C 3 не рекомендуется, если в этом нет необходимости.Их сложнее читать и приводить к ошибкам, как этот.

for(my $x = 0; $x < $size, $x++)
                         ^
             should be a ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...