печатать, вставлять, говорить и экранировать символы - PullRequest
0 голосов
/ 10 января 2019

Согласно документам, единственная разница между print и say заключается в том, что последний добавляет «\ n» (и преобразует в строку с помощью .gist). Однако

perl6 -e 'print "del\b\b"'

печатает "d", эффективно применяя escape-символы, в то время как

perl6 -e 'put "del\b\b"'

выведет «del» (так же, как say). Возможно ли, что существует третий способ строкового преобразования строк, кроме .gist и простого .Str?

На самом деле любой персонаж, стоящий за \b, заставит их вести себя так же. Итак, есть идеи, почему это происходит?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Чтобы увидеть, что выводится, без возможного недопонимания того, что может делать терминал, вы можете передать через xxd (или od)

$ perl6 -e 'say "del\b\b"' | xxd
00000000: 6465 6c08 080a                           del...
$ perl6 -e 'print "del\b\b"' | xxd
00000000: 6465 6c08 08                             del..
$ perl6 -e 'put "del\b\b"' | xxd
00000000: 6465 6c08 080a                           del...
0 голосов
/ 10 января 2019

FWIW, я вижу «del» в обоих случаях, независимо от использования print или put, поэтому, возможно, есть некоторые настройки терминала, которые влияют на поведение?

\b\b становится очевидным, только когда вы фактически ставите символы после них:

say "del\b\bo the right thing"  # do the right thing

\b только перемещает курсор назад на одну позицию. Само по себе ничего не стирает. Если вы хотите, чтобы символы были стерты, вам нужно, чтобы за ними следовали пробелы, а затем снова возвращаться на обратную позицию, если вам снова понадобится какой-либо текст после этого:

print "del\b\b  \b\b"           # d
...