diff options
Diffstat (limited to 'pod/perlfaq7.pod')
-rw-r--r-- | pod/perlfaq7.pod | 50 |
1 files changed, 45 insertions, 5 deletions
diff --git a/pod/perlfaq7.pod b/pod/perlfaq7.pod index a1d60f84d5..908fc14e7c 100644 --- a/pod/perlfaq7.pod +++ b/pod/perlfaq7.pod @@ -298,6 +298,26 @@ E<lt>STDINE<gt>'>, there would have been no way for the hypothetical timeout() function to access the lexical variable $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() interator +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" } + } + T; + print "Finally $f\n"; + +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 is a bug, and will be fixed. + =head2 How can I pass/return a {Function, FileHandle, Array, Hash, Method, Regexp}? With the exception of regexps, you need to pass references to these @@ -339,9 +359,9 @@ IO::File modules, both part of the standard Perl distribution. To pass regexps around, you'll need to either use one of the highly experimental regular expression modules from CPAN (Nick Ing-Simmons's -Regexp or Ilya Zakharevich's Devel::Regexp), pass around strings and -use an exception-trapping eval, or else be very, very clever. Here's -an example of how to pass in a string to be regexp compared: +Regexp or Ilya Zakharevich's Devel::Regexp), pass around strings +and use an exception-trapping eval, or else be be very, very clever. +Here's an example of how to pass in a string to be regexp compared: sub compare($$) { my ($val1, $regexp) = @_; @@ -539,7 +559,7 @@ Why do you want to do that? :-) If you want to override a predefined function, such as open(), then you'll have to import the new definition from a different module. See L<perlsub/"Overriding Builtin Functions">. There's -also an example in L<perltoot/"Class::Struct">. +also an example in L<perltoot/"Class::Template">. If you want to overload a Perl operator, such as C<+> or C<**>, then you'll want to use the C<use overload> pragma, documented @@ -576,7 +596,7 @@ how best to do this, so he left it out, even though it's been on the wish list since perl1. Here's a simple example of a switch based on pattern matching. We'll -do a multiway conditional based on the type of reference stored in +do a multi-way conditional based on the type of reference stored in $whatchamacallit: SWITCH: @@ -669,6 +689,26 @@ not necessarily the same as the one in which you were compiled): warn "called me from a $class object"; } +=head2 How can I comment out a large block of perl code? + +Use embedded POD to discard it: + + # program is here + + =for nobody + This paragraph is commented out + + # program continues + + =begin comment text + + all of this stuff + + here will be ignored + by everyone + + =end comment text + =head1 AUTHOR AND COPYRIGHT Copyright (c) 1997 Tom Christiansen and Nathan Torkington. |