Las cadenas son cadenas de caracteres "", que son más grandes que un byte. 1 Puede almacenar bytes en ellos y manipularlos como si fueran caracteres, tomando substr
s de ellos y demás, y siempre y cuando solo esté manipulando entidades en la memoria, todo es muy bonito. El almacenamiento de datos es extraño, pero ese no es tu problema. 2
Cuando intenta leer y escribir desde archivos, el hecho de que sus caracteres no se correlacionen con bytes se vuelve importante e interesante. Por no mencionar molesto. Esta molestia en realidad se empeora un poco cuando Perl intenta hacer lo que desea en el caso común: si todos los caracteres de la cadena encajan en un byte y usted está en un sistema operativo que no es de Windows, en realidad no tiene hacer algo especial para leer y escribir bytes. Sin embargo, Perl se quejará si ha almacenado un personaje que no sea de tamaño byte y trate de escribirlo sin darle una pista sobre qué hacer con él.
Esto se está alejando un poco, en gran parte porque la codificación es un tema grande y confuso. Déjame dejarlo allí con algunas referencias: mira Encode(3perl), open(3perl), perldoc open, y perldoc binmode para obtener muchos detalles hilarantes y sangrientos.
Por lo tanto, la respuesta resumida es "Sí, puede tratar las cadenas como si contuvieran bytes si de hecho contienen bytes, lo cual puede asegurar solo leyendo y escribiendo bytes".
1: O pedantemente, "que puede expresar un rango de valores mayor que un byte, aunque se almacenan como bytes cuando es conveniente". Creo.
2: Para el registro, las cadenas en Perl están representadas internamente por una estructura de datos llamada 'PV' que además de un puntero de carácter conoce cosas como la longitud de la cadena y el valor actual de pos
. 3
3: Bueno, comenzará a almacenar el valor actual de pos
si comienza a ser interesante. Véase también
use Devel::Peek;
my $x = "bluh bluh bluh bluh";
Dump($x);
$x =~ /bluh/mg;
Dump($x);
$x =~ /bluh/mg;
Dump($x);
mi naturaleza es muy pedante, cuando leí esto en la documentación encontré 'character' ambiguo. No estaba claro si esto significa una unidad de datos (es decir, un byte) o una unidad de cadena (depende de la codificación) – Mike
Llamar a 'binmode FILE,": raw "' o 'binmod FILE,": bytes "' siempre abra su manejador de archivos en el modo "bytes", independientemente de su capa IO predeterminada (por ejemplo, si declaró 'use utf8'). – mob
De hecho estoy de acuerdo en que el uso de "caracteres" me parece un error, especialmente teniendo en cuenta la atención que se presta a la distinción entre caracteres, bytes y octetos en 'Codificar (3perl)'. Resulta ser la palabra correcta, pero creo que me gustaría si dijera "caracteres (como se define en la capa de E/S actual)". Supongo que esto también es una crítica a su respuesta, ya que 'leer' siempre dice" caracteres ", pero a veces" carácter "se define como" octeto "y a veces como" punto de código UTF-8 ". – darch