Строки - это строки «символов», которые больше байта. 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);