summaryrefslogtreecommitdiff
path: root/lib/bytes.pm
diff options
context:
space:
mode:
authorKarl Williamson <khw@cpan.org>2015-08-09 21:40:21 -0600
committerKarl Williamson <khw@cpan.org>2016-03-06 09:53:16 -0700
commit01e331e519b4ccb213cadc7bfe7c04b8249e3289 (patch)
tree7fc6ff9825f61affb224bd7dd6b498d429bf2422 /lib/bytes.pm
parentb297756b5d78ef23f3ebf878d0342947ece424aa (diff)
downloadperl-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.pm87
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