From: Jarkko Hietaniemi Date: Tue, 23 Oct 2001 18:38:03 +0000 (+0000) Subject: FAQ sync. X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=6761e06430101eb50241c565c108c3acbe8ce89a;p=p5sagit%2Fp5-mst-13.2.git FAQ sync. p4raw-id: //depot/perl@12608 --- diff --git a/pod/perlfaq4.pod b/pod/perlfaq4.pod index 8624585..6cd2d9a 100644 --- a/pod/perlfaq4.pod +++ b/pod/perlfaq4.pod @@ -1,6 +1,6 @@ =head1 NAME -perlfaq4 - Data Manipulation ($Revision: 1.5 $, $Date: 2001/10/12 15:20:13 $) +perlfaq4 - Data Manipulation ($Revision: 1.6 $, $Date: 2001/10/23 04:39:28 $) =head1 DESCRIPTION @@ -123,24 +123,130 @@ Perl numbers whose absolute values are integers under 2**31 (on 32 bit machines) will work pretty much like mathematical integers. Other numbers are not guaranteed. -=head2 How do I convert bits into ints? +=head2 How do I convert between numeric representations: -To turn a string of 1s and 0s like C<10110110> into a scalar containing -its binary value, use the pack() and unpack() functions (documented in -L and L): +As always with Perl there is more than one way to do it. Below +are a few examples of approaches to making common conversions +between number representations. This is intended to be representational +rather than exhaustive. - $decimal = unpack('c', pack('B8', '10110110')); +Some of the examples below use the Bit::Vector module from CPAN. +The reason you might choose Bit::Vector over the perl built in +functions is that it works with numbers of ANY size, that it is +optimized for speed on some operations, and for at least some +programmers the notation might be familiar. -This packs the string C<10110110> into an eight bit binary structure. -This is then unpacked as a character, which returns its ordinal value. +=item B -This does the same thing: +Using perl's built in conversion of 0x notation: + + $int = 0xDEADBEEF; + $dec = sprintf("%d", $int); + +Using the hex function: + + $int = hex("DEADBEEF"); + $dec = sprintf("%d", $int); + +Using pack: + + $int = unpack("N", pack("H8", substr("0" x 8 . "DEADBEEF", -8))); + $dec = sprintf("%d", $int); + +Using the CPAN module Bit::Vector: + + use Bit::Vector; + $vec = Bit::Vector->new_Hex(32, "DEADBEEF"); + $dec = $vec->to_Dec(); + +=item B + +Using sprint: + + $hex = sprintf("%X", 3735928559); + +Using unpack + + $hex = unpack("H*", pack("N", 3735928559)); + +Using Bit::Vector + + use Bit::Vector; + $vec = Bit::Vector->new_Dec(32, -559038737); + $hex = $vec->to_Hex(); + +And Bit::Vector supports odd bit counts: + + use Bit::Vector; + $vec = Bit::Vector->new_Dec(33, 3735928559); + $vec->Resize(32); # suppress leading 0 if unwanted + $hex = $vec->to_Hex(); + +=item B + +Using Perl's built in conversion of numbers with leading zeros: + + $int = 033653337357; # note the leading 0! + $dec = sprintf("%d", $int); + +Using the oct function: + + $int = oct("33653337357"); + $dec = sprintf("%d", $int); + +Using Bit::Vector: + + use Bit::Vector; + $vec = Bit::Vector->new(32); + $vec->Chunk_List_Store(3, split(//, reverse "33653337357")); + $dec = $vec->to_Dec(); + +=item B + +Using sprintf: + + $oct = sprintf("%o", 3735928559); + +Using Bit::Vector + + use Bit::Vector; + $vec = Bit::Vector->new_Dec(32, -559038737); + $oct = reverse join('', $vec->Chunk_List_Read(3)); + +=item B + +Using pack and ord $decimal = ord(pack('B8', '10110110')); -Here's an example of going the other way: +Using pack and unpack for larger strings + + $int = unpack("N", pack("B32", + substr("0" x 32 . "11110101011011011111011101111", -32))); + $dec = sprintf("%d", $int); + + Substr() is used to left pad a 32 character string with zeros. + +Using Bit::Vector: + + $vec = Bit::Vector->new_Bin(32, "11011110101011011011111011101111"); + $dec = $vec->to_Dec(); + +=item B + +Using unpack; + + $bin = unpack("B*", pack("N", 3735928559)); + +Using Bit::Vector: + + use Bit::Vector; + $vec = Bit::Vector->new_Dec(32, -559038737); + $bin = $vec->to_Bin(); + +The remaining transformations (e.g. hex -> oct, bin -> hex, etc.) +are left as an exercise to the inclined reader. - $binary_string = unpack('B*', "\x29"); =head2 Why doesn't & work the way I want it to? diff --git a/pod/perlfaq7.pod b/pod/perlfaq7.pod index b1d3917..cabfca1 100644 --- a/pod/perlfaq7.pod +++ b/pod/perlfaq7.pod @@ -1,6 +1,6 @@ =head1 NAME -perlfaq7 - Perl Language Issues ($Revision: 1.2 $, $Date: 2001/10/16 13:27:22 $) +perlfaq7 - Perl Language Issues ($Revision: 1.3 $, $Date: 2001/10/19 14:39:24 $) =head1 DESCRIPTION @@ -167,80 +167,14 @@ details, read L. You'll also find L helpful. If you're writing a C or mixed-language module with both C and Perl, then you should study L. -Here's a convenient template you might wish you use when starting your -own module. Make sure to change the names appropriately. - - package Some::Module; # assumes Some/Module.pm - - use strict; - use warnings; - - BEGIN { - use Exporter (); - our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); - - ## set the version for version checking; uncomment to use - ## $VERSION = 1.00; - - # if using RCS/CVS, this next line may be preferred, - # but beware two-digit versions. - $VERSION = do{my@r=q$Revision: 1.2 $=~/\d+/g;sprintf '%d.'.'%02d'x$#r,@r}; - - @ISA = qw(Exporter); - @EXPORT = qw(&func1 &func2 &func3); - %EXPORT_TAGS = ( ); # eg: TAG => [ qw!name1 name2! ], - - # your exported package globals go here, - # as well as any optionally exported functions - @EXPORT_OK = qw($Var1 %Hashit); - } - our @EXPORT_OK; - - # exported package globals go here - our $Var1; - our %Hashit; - - # non-exported package globals go here - our @more; - our $stuff; - - # initialize package globals, first exported ones - $Var1 = ''; - %Hashit = (); - - # then the others (which are still accessible as $Some::Module::stuff) - $stuff = ''; - @more = (); - - # all file-scoped lexicals must be created before - # the functions below that use them. - - # file-private lexicals go here - my $priv_var = ''; - my %secret_hash = (); - - # here's a file-private function as a closure, - # callable as &$priv_func; it cannot be prototyped. - my $priv_func = sub { - # stuff goes here. - }; - - # make all your functions, whether exported or not; - # remember to put something interesting in the {} stubs - sub func1 {} # no prototype - sub func2() {} # proto'd void - sub func3($$) {} # proto'd to 2 scalars - - # this one isn't exported, but could be called! - sub func4(\%) {} # proto'd to 1 hash ref - - END { } # module clean-up code here (global destructor) - - 1; # modules must return true - -The h2xs program will create stubs for all the important stuff for you: +The C program will create stubs for all the important stuff for you: % h2xs -XA -n My::Module + +The C<-X> switch tells C that you are not using C extension +code. The C<-A> switch tells C that you are not using the +AutoLoader, and the C<-n> switch specifies the name of the module. +See L for more details. =head2 How do I create a class?