Eu estou tentando:
#!/usr/bin/env perl
use 5.038;
use warnings FATAL => 'all';
use autodie ':all';
use Devel::Confess 'color';
while (my ($i, $t) = each('a','b','c')) {
say "$i, $t";
}
mas recebo um erro:
Experimental each on scalar is now forbidden
('a','b','c')
é um escalar?
Eu realmente gosto de Perl each
em arrays, pois não preciso declarar uma variável iteradora.
Eu também tentei
while (my ($i, $t) = each(('a','b','c'))) {
while (my ($i, $t) = each(qw('a','b','c'))) {
mas recebo o mesmo erro.
while (my ($i, $t) = each(@{ ('a','b','c') }) {
mas o texto acima apresenta um erro: Useless use of a constant ("a") in void context
que obtive em como resolver o problema “Valores experimentais em escalar agora são proibidos” em perl
Como posso convencer Perl each
de que ('a','b','c') é um array?
Você não pode, porque
('a','b','c')
é apenas uma lista de literais de string (escalares). Não é uma variável de array.Os documentos de cada um são claros
Então ele quer uma variável, seja um hash ou um array.
Há também a questão do erro que surge
Primeiro, a mensagem de erro completa que recebo para esse código
é instrutivo
A função
each
é prototipada ,então ele precisa de um item que precisa ser uma variável hash ou array. Ao passar uma lista para ela, temos uma incompatibilidade que é detectada em tempo de compilação e deve ser fatal. Então, o jogo acabou.
Porém, e acredito que seja uma cortesia adicional, também recebemos aquela mensagem sobre " experimental each on scalar ".
O problema é que, se essa incompatibilidade no protótipo passasse (não fosse fatal), a lista
'a', 'b', 'c'
seria então uma expressão a ser avaliada, que produzia três escalares ou um escalar (pelo operador vírgula, os dois primeiros itens são descartados e o a expressão retorna'c'
ou, se a precedência for o contrário,'a'
é retornada e o restante descartado), dependendo do contexto.Em ambos os casos, um escalar seria destinado a
each
, o que costumava ser permitido, então avisado e então totalmente proibido, e assim (ainda) recebemos uma mensagem extra.('a','b','c')
não é uma matriz; é uma lista. Consulte cada um .Se você atribuir a lista a uma variável de array, funcionará:
Saída: