Python против Perl и правильность подсчета байтов - PullRequest
1 голос
/ 17 апреля 2020

Вывод, полученный из wc при попытке вычислить количество байтов в строке, отличается от python и perl на один байт.

Почему это так?

Является ли эта проблема исключительной для символов или может возникать в других типах?

Если да, существует ли известная таблица смещений для каждого типа?

$ python -c 'print("A")' | wc -c
2
$ python -c 'print("A" * 50)' | wc -c
51

$ perl -e 'print "A"' | wc -c
1
$ perl -e 'print "A" x 50' | wc -c
50

Ответы [ 2 ]

3 голосов
/ 17 апреля 2020

Python print "..." по существу совпадает с Perl print "...\n", то есть Python добавляет новую строку самостоятельно, Perl нет (хотя Perl say делает).

1 голос
/ 17 апреля 2020

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...