This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Regenerate Configure and friends after metaconfig changes
[perl5.git] / lib / bytes.pm
index f2f7e01..8c7a262 100644 (file)
@@ -1,5 +1,7 @@
 package bytes;
 
+our $VERSION = '1.07';
+
 $bytes::hint_bits = 0x00000008;
 
 sub import {
@@ -12,58 +14,111 @@ sub unimport {
 
 sub AUTOLOAD {
     require "bytes_heavy.pl";
-    goto &$AUTOLOAD;
+    goto &$AUTOLOAD if defined &$AUTOLOAD;
+    require Carp;
+    Carp::croak("Undefined subroutine $AUTOLOAD called");
 }
 
-sub length ($);
+sub length (_);
+sub chr (_);
+sub ord (_);
+sub substr ($$;$$);
+sub index ($$;$);
+sub rindex ($$;$);
 
 1;
 __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
+
+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.
+
+B<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
 
     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.
-See L<perlunicode> for the exact details.
+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
+implicit) encoding using the L<Encode> module:
+
+    use Encode qw/encode/;
 
-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.
+    my $utf8_byte_string   = encode "UTF8",   $string;
+    my $latin1_byte_string = encode "Latin1", $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. 
+Or, if performance is needed and you are only interested in the UTF-8
+representation:
+
+    utf8::encode(my $utf8_byte_string = $string);
+
+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 UTF8 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;
-        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)"
+ }
+
+C<chr()>, C<ord()>, C<substr()>, C<index()> and C<rindex()> behave similarly.
+
+For more on the implications, see L<perluniintro> and L<perlunicode>.
+
+C<bytes::length()> is admittedly handy if you need to know the
+B<byte length> of a Perl scalar.  But a more modern way is:
+
+   use Encode 'encode';
+   length(encode('UTF-8', $scalar))
+
+=head1 LIMITATIONS
 
-For more on the implications and differences between character
-semantics and byte semantics, see L<perlunicode>.
+C<bytes::substr()> does not work as an I<lvalue()>.
 
 =head1 SEE ALSO
 
-L<perlunicode>, L<utf8>
+L<perluniintro>, L<perlunicode>, L<utf8>, L<Encode>
 
 =cut