eval { ... };
die unless $@ =~ /Expected exception/;
+If LIST is empty and C<$@> contains an object reference that has a
+C<PROPAGATE> method, that method will be called with additional file
+and line number parameters. The return value replaces the value in
+C<$@>. ie. as if C<<$@ = eval { $@->PROPAGATE(__FILE__, __LINE__) };>>
+were called.
+
If C<$@> is empty then the string C<"Died"> is used.
die() can also be called with a reference argument. If this happens to be
including out of subroutines, but it's usually better to use some other
construct such as C<last> or C<die>. The author of Perl has never felt the
need to use this form of C<goto> (in Perl, that is--C is another matter).
+(The difference being that C does not offer named loops combined with
+loop control. Perl does, and this replaces most structured uses of C<goto>
+in other languages.)
The C<goto-EXPR> form expects a label name, whose scope will be resolved
dynamically. This allows for computed C<goto>s per FORTRAN, but isn't
goto ("FOO", "BAR", "GLARCH")[$i];
-The C<goto-&NAME> form is quite different from the other forms of C<goto>.
-In fact, it isn't a goto in the normal sense at all, and doesn't have
-the stigma associated with other gotos. Instead, it
-substitutes a call to the named subroutine for the currently running
-subroutine. This is used by C<AUTOLOAD> subroutines that wish to load
-another subroutine and then pretend that the other subroutine had been
-called in the first place (except that any modifications to C<@_>
+The C<goto-&NAME> form is quite different from the other forms of
+C<goto>. In fact, it isn't a goto in the normal sense at all, and
+doesn't have the stigma associated with other gotos. Instead, it
+exits the current subroutine (losing any changes set by local()) and
+immediately calls in its place the named subroutine using the current
+value of @_. This is used by C<AUTOLOAD> subroutines that wish to
+load another subroutine and then pretend that the other subroutine had
+been called in the first place (except that any modifications to C<@_>
in the current subroutine are propagated to the other subroutine.)
After the C<goto>, not even C<caller> will be able to tell that this
routine was called first.
=item open FILEHANDLE,MODE,EXPR,LIST
+=item open FILEHANDLE,MODE,REFERENCE
+
=item open FILEHANDLE
Opens the file whose filename is given by EXPR, and associates it with
opens a filehandle to an anonymous temporary file.
+File handles can be opened to "in memory" files held in Perl scalars via:
+
+ open($fh,'>', \$variable) || ..
+
Examples:
$ARTICLE = 100;
open(EXTRACT, "|sort >/tmp/Tmp$$") # $$ is our process id
or die "Can't start sort: $!";
+ # in memory files
+ open(MEMORY,'>', \$var)
+ or die "Can't open memory file: $!";
+ print MEMORY "foo!\n"; # output will end up in $var
+
# process argument list of files along with any includes
foreach $file (@ARGV) {
When C<use locale> is in effect, C<sort LIST> sorts LIST according to the
current collation locale. See L<perllocale>.
-Perl does B<not> guarantee that sort is stable. (A I<stable> sort
-preserves the input order of elements that compare equal.) 5.7 and
-5.8 happen to use a stable mergesort, but 5.6 and earlier used quicksort,
-which is not stable. Do not assume that future perls will continue to
-use a stable sort.
+Perl 5.6 and earlier used a quicksort algorithm to implement sort.
+That algorithm was not stable, and I<could> go quadratic. (A I<stable> sort
+preserves the input order of elements that compare equal. Although
+quicksort's run time is O(NlogN) when averaged over all arrays of
+length N, the time can be O(N**2), I<quadratic> behavior, for some
+inputs.) In 5.7, the quicksort implementation was replaced with
+a stable mergesort algorithm whose worst case behavior is O(NlogN).
+But benchmarks indicated that for some inputs, on some platforms,
+the original quicksort was faster. 5.8 has a sort pragma for
+limited control of the sort. Its rather blunt control of the
+underlying algorithm may not persist into future perls, but the
+ability to characterize the input or output in implementation
+independent ways quite probably will. See L</use>.
Examples:
package main;
@new = sort other::backwards @old;
+ # guarantee stability, regardless of algorithm
+ use sort 'stable';
+ @new = sort { substr($a, 3, 5) cmp substr($b, 3, 5) } @old;
+
+ # force use of quicksort (not portable outside Perl 5.8)
+ use sort '_quicksort'; # note discouraging _
+ @new = sort { substr($a, 3, 5) cmp substr($b, 3, 5) } @old;
+
+ # similar to the previous example, but demand stability as well
+ use sort qw( _mergesort stable );
+ @new = sort { substr($a, 3, 5) cmp substr($b, 3, 5) } @old;
+
If you're using strict, you I<must not> declare $a
and $b as lexicals. They are package globals. That means
if you're in the C<main> package and type
use strict qw(subs vars refs);
use subs qw(afunc blurfl);
use warnings qw(all);
+ use sort qw(stable _quicksort _mergesort);
Some of these pseudo-modules import semantics into the current
block scope (like C<strict> or C<integer>, unlike ordinary modules,
#...
do {
$kid = waitpid(-1, WNOHANG);
- } until $kid == -1;
+ } until $kid > 0;
then you can do a non-blocking wait for all pending zombie processes.
Non-blocking wait is available on machines supporting either the