Perl и Python выбирают различные значения по умолчанию для разделителя выходной записи. Вы можете увидеть дополнительную новую строку, если посмотреть на вывод в виде октетов:
$ python -c 'print("A")' | hexdump
0000000 41 0a
0000002
$ perl -e 'print "A"' | hexdump
0000000 41
0000001
Это не единственный способ отличия Perl. Python также добавляет пробелы между аргументами к print
, тогда как Perl - нет. Ruby puts
добавляет новую строку между аргументами:
$ python -c 'print("A", "B")' | hexdump
0000000 41 20 42 0a
0000004
$ perl -e 'print "A", "B"' | hexdump
0000000 41 42
0000002
$ ruby -e 'puts( "A", "B" )' | hexdump
0000000 41 0a 42 0a
0000004
Perl может добавить новую строку для вас. В командной строке переключатель -l
делает это автоматически для print
(но не printf
). Внутри кода say
делает это, но по-прежнему не добавляет никаких символов между аргументами. -E
похож на -e
, но включает новые функции начиная с v5.10, из которых say
- одна:
$ perl -le 'printf "%s%s", "A", "B"' | hexdump
0000000 41 42
0000002
$ perl -le 'print "A", "B"' | hexdump
0000000 41 42 0a
0000003
$ perl -lE 'say "A", "B"' | hexdump
0000000 41 42 0a
0000003
Когда вы декомпилируете одну из этих , вы можете обратите внимание, что Perl просто устанавливает разделитель выходной записи, $\
для вас, что вы можете сделать самостоятельно, используя глобальную переменную:
$ perl -MO=Deparse -le 'print "A", "B"'
BEGIN { $/ = "\n"; $\ = "\n"; }
print 'A', 'B';
-e syntax OK
Но вы также можете установить разделитель выходной записи самостоятельно:
$ perl -e '$\ = "\n"; print "A", "B"' | hexdump
0000000 41 42 0a
0000003
Perl управляет символами между аргументами print
и say
с помощью переменной $,
, поэтому вы можете установить:
$ perl -lE '$, = " "; say "A", "B"' | hexdump
0000000 41 20 42 0a
0000004
In Python вы go в обратном направлении, потому что у него разные значения по умолчанию. Это для Python 3:
$ python -c 'print("A", "B", sep="", end="")' | hexdump
0000000 41 42
0000002