В Python, если я это сделаю:
print "4" * 4
Я получаю
> "4444"
В Perl я получил бы
> 16
Есть ли простой способ сделать первый в Perl?
$ 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)
perl -Esay+4x4
Здесь «-E» позволяет «использовать 5,010» (в частности - функцию «сказать»). say "$var"
- то же самое, что print "$var\n"
. В скалярном контексте оператор 'x' всегда возвращает строку, поэтому здесь нет необходимости использовать кавычки.
В Perl вы хотите использовать оператор "x".
Обратите внимание на разницу между
"4" x 4
и
("4") x 4
Первая создает повторяющуюся строку:
"4444"
последний повторный список:
("4", "4", "4", "4")
x
всегда возвращает строку (левый операнд вычисляется в строковом контексте, например, 4x4 -> "4" x4 -> "4444"), xx
- повторная операция для списков, например, 4xx4 -> (4) xx4 -> (4,4,4,4).
Это очень похоже на Perl
print "4" x 4;
FWIW, его также print 4 x 4
в Perl.
В общем случае в Perl операторы мономорфны, т.е. у вас есть разные наборы операторов для семантики строк, для числовой семантики, для поразрядной семантики и т.д., где это имеет смысл, а тип операндов в значительной степени не имеет значения. Когда вы применяете числовой оператор к строке, строка сначала преобразуется в число, и вы получаете операцию, которую вы запросили (например, умножение), и когда вы применяете оператор строки к числу, он превращается в строку, и вы выполните операцию, которую вы попросили (например, повторение). Perl обращает внимание на оператор сначала, а типы операндов - только на второй - если действительно он платит им любой разум вообще.
Это противоположность Python и большинства других языков, где вы используете один набор операторов, а типы операндов определяют, какую семантику вы действительно получаете, т.е. операторы являются полиморфными.
4 x 4
вряд ли будет отображаться в реальном коде Perl.) Б) Если он менее читабелен для вас, вы обращаете внимание на неправильные вещи (формы операндов, а не оператора).
Если вы хотите напечатать 10 символов "A", вы также можете сделать это
perl -e 'print "A" x 10'; echo
Пример с выходом
user@linux:~$ perl -e 'print "A" x 10'; echo
AAAAAAAAAA
user@linux:~$
Все ответы, данные до сих пор, не упоминаются, что оператор x
работает не только на строковых литералах, но также на строковых переменных или выражениях, которые строят строки:
$msg = "hello ";
print $msg x 2;
print ($msg x 2) x 2;