Как я могу повторить строку N раз в Perl?

48

В Python, если я это сделаю:

print "4" * 4

Я получаю

> "4444"

В Perl я получил бы

> 16

Есть ли простой способ сделать первый в Perl?

  • 0
    Это также возможно со строковыми переменными (и строковыми выражениями), смотрите мой ответ .
Теги:
string
operators
repeat

6 ответов

88
Лучший ответ
$ perl -e 'print "4"x4; print "\n"'
4444

Оператор x документируется в perldoc perlop. Здесь двоичный код означает, что оператор принимает два аргумента, но не состоит из битов.

Двоичный "x" - это оператор повторения. В скалярном контексте, или если левый операнд не заключен в круглые скобки, он возвращает строку, состоящую из левого операнда повторили количество раз, указанное правым операнд. В контексте списка, если левый операнд заключен в круглые скобки или это список, образованный "qw/STRING/", он повторяет список. Если право операнд равен нулю или отрицателен, он возвращает пустую строку или пустой в зависимости от контекста.

       print ’-’ x 80;             # print row of dashes

       print "\t" x ($tab/8), ’ ’ x ($tab%8);      # tab over

       @ones = (1) x 80;           # a list of 80 1’s
       @ones = (5) x @ones;        # set all elements to 5

perl -e предназначен для выполнения Perl-кода из командной строки:

$ perl --help
Usage: perl [switches] [--] [programfile] [arguments]
  
  -e program     one line of program (several -e allowed, omit programfile)
  • 1
    Просто замечание - не всем пользователям Perl (особенно новым) может быть непонятно, что делает опция -e, поэтому было бы лучше привести пример прямого кода (как и ответ Павла).
  • 0
    perl -Esay+4x4 Здесь «-E» позволяет «использовать 5,010» (в частности - функцию «сказать»). say "$var" - то же самое, что print "$var\n" . В скалярном контексте оператор 'x' всегда возвращает строку, поэтому здесь нет необходимости использовать кавычки.
Показать ещё 4 комментария
37

В Perl вы хотите использовать оператор "x".

Обратите внимание на разницу между

"4" x 4

и

("4") x 4

Первая создает повторяющуюся строку:

"4444"

последний повторный список:

("4", "4", "4", "4")
  • 0
    Вы делаете хорошую точку зрения там
  • 4
    В Perl 6 оператор x всегда возвращает строку (левый операнд вычисляется в строковом контексте, например, 4x4 -> "4" x4 -> "4444"), xx - повторная операция для списков, например, 4xx4 -> (4) xx4 -> (4,4,4,4).
16

Это очень похоже на Perl

print "4" x 4;
8

FWIW, его также print 4 x 4 в Perl.

В общем случае в Perl операторы мономорфны, т.е. у вас есть разные наборы операторов для семантики строк, для числовой семантики, для поразрядной семантики и т.д., где это имеет смысл, а тип операндов в значительной степени не имеет значения. Когда вы применяете числовой оператор к строке, строка сначала преобразуется в число, и вы получаете операцию, которую вы запросили (например, умножение), и когда вы применяете оператор строки к числу, он превращается в строку, и вы выполните операцию, которую вы попросили (например, повторение). Perl обращает внимание на оператор сначала, а типы операндов - только на второй - если действительно он платит им любой разум вообще.

Это противоположность Python и большинства других языков, где вы используете один набор операторов, а типы операндов определяют, какую семантику вы действительно получаете, т.е. операторы являются полиморфными.

  • 1
    То, что ты можешь, не обязательно означает, что ты должен. Я думаю, что ясность намерений делает код более читабельным для всех. Пропуск цитат делает его менее читабельным для моих глаз.
  • 1
    а) Вы видели что-нибудь в моем ответе о том, что вы должны или не должны делать? (В любом случае это 4 x 4 вряд ли будет отображаться в реальном коде Perl.) Б) Если он менее читабелен для вас, вы обращаете внимание на неправильные вещи (формы операндов, а не оператора).
Показать ещё 2 комментария
1

Если вы хотите напечатать 10 символов "A", вы также можете сделать это

perl -e 'print "A" x 10'; echo

Пример с выходом

user@linux:~$ perl -e 'print "A" x 10'; echo
AAAAAAAAAA
user@linux:~$ 
1

Все ответы, данные до сих пор, не упоминаются, что оператор x работает не только на строковых литералах, но также на строковых переменных или выражениях, которые строят строки:

$msg = "hello ";
print $msg x 2;
print ($msg x 2) x 2;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню