Seri matematika, ambil contoh urutan berurutan yang diwakili di sini sebagai array:
my @seq = my $a=0, {++$a} ... *;
for @seq[^10].kv {state $f=0; ($^k < 4 or $^k > 7) ?? say "a$^k = " ~ $^v !! (say "..." if $f ne 1; $f=1) };
Cetakan:
a0 = 0
a1 = 1
a2 = 2
...
a8 = 8
a9 = 9
Pertanyaan saya: 1- Apakah ada cara sederhana untuk menghilangkan hanya elemen pertama yaitu a0 = 0
dari hasil cetak?
2- Bisakah kode ini dibuat lebih idiomatis?
Terima kasih.
Jawaban:
Solusi barebones
Mari kita mulai dengan solusi yang sangat sederhana untuk mencetak inti dari suatu urutan. Itu tidak berurusan dengan spesifik yang telah Anda tambahkan ke pertanyaan Anda, tetapi itu adalah titik awal yang baik:
Tidak seperti
.kv
, yang mengubah invosinya ke dalam bentukkey1, value1, key2, value2, key3, value3, ...
, yaitu 6 elemen jika invosinya mengandung 3 elemen,.pairs
mengubah invosanya menjadi bentukkey1 => value1, key2 => value2, key3 => value3, ...
.Saya menggunakan
.pairs
bukan.kv
sebagian karena itu berarti saya bisa menggunakan».gist
nanti dalam kode untuk dengan mudah mendapatkankey1 => value1
tampilan yang bagus untuk setiap elemen. Kami akan memodifikasi itu di bawah ini tetapi ini adalah awal yang bagus untuk memulai.The
.head
dan.tail
panggilan adalah cara idiomatik untuk membuat daftar kecil dari yang pertama dan terakhir unsur N dari daftar invocant (asalkan jangan malas; lebih lanjut tentang bahwa dalam mo a).Dengan solusi awal ini,
say seq-range-gist (0,1 ... Inf)[^10]
menampilkan:Selanjutnya, kami ingin dapat "membuang elemen pertama ... dari hasil cetak". Sayangnya
say seq-range-gist (0,1 ... Inf)[1..9]
menampilkan:Kami ingin nomor di sebelah kiri
=>
mempertahankan penomoran urutan asli. Untuk mengaktifkan ini, kami membagi urutan yang mendasarinya dari rentang yang ingin kami ekstrak. Kami menambahkan parameter / argumen kedua@range
, dan menambahkan[@range]
ke baris kedua dari sub:Sekarang kita dapat menulis
say seq-range-gist (0,1 ... Inf), 1..9
untuk ditampilkan:Dalam pertanyaan Anda, Anda menggunakan format
aINDEX = VALUE
daripadaINDEX => VALUE
. Untuk membolehkan kustomisasi intisari, kami menambahkan&gist
parameter / argumen rutin ketiga dan meminta itu alih-alih.gist
metode bawaan:Perhatikan bagaimana pemanggilan "metode" dalam tubuh
seq-range-gist
sub sekarang.&gist
, tidak.gist
. Sintaks.&foo
memanggil sub&foo
(yang biasanya dipanggil dengan menulis adilfoo
), melewati pemohon di sebelah kiri.
sebagai$_
argumen ke sub.Perhatikan juga bahwa saya telah membuat
&gist
parameter bernama satu dengan mendahului dengan a:
.Jadi sekarang
say seq-range-gist (0,1 ... Inf), 1..9, gist => { "a{.key} = {.value}" }
tampilkan:Menambahkan cat
Sisa dari jawaban ini adalah bahan bonus untuk pembaca yang peduli dengan bahasa Polandia.
say seq-range-gist (0, 1, 2, 3), ^3
menampilkan:Ups. Dan bahkan jika ada lebih banyak pasangan daripada gabungan antara kepala dan ekor, jadi setidaknya kita tidak mendapatkan garis yang diulang, masih tidak ada gunanya menggunakan
head, ..., tail
pendekatan untuk menghilangkan hanya satu atau dua elemen. Mari kita ubah pernyataan terakhir di sub tubuh untuk menghilangkan masalah ini:Selanjutnya, alangkah baiknya jika sub melakukan sesuatu yang berguna jika dipanggil tanpa range atau intisari. Kami sebagian besar dapat memperbaikinya dengan memberikan
@range
dan&gist
parameter default yang sesuai:Jika
@seq
ini tidak malas , maka@range
default ke berbagai@seq
. Jika@seq
tidak terbatas (dalam hal ini juga malas), maka standar hingga 100 baik-baik saja. Tetapi bagaimana jika@seq
malas tetapi menghasilkan kurang dari 100 nilai yang ditentukan? Untuk membahas kasus ini kami menambahkan.grep: *.value.defined
ke@pairs
deklarasi:Peningkatan sederhana lainnya adalah parameter kepala dan ekor opsional, yang mengarah ke solusi akhir yang dipoles:
sumber
...
bagian yang membuatnya terlihat seperti program C. Jadi ini menjawab kedua bagian pertanyaan saya, sungguh. Adapun solusi 'komprehensif', itu terlihat agak menakutkan, sungguh.Anda dapat melewati nilai N pertama pada setiap
Iterable
atauSequence
denganskip
:Jika Anda tidak menentukan nomor, itu akan melewati hanya satu elemen.
sumber
skip
tampaknya untuk menghapus hanya ouput yaitu elemen dengan indeks 0 (a0) sisa-sisa. Saya sudah mencoba@seq:delete
dan baru saja mengganti elemen 0 dengan(Any)
skip
akan bertindak seolah-olah elemen yang dilewati tidak ada. Ini mungkin atau mungkin bukan yang Anda inginkan :-)skip
di antara sehingga terbaca:for @seq[^10].skip(0).kv
itu benar - benar tidak melewatkan elemen 0 dan tidak masalah jika saya berikan sebagai argumen keskip
1 atau 2, itu hanya mendistorsi lebih jauh. Saya perlu cara praktis untuk menghapus elemen 0 dari bawah ke atas.for @seq[^10].kv.skip(2)
apa yang Anda cari?skip
setelah.kv
tapi menggunakan argumen selain 2, jadi tidak berhasil. Terima kasih atas solusinya.Ini mungkin sedikit lebih idiomatis:
Anda tidak perlu menggunakan variabel leksikal dalam urutan; salah satu
Whatever
atau variabel placeholder dapat digunakan dengan aman dalam urutan. Kemudian Anda cukup memilih elemen dari urutan yang ingin Anda cetak. Yang kembali«(0 1 2 3)(7 8 9 10)»
sumber
whatever
operator refreshening tapi output seri / berurutan tidak mengatasi masalah utama. Saya ingin mencetak seri seperti yang terlihat pada buku teks matematika, yaitu dengan...
notasi di antaranya.