This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
untodo the no-longer-failing todo test for rgs' patch
[perl5.git] / lib / English.pm
index 2953a80..c11fbed 100644 (file)
@@ -1,7 +1,9 @@
 package English;
 
+our $VERSION = '1.04';
+
 require Exporter;
-@ISA = (Exporter);
+@ISA = qw(Exporter);
 
 =head1 NAME
 
@@ -9,6 +11,7 @@ English - use nice English (or awk) names for ugly punctuation variables
 
 =head1 SYNOPSIS
 
+    use English qw( -no_match_vars ) ;  # Avoids regex performance penalty
     use English;
     ...
     if ($ERRNO =~ /denied/) { ... }
@@ -27,29 +30,52 @@ $INPUT_RECORD_SEPARATOR if you are using the English module.
 
 See L<perlvar> for a complete list of these.
 
-=head1 BUGS
+=head1 PERFORMANCE
+
+This module can provoke sizeable inefficiencies for regular expressions,
+due to unfortunate implementation details.  If performance matters in
+your application and you don't need $PREMATCH, $MATCH, or $POSTMATCH,
+try doing
 
-This module provokes sizeable inefficiencies for regular expressions,
-due to unfortunate implementation details.  If performance matters,
-consider avoiding English.
+   use English qw( -no_match_vars ) ;
+
+.  B<It is especially important to do this in modules to avoid penalizing
+all applications which use them.>
 
 =cut
 
 no warnings;
 
+my $globbed_match ;
+
 # Grandfather $NAME import
 sub import {
     my $this = shift;
-    my @list = @_;
+    my @list = grep { ! /^-no_match_vars$/ } @_ ;
     local $Exporter::ExportLevel = 1;
+    if ( @_ == @list ) {
+        *EXPORT = \@COMPLETE_EXPORT ;
+        $globbed_match ||= (
+           eval q{
+               *MATCH                          = *&    ;
+               *PREMATCH                       = *`    ;
+               *POSTMATCH                      = *'    ;
+               1 ;
+              }
+           || do {
+               require Carp ;
+               Carp::croak("Can't create English for match leftovers: $@") ;
+           }
+       ) ;
+    }
+    else {
+        *EXPORT = \@MINIMAL_EXPORT ;
+    }
     Exporter::import($this,grep {s/^\$/*/} @list);
 }
 
-@EXPORT = qw(
+@MINIMAL_EXPORT = qw(
        *ARG
-       *MATCH
-       *PREMATCH
-       *POSTMATCH
        *LAST_PAREN_MATCH
        *INPUT_LINE_NUMBER
        *NR
@@ -87,8 +113,8 @@ sub import {
        *EGID
        *PROGRAM_NAME
        *PERL_VERSION
-       *PERL_VERSION_TUPLE
        *ACCUMULATOR
+       *COMPILING
        *DEBUGGING
        *SYSTEM_FD_MAX
        *INPLACE_EDIT
@@ -99,18 +125,30 @@ sub import {
        *OSNAME
        *LAST_REGEXP_CODE_RESULT
        *EXCEPTIONS_BEING_CAUGHT
+       *LAST_SUBMATCH_RESULT
+       @LAST_MATCH_START
+       @LAST_MATCH_END
+);
+
+
+@MATCH_EXPORT = qw(
+       *MATCH
+       *PREMATCH
+       *POSTMATCH
 );
 
+@COMPLETE_EXPORT = ( @MINIMAL_EXPORT, @MATCH_EXPORT ) ;
+
 # The ground of all being. @ARG is deprecated (5.005 makes @_ lexical)
 
        *ARG                                    = *_    ;
 
 # Matching.
 
-       *MATCH                                  = *&    ;
-       *PREMATCH                               = *`    ;
-       *POSTMATCH                              = *'    ;
        *LAST_PAREN_MATCH                       = *+    ;
+       *LAST_SUBMATCH_RESULT                   = *^N ;
+       *LAST_MATCH_START                       = *-{ARRAY} ;
+       *LAST_MATCH_END                         = *+{ARRAY} ;
 
 # Input.
 
@@ -148,6 +186,8 @@ sub import {
        *CHILD_ERROR                            = *?    ;
        *OS_ERROR                               = *!    ;
            *ERRNO                              = *!    ;
+       *OS_ERROR                               = *!    ;
+           *ERRNO                              = *!    ;
        *EXTENDED_OS_ERROR                      = *^E   ;
        *EVAL_ERROR                             = *@    ;
 
@@ -167,8 +207,7 @@ sub import {
 
 # Internals.
 
-       *PERL_VERSION                           = *]    ;
-       *PERL_VERSION_TUPLE                     = *^V   ;
+       *PERL_VERSION                           = *^V   ;
        *ACCUMULATOR                            = *^A   ;
        *COMPILING                              = *^C   ;
        *DEBUGGING                              = *^D   ;
@@ -186,6 +225,6 @@ sub import {
 
 #      *ARRAY_BASE                             = *[    ;
 #      *OFMT                                   = *#    ;
-#      *MULTILINE_MATCHING                     = **    ;
+#      *OLD_PERL_VERSION                       = *]    ;
 
 1;