X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FEnglish.pm;h=c11fbed9eba62195502e8128b8aa45df8af2e542;hb=dfa4e5d386dd8c5329351699b02085856cdd140e;hp=f6e3ec00215c5c4b76f4f22b522e91b8dd34c213;hpb=44dcb63b0bb49fa80a224080c0601a2af7b94275;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/English.pm b/lib/English.pm index f6e3ec0..c11fbed 100644 --- a/lib/English.pm +++ b/lib/English.pm @@ -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 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 =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 @@ -88,6 +114,7 @@ sub import { *PROGRAM_NAME *PERL_VERSION *ACCUMULATOR + *COMPILING *DEBUGGING *SYSTEM_FD_MAX *INPLACE_EDIT @@ -98,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. @@ -147,6 +186,8 @@ sub import { *CHILD_ERROR = *? ; *OS_ERROR = *! ; *ERRNO = *! ; + *OS_ERROR = *! ; + *ERRNO = *! ; *EXTENDED_OS_ERROR = *^E ; *EVAL_ERROR = *@ ; @@ -184,7 +225,6 @@ sub import { # *ARRAY_BASE = *[ ; # *OFMT = *# ; -# *MULTILINE_MATCHING = ** ; # *OLD_PERL_VERSION = *] ; 1;