t/op/grep.t using test.pl
[p5sagit/p5-mst-13.2.git] / pod / perlfaq7.pod
index e6d4e5c..9d9ef8d 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-perlfaq7 - General Perl Language Issues ($Revision: 1.17 $, $Date: 2004/10/19 22:53:50 $)
+perlfaq7 - General Perl Language Issues ($Revision: 3606 $)
 
 =head1 DESCRIPTION
 
@@ -54,8 +54,8 @@ count as though they were quoted:
 
     This                    is like this
     ------------            ---------------
-    $foo{line}              $foo{"line"}
-    bar => stuff            "bar" => stuff
+    $foo{line}              $foo{'line'}
+    bar => stuff            'bar' => stuff
 
 The final semicolon in a block is optional, as is the final comma in a
 list.  Good style (see L<perlstyle>) says to put them in except for
@@ -98,6 +98,16 @@ See L<perllexwarn> for more details.
        $a = $b + $c;         # I know these might be undef
     }
 
+Additionally, you can enable and disable categories of warnings.
+You turn off the categories you want to ignore and you can still
+get other categories of warnings.  See L<perllexwarn> for the
+complete details, including the category names and hierarchy.
+
+       {
+       no warnings 'uninitialized';
+       $a = $b + $c;
+       }
+
 If you have an older version of Perl, the C<$^W> variable (documented
 in L<perlvar>) controls runtime warnings for a block:
 
@@ -166,20 +176,26 @@ If you're looking for something a bit more rigorous, try L<perltoot>.
 
 =head2 How do I create a module?
 
-A module is a package that lives in a file of the same name.  For
-example, the Hello::There module would live in Hello/There.pm.  For
-details, read L<perlmod>.  You'll also find L<Exporter> helpful.  If
-you're writing a C or mixed-language module with both C and Perl, then
-you should study L<perlxstut>.
+(contributed by brian d foy)
+
+L<perlmod>, L<perlmodlib>, L<perlmodstyle> explain modules
+in all the gory details. L<perlnewmod> gives a brief
+overview of the process along with a couple of suggestions
+about style.
 
-The C<h2xs> program will create stubs for all the important stuff for you:
+If you need to include C code or C library interfaces in
+your module, you'll need h2xs.  h2xs will create the module
+distribution structure and the initial interface files
+you'll need.  L<perlxs> and L<perlxstut> explain the details.
 
-  % h2xs -XA -n My::Module
+If you don't need to use C code, other tools such as
+ExtUtils::ModuleMaker and Module::Starter, can help you
+create a skeleton module distribution.
 
-The C<-X> switch tells C<h2xs> that you are not using C<XS> extension
-code.  The C<-A> switch tells C<h2xs> that you are not using the
-AutoLoader, and the C<-n> switch specifies the name of the module.
-See L<h2xs> for more details.
+You may also want to see Sam Tregar's "Writing Perl Modules
+for CPAN" ( http://apress.com/book/bookDisplay.html?bID=14 )
+which is the best hands-on guide to creating module
+distributions.
 
 =head2 How do I create a class?
 
@@ -255,24 +271,40 @@ $line back in its caller's scope.
 
 =head2 What is variable suicide and how can I prevent it?
 
-Variable suicide is when you (temporarily or permanently) lose the
-value of a variable.  It is caused by scoping through my() and local()
-interacting with either closures or aliased foreach() iterator
-variables and subroutine arguments.  It used to be easy to
-inadvertently lose a variable's value this way, but now it's much
-harder.  Take this code:
+This problem was fixed in perl 5.004_05, so preventing it means upgrading
+your version of perl. ;)
 
-    my $f = "foo";
+Variable suicide is when you (temporarily or permanently) lose the value
+of a variable.  It is caused by scoping through my() and local()
+interacting with either closures or aliased foreach() iterator variables
+and subroutine arguments.  It used to be easy to inadvertently lose a
+variable's value this way, but now it's much harder.  Take this code:
+
+    my $f = 'foo';
     sub T {
-      while ($i++ < 3) { my $f = $f; $f .= "bar"; print $f, "\n" }
+      while ($i++ < 3) { my $f = $f; $f .= $i; print $f, "\n" }
     }
     T;
     print "Finally $f\n";
 
+If you are experiencing variable suicide, that C<my $f> in the subroutine
+doesn't pick up a fresh copy of the C<$f> whose value is <foo>. The output
+shows that inside the subroutine the value of C<$f> leaks through when it
+shouldn't, as in this output:
+
+       foobar
+       foobarbar
+       foobarbarbar
+       Finally foo
+
 The $f that has "bar" added to it three times should be a new C<$f>
-(C<my $f> should create a new local variable each time through the loop).
-It isn't, however.  This was a bug, now fixed in the latest releases
-(tested against 5.004_05, 5.005_03, and 5.005_56).
+C<my $f> should create a new lexical variable each time through the loop.
+The expected output is:
+
+       foobar
+       foobar
+       foobar
+       Finally foo
 
 =head2 How can I pass/return a {Function, FileHandle, Array, Hash, Method, Regex}?
 
@@ -280,7 +312,7 @@ With the exception of regexes, you need to pass references to these
 objects.  See L<perlsub/"Pass by Reference"> for this particular
 question, and L<perlref> for information on references.
 
-See ``Passing Regexes'', below, for information on passing regular
+See "Passing Regexes", below, for information on passing regular
 expressions.
 
 =over 4
@@ -395,42 +427,62 @@ You could also investigate the can() method in the UNIVERSAL class
 
 =head2 How do I create a static variable?
 
-As with most things in Perl, TMTOWTDI.  What is a "static variable" in
-other languages could be either a function-private variable (visible
-only within a single function, retaining its value between calls to
-that function), or a file-private variable (visible only to functions
-within the file it was declared in) in Perl.
-
-Here's code to implement a function-private variable:
+(contributed by brian d foy)
+
+Perl doesn't have "static" variables, which can only be accessed from
+the function in which they are declared. You can get the same effect
+with lexical variables, though.
+
+You can fake a static variable by using a lexical variable which goes
+out of scope. In this example, you define the subroutine C<counter>, and
+it uses the lexical variable C<$count>. Since you wrap this in a BEGIN
+block, C<$count> is defined at compile-time, but also goes out of
+scope at the end of the BEGIN block. The BEGIN block also ensures that
+the subroutine and the value it uses is defined at compile-time so the
+subroutine is ready to use just like any other subroutine, and you can
+put this code in the same place as other subroutines in the program
+text (i.e. at the end of the code, typically). The subroutine
+C<counter> still has a reference to the data, and is the only way you
+can access the value (and each time you do, you increment the value).
+The data in chunk of memory defined by C<$count> is private to
+C<counter>.
 
     BEGIN {
-        my $counter = 42;
-        sub prev_counter { return --$counter }
-        sub next_counter { return $counter++ }
+        my $count = 1;
+        sub counter { $count++ }
     }
 
-Now prev_counter() and next_counter() share a private variable $counter
-that was initialized at compile time.
+    my $start = count();
 
-To declare a file-private variable, you'll still use a my(), putting
-the declaration at the outer scope level at the top of the file.
-Assume this is in file Pax.pm:
+    .... # code that calls count();
 
-    package Pax;
-    my $started = scalar(localtime(time()));
+    my $end = count();
 
-    sub begun { return $started }
+In the previous example, you created a function-private variable
+because only one function remembered its reference. You could define
+multiple functions while the variable is in scope, and each function
+can share the "private" variable. It's not really "static" because you
+can access it outside the function while the lexical variable is in
+scope, and even create references to it. In this example,
+C<increment_count> and C<return_count> share the variable. One
+function adds to the value and the other simply returns the value.
+They can both access C<$count>, and since it has gone out of scope,
+there is no other way to access it.
 
-When C<use Pax> or C<require Pax> loads this module, the variable will
-be initialized.  It won't get garbage-collected the way most variables
-going out of scope do, because the begun() function cares about it,
-but no one else can get it.  It is not called $Pax::started because
-its scope is unrelated to the package.  It's scoped to the file.  You
-could conceivably have several packages in that same file all
-accessing the same private variable, but another file with the same
-package couldn't get to it.
+    BEGIN {
+        my $count = 1;
+        sub increment_count { $count++ }
+        sub return_count    { $count }
+    }
+
+To declare a file-private variable, you still use a lexical variable.
+A file is also a scope, so a lexical variable defined in the file
+cannot be seen from any other file.
 
-See L<perlsub/"Persistent Private Variables"> for details.
+See L<perlsub/"Persistent Private Variables"> for more information.
+The discussion of closures in L<perlref> may help you even though we
+did not use anonymous subroutines in this answer. See
+L<perlsub/"Persistent Private Variables"> for details.
 
 =head2 What's the difference between dynamic and lexical (static) scoping?  Between local() and my()?
 
@@ -726,18 +778,22 @@ not necessarily the same as the one in which you were compiled):
 =head2 How can I comment out a large block of perl code?
 
 You can use embedded POD to discard it.  Enclose the blocks you want
-to comment out in POD markers, for example C<=for nobody> and C<=cut>
-(which marks ends of POD blocks).
+to comment out in POD markers.  The <=begin> directive marks a section
+for a specific formatter.  Use the C<comment> format, which no formatter
+should claim to understand (by policy).  Mark the end of the block
+with <=end>.
 
     # program is here
 
-    =for nobody
+    =begin comment
 
     all of this stuff
 
     here will be ignored
     by everyone
 
+       =end comment
+
     =cut
 
     # program continues
@@ -876,16 +932,21 @@ you probably only want to use hard references.
 
 =head2 What does "bad interpreter" mean?
 
+(contributed by brian d foy)
+
 The "bad interpreter" message comes from the shell, not perl.  The
 actual message may vary depending on your platform, shell, and locale
 settings.
 
 If you see "bad interpreter - no such file or directory", the first
 line in your perl script (the "shebang" line) does not contain the
-right path to perl (or any other program capable of running scripts). 
+right path to perl (or any other program capable of running scripts).
 Sometimes this happens when you move the script from one machine to
 another and each machine has a different path to perl---/usr/bin/perl
-versus /usr/local/bin/perl for instance.
+versus /usr/local/bin/perl for instance. It may also indicate
+that the source machine has CRLF line terminators and the
+destination machine has LF only: the shell tries to find
+/usr/bin/perl<CR>, but can't.
 
 If you see "bad interpreter: Permission denied", you need to make your
 script executable.
@@ -899,10 +960,18 @@ If you get a message like "perl: command not found", perl is not in
 your PATH, which might also mean that the location of perl is not
 where you expect it so you need to adjust your shebang line.
 
+=head1 REVISION
+
+Revision: $Revision: 3606 $
+
+Date: $Date: 2006-03-06 12:05:47 +0100 (lun, 06 mar 2006) $
+
+See L<perlfaq> for source control details and availability.
+
 =head1 AUTHOR AND COPYRIGHT
 
-Copyright (c) 1997-2002 Tom Christiansen and Nathan Torkington.
-All rights reserved.
+Copyright (c) 1997-2006 Tom Christiansen, Nathan Torkington, and
+other authors as noted. All rights reserved.
 
 This documentation is free; you can redistribute it and/or modify it
 under the same terms as Perl itself.