Parece que me deparei com várias maneiras diferentes de encontrar o tamanho de uma matriz. Qual é a diferença entre esses três métodos?
my @arr = (2);
print scalar @arr; # First way to print array size
print $#arr; # Second way to print array size
my $arrSize = @arr;
print $arrSize; # Third way to print array size
print 0+@arr
,print "".@arr
,print ~~@arr
"".@arr
como"@arr"
algo completamente diferente.Respostas:
A primeira e a terceira maneira são as mesmas: elas avaliam uma matriz no contexto escalar. Eu consideraria essa a maneira padrão de obter o tamanho de uma matriz.
A segunda maneira, na verdade, retorna o último índice da matriz, que não é (geralmente) o mesmo que o tamanho da matriz.
fonte
$[
especifica "O índice do primeiro elemento em uma matriz e do primeiro caractere em uma substring" (perldoc perlvar
). É definido como 0 por padrão, e defini-lo como algo diferente de 0 é altamente desencorajado.$[
está desanimado (e há uma década).$[
está obsoleto. Usar$[
emite um aviso de descontinuação, mesmo quando não é ativado os avisos. Atribuir qualquer coisa, exceto zero$[
, será um erro no 5.16. Já podemos parar de mencionar$[
?$[
saberia de seus efeitos.scalar @arr
e ainda$#arr
deve entender os possíveis efeitos , por mais raros que sejam.$[
Primeiro, o segundo não é equivalente aos outros dois.
$#array
retorna o último índice da matriz, que é um a menos que o tamanho da matriz.Os outros dois são praticamente iguais. Você está simplesmente usando dois meios diferentes para criar um contexto escalar. Tudo se resume a uma questão de legibilidade.
Pessoalmente, prefiro o seguinte:
Acho mais claro que
e
O último parece bem claro sozinho assim, mas acho que a linha extra tira a clareza quando parte de outro código. É útil para ensinar o que
@array
faz no contexto escalar, e talvez se você quiser usar$size
mais de uma vez.fonte
my $size=@array
parece que pode ser um erro quando o símbolo errado foi usado.scalar
sem motivo aprendem a lição errada. Eles começam a pensar que os operadores retornam listas que podem ser coagidas em escalares. Visto dezenas de vezes.scalar
porque está coagindo a lista a um contexto escalar. Essa é a razão certa para usá-lo. Seu exemplo faz exatamente a mesma coisa, mas depende do que o Perl faz quando você avalia uma variável de lista em um contexto implicitamente escalar. Portanto, seu exemplo exige que o leitor conheça o comportamento implícito do Perl nesse contexto. Você está apenas adicionando mais uma camada de comportamento implícito à expressão, e o Perl já tem um comportamento implícito demais que você precisa analisar para decifrar um programa.scalar
porque está coagindo a lista a um contexto escalar". Você está provando meu ponto de aprender a lição errada. Isto é completamente falso. Nenhuma lista é coagidascalar
. (Se sim,scalar(@array)
escalar(@array[0..$#array])
retornaria a mesma coisa.)scalar(@array)
Diz@array
para retornar um escalar, com o qual você já dissemy $size=
.Isso obtém o tamanho forçando a matriz em um contexto escalar, no qual é avaliada como seu tamanho:
Essa é outra maneira de forçar a matriz para um contexto escalar, pois está sendo atribuída a uma variável escalar:
Isso obtém o índice do último elemento da matriz, então, na verdade, é o tamanho menos 1 (assumindo que os índices iniciam em 0, o que é ajustável no Perl, embora isso seja geralmente uma má idéia):
Este último não é realmente bom para obter o tamanho da matriz. Seria útil se você apenas deseja obter o último elemento da matriz:
Além disso, como você pode ver aqui no Stack Overflow, essa construção não é tratada corretamente pela maioria dos marcadores de sintaxe ...
fonte
$arr[-1]
para obter o último elemento. E$arr[-2]
para obter o penúltimo, e assim por diante.$#arr
não é um recurso muito útil e não é por acaso que outros idiomas não o possuem.Para usar a segunda maneira, adicione 1:
fonte
for [0..$#array] { print $array[$_ ] }
funciona muito bem se o objetivo de obter o número de elementos for iterar através da matriz. A vantagem é que você obtém o elemento e um contador que estão alinhados.Todos os três dão o mesmo resultado se modificarmos um pouco o segundo:
fonte
Exemplo:
fonte
A seção “Tipos de variáveis Perl” da documentação do perlintro contém
A documentação da perldata também cobre isso na seção "Valores escalares" .
Anteriormente, na mesma seção, documenta como obter o índice do último elemento de uma matriz.
fonte
Existem várias maneiras de imprimir o tamanho da matriz. Aqui estão os significados de todos: Vamos dizer que nossa matriz é
my @arr = (3,4);
Método 1: escalar
Este é o caminho certo para obter o tamanho das matrizes.
Método 2: número do índice
$#arr
fornece o último índice de uma matriz. portanto, se a matriz tiver tamanho 10, seu último índice será 9.Estamos adicionando 1 aqui, considerando a matriz como indexada em 0 . Mas, se não for zero, então, essa lógica falhará .
O exemplo acima imprime 6, porque definimos seu índice inicial como 4. Agora, o índice seria 5 e 6, com os elementos 3 e 4, respectivamente.
Método 3:
Quando uma matriz é usada no contexto escalar, ela retorna o tamanho da matriz
Na verdade, o método 3 e o método 1 são iguais.
fonte
De perldoc perldata , que deve ser seguro citar:
Contanto que você não adicione $ # qualquer que seja ++ e aumente misteriosamente o tamanho ou sua matriz.
e
O que me leva ao que eu estava procurando e como detectar a matriz está vazia. Eu encontrei se $ # empty == -1;
fonte
Que
int(@array)
tal ameaçar o argumento como escalar.fonte
Para encontrar o tamanho de uma matriz, use a
scalar
palavra-chave:Para descobrir o último índice de uma matriz, existe
$#
(variável padrão Perl). Fornece o último índice de uma matriz. Quando uma matriz começa em 0, obtemos o tamanho da matriz adicionando uma a$#
:Exemplo:
Resultado:
fonte