diff options
author | Karl Williamson <khw@cpan.org> | 2015-08-09 21:40:21 -0600 |
---|---|---|
committer | Karl Williamson <khw@cpan.org> | 2016-03-06 09:53:16 -0700 |
commit | 01e331e519b4ccb213cadc7bfe7c04b8249e3289 (patch) | |
tree | 7fc6ff9825f61affb224bd7dd6b498d429bf2422 /lib/bytes.pm | |
parent | b297756b5d78ef23f3ebf878d0342947ece424aa (diff) | |
download | perl-01e331e519b4ccb213cadc7bfe7c04b8249e3289.tar.gz |
Update bytes.pm doc
The one legitimate use of this pragma is for debugging. This changes to
say so, and other minor changes.
Diffstat (limited to 'lib/bytes.pm')
-rw-r--r-- | lib/bytes.pm | 87 |
1 files changed, 53 insertions, 34 deletions
diff --git a/lib/bytes.pm b/lib/bytes.pm index 6dad41ad9f..d871a13015 100644 --- a/lib/bytes.pm +++ b/lib/bytes.pm @@ -1,6 +1,6 @@ package bytes; -our $VERSION = '1.04'; +our $VERSION = '1.05'; $bytes::hint_bits = 0x00000008; @@ -31,19 +31,20 @@ __END__ =head1 NAME -bytes - Perl pragma to force byte semantics rather than character semantics +bytes - Perl pragma to expose the individual bytes of characters =head1 NOTICE -This pragma reflects early attempts to incorporate Unicode into perl and -has since been superseded. It breaks encapsulation (i.e. it exposes the -innards of how the perl executable currently happens to store a string), -and use of this module for anything other than debugging purposes is -strongly discouraged. If you feel that the functions here within might be -useful for your application, this possibly indicates a mismatch between -your mental model of Perl Unicode and the current reality. In that case, -you may wish to read some of the perl Unicode documentation: -L<perluniintro>, L<perlunitut>, L<perlunifaq> and L<perlunicode>. + +Because the bytes pragma breaks encapsulation (i.e. it exposes the innards of +how the perl executable currently happens to store a string), the byte values +that result are in an unspecified encoding. Use of this module for anything +other than debugging purposes is strongly discouraged. If you feel that the +functions here within might be useful for your application, this possibly +indicates a mismatch between your mental model of Perl Unicode and the current +reality. In that case, you may wish to read some of the perl Unicode +documentation: L<perluniintro>, L<perlunitut>, L<perlunifaq> and +L<perlunicode>. =head1 SYNOPSIS @@ -59,42 +60,60 @@ L<perluniintro>, L<perlunitut>, L<perlunifaq> and L<perlunicode>. =head1 DESCRIPTION -The C<use bytes> pragma disables character semantics for the rest of the -lexical scope in which it appears. C<no bytes> can be used to reverse -the effect of C<use bytes> within the current lexical scope. +Perl's characters are stored internally as sequences of one or more bytes. +This pragma allows for the examination of the individual bytes that together +comprise a character. + +Originally the pragma was designed for the loftier goal of helping incorporate +Unicode into Perl, but the approach that used it was found to be defective, +and the one remaining legitimate use is for debugging when you need to +non-destructively examine characters' individual bytes. Just insert this +pragma temporarily, and remove it after the debugging is finished. + +The original usage can be accomplished by explicit (rather than this pragma's +implict) encoding using the L<Encode> module: + + use Encode qw/encode/; + + my $utf8_byte_string = encode "UTF8", $string; + my $latin1_byte_string = encode "Latin1", $string; + +Or, if performance is needed and you are only interested in the UTF-8 +representation: + + use utf8; + + utf8::encode(my $utf8_byte_string = $string); -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<use bytes> is in -effect, the encoding is temporarily ignored, and each string is treated -as a series of bytes. +C<no bytes> can be used to reverse the effect of C<use bytes> within the +current lexical scope. 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, +in UTF-8 and stores it in C<$x>. Then it is marked as character data, so, for instance, C<length $x> returns C<1>. However, in the scope of the -C<bytes> pragma, $x is treated as a series of bytes - the bytes that make +C<bytes> pragma, C<$x> is treated as a series of bytes - the bytes that make up the UTF8 encoding - and C<length $x> 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" - } + $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 (on + # ASCII platforms)" + } -chr(), ord(), substr(), index() and rindex() behave similarly. +C<chr()>, C<ord()>, C<substr()>, C<index()> and C<rindex()> behave similarly. -For more on the implications and differences between character -semantics and byte semantics, see L<perluniintro> and L<perlunicode>. +For more on the implications, see L<perluniintro> and L<perlunicode>. =head1 LIMITATIONS -bytes::substr() does not work as an lvalue(). +C<bytes::substr()> does not work as an I<lvalue()>. =head1 SEE ALSO -L<perluniintro>, L<perlunicode>, L<utf8> +L<perluniintro>, L<perlunicode>, L<utf8>, L<Encode> =cut |