Procurando por uma maneira conveniente de criar um "array constante"

3

Em zsh, existe uma maneira conveniente de criar uma matriz de cópias n do mesmo número inteiro?

Contexto: Em um script de shell, eu preciso criar uma matriz, tile_lengths , consistindo em dois blocos constantes longos. Uma versão de brinquedo disso seria algo como

tile_lengths=(19 19 19 19 19 19 18 18 18 18 18 18 18 18 18)

... exceto que os comprimentos dos blocos são tipicamente em torno de 50, e os valores dos inteiros que compõem cada bloco, assim como os comprimentos dos blocos, são conhecidos apenas em tempo de execução.

    
por kjo 26.05.2016 / 16:48

2 respostas

2

Sou (marca) novo no zsh, então isso provavelmente poderia ser melhorado:

tile_lengths=()
num=19
times=6
repeat $times { tile_lengths+=( $num ); ((--times)) }
num=18
times=9
repeat $times { tile_lengths+=( $num ); ((--times)) }
print $tile_lengths

19 19 19 19 19 19 18 18 18 18 18 18 18 18 18

Inspirado pela resposta de terdon, acho que essa é uma variação mais clara da minha primeira tentativa:

tile_lengths=()
times=6 num=19 tile_lengths+=( $(repeat $times echo $num) )
times=9 num=18 tile_lengths+=( $(repeat $times echo $num) )
print $tile_lengths

19 19 19 19 19 19 18 18 18 18 18 18 18 18 18

    
por 26.05.2016 / 17:10
1

Que tal:

% tile_lengths=( $(repeat 25 echo 19; repeat 30 echo 18  ) )
% echo $tile_lengths                                        
19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18

Para outros shells, você pode fazer algo como:

$ tile_lengths=( $(perl -le 'print "19 " x 25, "18 " x 30') )
$ print $tile_lengths
19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18
    
por 26.05.2016 / 17:32