X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Fbytes.pm;h=9a04491daf156a7b0e8f202c0d836bf0bd67abeb;hb=d0c833c6b6d161774fa9ee0c74b6748675c48591;hp=e8ab16f1bdb2afb2d63805263164a96977e4b1cc;hpb=657b208b434818aa5e54d68b0a8ad320c0252adf;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/bytes.pm b/lib/bytes.pm index e8ab16f..9a04491 100644 --- a/lib/bytes.pm +++ b/lib/bytes.pm @@ -1,11 +1,15 @@ package bytes; +our $VERSION = '1.01'; + +$bytes::hint_bits = 0x00000008; + sub import { - $^H |= 0x00000008; + $^H |= $bytes::hint_bits; } sub unimport { - $^H &= ~0x00000008; + $^H &= ~$bytes::hint_bits; } sub AUTOLOAD { @@ -14,6 +18,11 @@ sub AUTOLOAD { } sub length ($); +sub chr ($); +sub ord ($); +sub substr ($$;$$); +sub index ($$;$); +sub rindex ($$;$); 1; __END__ @@ -25,26 +34,53 @@ bytes - Perl pragma to force byte semantics rather than character semantics =head1 SYNOPSIS use bytes; + ... chr(...); # or bytes::chr + ... index(...); # or bytes::index + ... length(...); # or bytes::length + ... ord(...); # or bytes::ord + ... rindex(...); # or bytes::rindex + ... substr(...); # or bytes::substr no bytes; -=head1 DESCRIPTION -WARNING: The implementation of Unicode support in Perl is incomplete. -Expect sudden and unannounced changes! +=head1 DESCRIPTION The C pragma disables character semantics for the rest of the lexical scope in which it appears. C can be used to reverse the effect of C within the current lexical scope. -Perl normally assumes character semantics in the presence of -character data (i.e. data that has come from a source that has -been marked as being of a particular character encoding). +Perl normally assumes character semantics in the presence of character +data (i.e. data that has come from a source that has been marked as +being of a particular character encoding). When C is in +effect, the encoding is temporarily ignored, and each string is treated +as a series of bytes. + +As an example, when Perl sees C<$x = chr(400)>, it encodes the character +in UTF-8 and stores it in $x. Then it is marked as character data, so, +for instance, C returns C<1>. However, in the scope of the +C pragma, $x is treated as a series of bytes - the bytes that make +up the UTF8 encoding - and C returns C<2>: + + $x = chr(400); + print "Length is ", length $x, "\n"; # "Length is 1" + printf "Contents are %vd\n", $x; # "Contents are 400" + { + use bytes; # or "require bytes; bytes::length()" + print "Length is ", length $x, "\n"; # "Length is 2" + printf "Contents are %vd\n", $x; # "Contents are 198.144" + } + +chr(), ord(), substr(), index() and rindex() behave similarly. + +For more on the implications and differences between character +semantics and byte semantics, see L and L. + +=head1 LIMITATIONS -To understand the implications and differences between character -semantics and byte semantics, see L. +bytes::substr() does not work as an lvalue(). =head1 SEE ALSO -L, L +L, L, L =cut