X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pod%2Fperlfaq4.pod;h=18d709169b3fdfe90ca9271405df93d609f798b5;hb=3e79b69bf4e5ee29a68ea7ec363a1195dc7fddf5;hp=5d3e595f077f1f65d6d03a847fcb2950c84da94a;hpb=ae3d0b9fbe7057e8e36ba43da0b29754d1fef731;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pod/perlfaq4.pod b/pod/perlfaq4.pod index 5d3e595..18d7091 100644 --- a/pod/perlfaq4.pod +++ b/pod/perlfaq4.pod @@ -1,6 +1,6 @@ =head1 NAME -perlfaq4 - Data Manipulation ($Revision: 1.13 $, $Date: 2002/01/31 04:27:54 $) +perlfaq4 - Data Manipulation ($Revision: 1.25 $, $Date: 2002/05/30 07:04:25 $) =head1 DESCRIPTION @@ -135,7 +135,9 @@ 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. -=item B +=over 4 + +=item How do I convert hexadecimal into decimal Using perl's built in conversion of 0x notation: @@ -158,7 +160,7 @@ Using the CPAN module Bit::Vector: $vec = Bit::Vector->new_Hex(32, "DEADBEEF"); $dec = $vec->to_Dec(); -=item B +=item How do I convert from decimal to hexadecimal Using sprint: @@ -181,7 +183,7 @@ And Bit::Vector supports odd bit counts: $vec->Resize(32); # suppress leading 0 if unwanted $hex = $vec->to_Hex(); -=item B +=item How do I convert from octal to decimal Using Perl's built in conversion of numbers with leading zeros: @@ -200,7 +202,7 @@ Using Bit::Vector: $vec->Chunk_List_Store(3, split(//, reverse "33653337357")); $dec = $vec->to_Dec(); -=item B +=item How do I convert from decimal to octal Using sprintf: @@ -212,7 +214,12 @@ Using Bit::Vector $vec = Bit::Vector->new_Dec(32, -559038737); $oct = reverse join('', $vec->Chunk_List_Read(3)); -=item B +=item How do I convert from binary to decimal + +Perl 5.6 lets you write binary numbers directly with +the 0b notation: + + $number = 0b10110110; Using pack and ord @@ -231,7 +238,7 @@ Using Bit::Vector: $vec = Bit::Vector->new_Bin(32, "11011110101011011011111011101111"); $dec = $vec->to_Dec(); -=item B +=item How do I convert from decimal to binary Using unpack; @@ -246,6 +253,7 @@ Using Bit::Vector: The remaining transformations (e.g. hex -> oct, bin -> hex, etc.) are left as an exercise to the inclined reader. +=back =head2 Why doesn't & work the way I want it to? @@ -346,6 +354,20 @@ random numbers, but this takes quite a while. If you want a better pseudorandom generator than comes with your operating system, look at ``Numerical Recipes in C'' at http://www.nr.com/ . +=head2 How do I get a random number between X and Y? + +Use the following simple function. It selects a random integer between +(and possibly including!) the two given integers, e.g., +C + + sub random_int_in ($$) { + my($min, $max) = @_; + # Assumes that the two arguments are integers themselves! + return $min if $min == $max; + ($min, $max) = ($max, $min) if $min > $max; + return $min + int rand(1 + $max - $min); + } + =head1 Data: Dates =head2 How do I find the week-of-the-year/day-of-the-year? @@ -581,7 +603,7 @@ really does work: @( = ('(',''); @) = (')',''); ($re=$_)=~s/((BEGIN)|(END)|.)/$)[!$3]\Q$1\E$([!$2]/gs; - @$ = (eval{/$re/},$@!~/unmatched/); + @$ = (eval{/$re/},$@!~/unmatched/i); print join("\n",@$[0..$#$]) if( $$[-1] ); =head2 How do I reverse a string? @@ -690,6 +712,11 @@ integers: while ($string =~ /-\d+/g) { $count++ } print "There are $count negative numbers in the string"; +Another version uses a global match in list context, then assigns the +result to a scalar, producing a count of the number of matches. + + $count = () = $string =~ /-\d+/g; + =head2 How do I capitalize all the words on one line? To make the first letter of each word upper case: @@ -975,7 +1002,7 @@ in the indentation. would deliver us. You are a liar, Saruman, and a corrupter of men's hearts. --Theoden in /usr/src/perl/taint.c FINIS - $quote =~ s/\s*--/\n--/; + $quote =~ s/\s+--/\n--/; A nice general-purpose fixer-upper function for indented here documents follows. It expects to be called with a here document as its argument. @@ -1125,11 +1152,11 @@ designed to answer this question quickly and efficiently. Arrays aren't. That being said, there are several ways to approach this. If you are going to make this query many times over arbitrary string values, -the fastest way is probably to invert the original array and keep an -associative array lying about whose keys are the first array's values. +the fastest way is probably to invert the original array and maintain a +hash whose keys are the first array's values. @blues = qw/azure cerulean teal turquoise lapis-lazuli/; - undef %is_blue; + %is_blue = (); for (@blues) { $is_blue{$_} = 1 } Now you can check whether $is_blue{$some_color}. It might have been a @@ -1139,7 +1166,7 @@ If the values are all small integers, you could use a simple indexed array. This kind of an array will take up less space: @primes = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31); - undef @is_tiny_prime; + @is_tiny_prime = (); for (@primes) { $is_tiny_prime[$_] = 1 } # or simply @istiny_prime[@primes] = (1) x @primes; @@ -1316,28 +1343,21 @@ lists, or you could just do something like this with an array: If you either have Perl 5.8.0 or later installed, or if you have Scalar-List-Utils 1.03 or later installed, you can say: - use List::Util 'shuffle'; + use List::Util 'shuffle'; @shuffled = shuffle(@list); -If not, you can use this: +If not, you can use a Fisher-Yates shuffle. - # fisher_yates_shuffle - # generate a random permutation of an array in place - # As in shuffling a deck of cards - # sub fisher_yates_shuffle { my $deck = shift; # $deck is a reference to an array my $i = @$deck; - while (--$i) { + while ($i--) { my $j = int rand ($i+1); @$deck[$i,$j] = @$deck[$j,$i]; } } -And here is an example of using it: - - # # shuffle my mpeg collection # my @mpeg =