Математическая серия, например, последовательная последовательность, представленная здесь в виде массива:
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) };
Печать:
a0 = 0
a1 = 1
a2 = 2
...
a8 = 8
a9 = 9
Мои вопросы: 1- Есть ли простой способ удалить только первый элемент, то есть a0 = 0
из распечатки?
2- Можно ли сделать этот код более идиоматичным?
Спасибо.
Ответы:
Баскетбольное решение
Давайте начнем с очень простого решения для печати сути последовательности. Это не касается специфики, которую вы добавили в свой вопрос, но это хорошая отправная точка:
В отличие от
.kv
, который преобразует свой инвокант в формуkey1, value1, key2, value2, key3, value3, ...
, то есть 6 элементов, если его инвокант содержит 3 элемента,.pairs
преобразует свой инвокант в формуkey1 => value1, key2 => value2, key3 => value3, ...
.Я использовал
.pairs
вместо.kv
частично, потому что это означало, что я мог бы».gist
позже использовать в коде, чтобы без особых усилий получить хорошееkey1 => value1
отображение для каждого элемента. Мы изменим это ниже, но это хорошее идиоматическое начало..head
И.tail
звонки идиоматических способ создать небольшие списки первых и последних N элементов из списка invocant ( при условии , что это не лень, больше о том , что в мес).Учитывая это первоначальное решение,
say seq-range-gist (0,1 ... Inf)[^10]
отображает:Далее, мы хотим иметь возможность «удалить только первый элемент ... из печатной продукции». К сожалению
say seq-range-gist (0,1 ... Inf)[1..9]
отображает:Мы хотим, чтобы число слева от
=>
сохранило нумерацию исходной последовательности. Чтобы включить это, мы отделяем основную последовательность от диапазона, который мы хотим извлечь. Мы добавляем второй параметр / аргумент@range
и добавляем[@range]
ко второй строке подпрограммы:Теперь мы можем написать
say seq-range-gist (0,1 ... Inf), 1..9
для отображения:В своем вопросе вы использовали формат,
aINDEX = VALUE
а неINDEX => VALUE
. Чтобы разрешить настройку сущности, мы добавляем третий&gist
стандартный параметр / аргумент и вызываем его вместо встроенного.gist
метода:Обратите внимание, что вызовы "method" в теле
seq-range-gist
sub теперь.&gist
не являются.gist
. Синтаксис.&foo
вызывает подпрограмму&foo
(которая обычно вызывается путем написания простоfoo
), передавая вызов слева.
в качестве$_
аргумента подпрограмме.Также обратите внимание, что я сделал
&gist
параметр именованным, поставив перед ним символ:
.Итак, теперь
say seq-range-gist (0,1 ... Inf), 1..9, gist => { "a{.key} = {.value}" }
отображает:Добавляя польский
Остальная часть этого ответа - бонусный материал для читателей, которым небезразлична полька.
say seq-range-gist (0, 1, 2, 3), ^3
дисплеи:К сожалению. И даже если бы было больше пар, чем головы и хвоста вместе, поэтому, по крайней мере, мы не получили повторяющихся линий, было бы бессмысленно использовать
head, ..., tail
подход, чтобы исключить только один или два элемента. Давайте изменим последнее утверждение в под-теле, чтобы устранить эти проблемы:Далее, было бы неплохо, если бы сабвуфер сделал что-то полезное, если бы вызывался без диапазона или сути. Мы можем главным образом исправить, давая
@range
и&gist
параметры , подходящие по умолчанию:Если
@seq
это не ленив , то по@range
умолчанию в полном диапазоне@seq
. Если@seq
это бесконечно (в этом случае это также лениво), то по умолчанию до 100 по умолчанию. Но что, если@seq
это ленивый, но дает менее 100 определенных значений? Чтобы охватить этот случай, мы добавляем.grep: *.value.defined
к@pairs
декларации:Еще одно простое улучшение - необязательные параметры головы и хвоста, приводящие к окончательному полированному решению:
источник
...
частью, заставляющей ее больше походить на C-программу. Так что это действительно отвечает на обе части моего вопроса. Что касается «комплексного» решения, то оно выглядит немного пугающим.Вы можете пропустить первые N значений для любого
Iterable
илиSequence
сskip
:Если вы не укажете число, будет пропущен только один элемент.
источник
skip
, Кажется, удалить только Ouput то есть элемент с индексом 0 - й (а0) остается. Я попытался,@seq:delete
и он просто заменил 0-й элемент на(Any)
skip
Будет просто действовать , как будто пропущенные элементы не существуют. Это может или не может быть то, что вы хотите :-)skip
между ними так, чтобы они читали:for @seq[^10].skip(0).kv
он буквально не пропускает 0-й элемент, и не имеет значения, если я приведу в качестве аргументаskip
1 или 2, он просто еще больше искажает. Мне нужен практический способ удалить 0-й элемент с нуля.for @seq[^10].kv.skip(2)
это то, что вы ищете?skip
после,.kv
но используя аргументы, отличные от 2, так что это не сработало. Спасибо за решение.Это может быть немного более идиоматическим:
Вам не нужно использовать лексическую переменную внутри последовательности; либо
Whatever
или шаблонные переменные могут быть безопасно использованы в последовательности. Затем вы можете просто выбрать элементы последовательности, которую вы хотите напечатать. Который возвращается«(0 1 2 3)(7 8 9 10)»
источник
whatever
Оператор refreshening но выход серии / последовательность не решает главный вопрос. Я хотел бы напечатать серию, как они видны на математических учебниках, то есть с...
пометкой между ними.