Fatiar uma matriz que contém cadeias vazias

3

Considere o array foo , inicializado assim:

$ foo=( a b '' d e f g )

foo contém 7 elementos, um dos quais é uma string vazia.

Abaixo estão algumas maneiras de imprimir o conteúdo de foo , usando o print embutido:

$ print -rl -- $foo
a
b
d
e
f
g
$ print -rl -- "$foo"
a b  d e f g
$ print -rl -- $foo[@]
a
b
d
e
f
g
$ print -rl -- "$foo[@]"
a
b

d
e
f
g

Observe que apenas o formulário cujo último token é "$foo[@]" interpreta como 7 argumentos separados.

Agora, suponha que eu queira usar print -rl -- ... para exibir apenas os primeiros 5 elementos de foo , um elemento por linha?

Isso não funcionará:

$ print -rl -- "$foo[1,5]"
a b  d e

Nem isto:

$ print -rl -- $foo[1,5]
a
b
d
e

Eu tentei outras variantes, mas todas elas não produzem o resultado desejado, ou seja

a
b

d
e

Qual é o equivalente de fatia do total "$foo[@]" ?

Se não houver tal equivalente, como criar uma matriz bar consistindo nos primeiros 5 elementos de foo ?

    
por kjo 26.06.2017 / 18:14

1 resposta

4

Embora zsh não faça split + glob na expansão de parâmetro, ele ainda faz remoção vazia, então essa ainda é uma das razões pelas quais você deseja citar variáveis lá, então:

print -rl -- "$var[@]"

Ou

print -rl -- "${(@}var}"

Aqueles @ devem obter o comportamento semelhante ao Bourne "$@" .

Para os elementos 1 a 5:

print -rl -- "${(@)var[1,5]}"

A variante ksh -like também funcionará:

print -rl -- "${(@)var:0:5}"
    
por 26.06.2017 / 18:36

Tags