Строки являются строками «символов», которые больше, чем байт. 1 Вы можете хранить в них байты и манипулировать ими, как если бы они были символами, принимая их substr
и т. Д., И пока вы просто манипулируете сущностями в памяти, все довольно персиковое. Хранилище данных странно, но это в основном не ваша проблема. 2
При попытке чтения и записи из файлов факт, что ваши символы могут не отображаться в байтах, становится важным и интересным. Не говоря уже о раздражении. Это раздражение на самом деле немного ухудшилось благодаря тому, что Perl пытается сделать то, что вы хотите в общем случае: если все символы в строке вписываются в байты, и вы попадаете в не-ОС Windows, вы фактически не имеете делать что-нибудь особенное для чтения и записи байтов. Однако Perl будет жаловаться, если вы сохранили символ размера, отличного от байта, и попробуйте написать его, не указывая на то, что с ним делать.
Это становится немного далеким полем, в основном потому, что кодирование является большой и запутанной темой. Позвольте мне оставить его там с некоторыми ссылками: Посмотрите на Encode(3perl), open(3perl), perldoc open и perldoc binmode для множества веселых и подробных деталей.
Таким образом, итоговый ответ «Да, вы можете обрабатывать строки так, как если бы они содержали байты, если они действительно содержат байты, которые вы можете обеспечить только чтением и записью байтов».
1: Или педантично ", который может выражать больший диапазон значений, чем байт, хотя они сохраняются как байты, когда это удобно". Я думаю.
2: Для записи строки в Perl внутренне представлены структурой данных, называемой «PV», которая в дополнение к указателю символа знает такие вещи, как длина строки и текущее значение pos
. 3
3: Ну, он начнет хранить текущее значение pos
, если оно начнет быть интересным. См. Также
use Devel::Peek;
my $x = "bluh bluh bluh bluh";
Dump($x);
$x =~ /bluh/mg;
Dump($x);
$x =~ /bluh/mg;
Dump($x);
моя природа была очень педантичной, когда я прочитал это в документации, я обнаружил «характер» неоднозначным. Я был неясно, если это означает единицу данных (то есть один байт) или единицу строки (в зависимости от кодировки) – Mike
Вызов 'binmode FILE ': raw« 'или' binmod FILE »: байты« всегда будут откройте свой дескриптор файла в режиме «байт», независимо от вашего уровня ввода-вывода по умолчанию (скажем, если вы объявили 'use utf8'). – mob
Я действительно согласен с тем, что использование «символов» читается как ошибка для меня, особенно учитывая, сколько внимания уделяется различию между символами, байтами и октетами в «Encode (3perl)». Это, оказывается, правильное слово, но я думаю, мне понравилось бы, если бы он сказал «символы (как определено текущим уровнем ввода/вывода)». Я думаю, это также критика вашего ответа, поскольку 'read' всегда читает« символы », но иногда« символ »определяется как« октет », а иногда как« кодовая точка UTF-8 ». – darch