Perl последовательность чисел с ведущими нулями

Есть ли простой способ (без sprintf и, разумеется, printf) получить список (001, 002, ... 100) в Perl? В bash это было что-то вроде seq -w 1 100. Как насчет Перла?


person Eugene Barsky    schedule 29.09.2017    source источник
comment
Для большинства практических целей '001'..'100' должен создать этот список довольно хорошо.   -  person tjd    schedule 29.09.2017
comment
Большой! Не знал этого.   -  person Eugene Barsky    schedule 29.09.2017
comment
@evb: Пожалуйста, объясните, почему вы не хотите использовать sprintf?   -  person Borodin    schedule 29.09.2017
comment
@Borodin Я привык к bash seq -w, поэтому решение с sprintf кажется слишком «тяжелым». И да, нашлось еще более изящное решение.   -  person Eugene Barsky    schedule 29.09.2017
comment
@evb sprintf / printf может показаться тяжелым, но я обнаружил, что почти каждое решение, которое передается на C, быстрее, чем реализация на чистом Perl, даже с накладными расходами на вызов XS.   -  person Edwin Buck    schedule 30.09.2017
comment
@EdwinBuck, спасибо, буду использовать в работе. У меня был экзамен по C в 1991 году, но я совершенно забыл об этом языке (кроме того, что там много фигурных скобок). :)   -  person Eugene Barsky    schedule 30.09.2017
comment
@evb: всегда лучше различать предпочтение и требование. Возможно, sprintf по какой-то причине запрещено, но на самом деле кажется, что такая подпрограмма, как sub d2 { sprintf '%02d', @_ }, могла бы помочь.   -  person Borodin    schedule 30.09.2017
comment
@Borodin В настоящее время моя цель - лучше знать язык. Если бы я использовал только sprintf, я бы не узнал о «001»... «100», что проще. :)   -  person Eugene Barsky    schedule 30.09.2017
comment
@evb: Необязательно делать вещи проще. И это не имеет ничего общего с различием между предпочтением и требованием в ваших вопросах. А так вы узнали лишь ограниченное представление о способности Perl увеличивать строки. Если вы хотите узнать о языке то, чего не знаете, вам следует прочитать справочник по языку. Я до сих пор читаю Programming Perl примерно раз в год.   -  person Borodin    schedule 30.09.2017
comment
@Borodin Я считаю, что обучение должно быть постепенным, а также должно быть весело. Если бы люди могли за несколько дней прочитать справочник объемом в тысячу страниц и запомнить его слово за словом, таких сайтов вопросов и ответов, как этот, скорее всего, не существовало бы. Чистое имхо конечно и еще раз спасибо вам за помощь!   -  person Eugene Barsky    schedule 30.09.2017
comment
@evb: Ваш комментарий все еще не связан с моим: важно различать предпочтение и требование в ваших вопросах, чтобы мы знали, с чем имеем дело. Основная причина, по которой существуют такие сайты, заключается в том, что, даже если вы знаете язык наизнанку, у вас есть все необходимые инструменты, но вам все еще может быть трудно объединить их для предоставления конкретного решения. Вы не должны думать о Переполнение стека как о замене руководств.   -  person Borodin    schedule 30.09.2017
comment
@EugeneBarsky Каким-то образом это появилось сегодня в моих уведомлениях. Перечитал комментарии, увидел что-то новое. Сначала вы сказали «быстрее», чем «просто». Я думаю, вы действительно хотели, чтобы в этот день было больше Perl. Увеличение строк не быстрее и не проще. Perl определяет простое довольно странным образом, так что, возможно, вы слишком много пили из воды Perl. Увеличение строки происходит медленнее и сложнее, особенно если кто-то вводит неожиданный символ. Одна из проблем с Perl заключается в том, что он определяет простые символы вместо выполняемой логики.   -  person Edwin Buck    schedule 14.02.2021


Ответы (2)


ты имеешь в виду вот так?

for ('001'..'100') {
    print "$_\n";
}

.. в диапазоне возвращает список значений, считая по единицам, от левого значения до правого значения.

Дополнительные сведения об использовании диапазона см. в разделе оператор диапазона Perldoc. и эта ссылка

person Gerhard    schedule 29.09.2017
comment
Возможно, вы захотите объяснить оператор ... - person simbabque; 29.09.2017
comment
ставлю ссылку на документацию - person matiit; 29.09.2017
comment
Да это оно! Спасибо за ссылки! - person Eugene Barsky; 29.09.2017
comment
Важно понимать, что это следствие поведения оператора ++ со строками, которое оператор диапазона .. использует под капотом. - person Borodin; 30.09.2017
comment
после того, как я подумал, как я могу сделать это в perl, я также заработал с bash - просто упомяните для справки: for i in {001..100};do echo ›››${i}‹‹‹;done` - person eli; 30.07.2020

Printf был создан для таких проблем. Его использование поможет вам быстрее получить нужные ответы.

foreach my $number ( 1 .. 100 ) {
     printf "%03d\n", $number;
}

% означает «начало последовательности формата». 0 означает «начальные нули». 3 означает «минимум три цифры». d означает «рассматривать параметр как цифры (целое число)».

person Edwin Buck    schedule 29.09.2017
comment
ОП не запросил sprintf. Предположительно, это относится и к printf. - person tjd; 29.09.2017
comment
Я думаю, что причина отсутствия sprintf во многом связана с учебниками по Perl. По сути, они учат форматированию с помощью sprintf и каким-то образом избегают громкой рекламы того, что у них есть printf. Если бы я видел sprintf только для того, чтобы потом печатать, это казалось бы неуклюжим, неэлегантным и чего-то, чего следует избегать. - person Edwin Buck; 29.09.2017
comment
@ ЭдвинБак правда. - person Gerhard; 29.09.2017
comment
Спасибо за ваш комментарий! Возможно, мой вопрос был неясен, я хотел сделать это без sprintf или printf. - person Eugene Barsky; 29.09.2017