File Coverage

blib/lib/Ehp15.pm
Criterion Covered Total %
statement 1205 4691 25.6
branch 1361 4560 29.8
condition 162 496 32.6
subroutine 68 190 35.7
pod 8 148 5.4
total 2804 10085 27.8


line stmt bran cond sub pod time code
1             package Ehp15;
2 389     389   11130 use strict;
  389         639  
  389         18517  
3             ######################################################################
4             #
5             # Ehp15 - Run-time routines for HP15.pm
6             #
7             # http://search.cpan.org/dist/Char-HP15/
8             #
9             # Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2018, 2019 INABA Hitoshi
10             ######################################################################
11              
12 389     389   6348 use 5.00503; # Galapagos Consensus 1998 for primetools
  389         4317  
13             # use 5.008001; # Lancaster Consensus 2013 for toolchains
14              
15             # 12.3. Delaying use Until Runtime
16             # in Chapter 12. Packages, Libraries, and Modules
17             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
18             # (and so on)
19              
20             # Version numbers should be boring
21             # http://www.dagolden.com/index.php/369/version-numbers-should-be-boring/
22             # For the impatient, the disinterested or those who just want to follow
23             # a recipe, my advice for all modules is this:
24             # our $VERSION = "0.001"; # or "0.001_001" for a dev release
25             # $VERSION = eval $VERSION; # No!! because '1.10' makes '1.1'
26              
27 389     389   1955 use vars qw($VERSION);
  389         8065  
  389         96127  
28             $VERSION = '1.13';
29             $VERSION = $VERSION;
30              
31             BEGIN {
32 389 50   389   5969 if ($^X =~ / jperl /oxmsi) {
33 0         0 die __FILE__, ": needs perl(not jperl) 5.00503 or later. (\$^X==$^X)\n";
34             }
35 389         2140 if (CORE::ord('A') == 193) {
36             die __FILE__, ": is not US-ASCII script (may be EBCDIC or EBCDIK script).\n";
37             }
38 389         67904 if (CORE::ord('A') != 0x41) {
39             die __FILE__, ": is not US-ASCII script (must be US-ASCII script).\n";
40             }
41             }
42              
43             BEGIN {
44              
45             # instead of utf8.pm
46 389     389   30516 CORE::eval q{
  389     389   2297  
  389     120   814  
  389         79568  
  0         0  
  0         0  
  0         0  
  0         0  
47             no warnings qw(redefine);
48             *utf8::upgrade = sub { CORE::length $_[0] };
49             *utf8::downgrade = sub { 1 };
50             *utf8::encode = sub { };
51             *utf8::decode = sub { 1 };
52             *utf8::is_utf8 = sub { };
53             *utf8::valid = sub { 1 };
54             };
55 389 50       155862 if ($@) {
56 0         0 *utf8::upgrade = sub { CORE::length $_[0] };
  0         0  
57 0         0 *utf8::downgrade = sub { 1 };
  0         0  
58 0         0 *utf8::encode = sub { };
59 0         0 *utf8::decode = sub { 1 };
  0         0  
60 0         0 *utf8::is_utf8 = sub { };
61 0         0 *utf8::valid = sub { 1 };
  0         0  
62             }
63             }
64              
65             # instead of Symbol.pm
66 0         0 BEGIN {
67             sub gensym () {
68 0     0 0 0 return \do { local *_ };
  0         0  
69             }
70              
71             sub qualify ($$) {
72 0     1152 0 0 my($name) = @_;
73              
74 1152 50       2843 if (ref $name) {
    50          
    50          
    50          
    50          
    50          
    50          
75 1152         4743 return $name;
76             }
77             elsif (Ehp15::index($name,'::') >= 0) {
78 0         0 return $name;
79             }
80             elsif (Ehp15::index($name,"'") >= 0) {
81 0         0 return $name;
82             }
83              
84             # special character, "^xyz"
85             elsif ($name =~ /\A \^ [ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]+ \z/x) {
86              
87             # RGS 2001-11-05 : translate leading ^X to control-char
88 0         0 $name =~ s{\A \^ ([ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]) }{'qq(\c'.$1.')'}xee;
  0         0  
89 0         0 return 'main::' . $name;
90             }
91              
92             # Global names
93             elsif ($name =~ /\A (?: ARGV | ARGVOUT | ENV | INC | SIG | STDERR | STDIN | STDOUT ) \z/x) {
94 0         0 return 'main::' . $name;
95             }
96              
97             # or other
98             elsif ($name =~ /\A [^ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz] \z/x) {
99 0         0 return 'main::' . $name;
100             }
101              
102             elsif (defined $_[1]) {
103 0         0 return $_[1] . '::' . $name;
104             }
105             else {
106 1152         10110 return (caller)[0] . '::' . $name;
107             }
108             }
109              
110             sub qualify_to_ref ($;$) {
111 0 50   1152 0 0 if (defined $_[1]) {
112 389     389   4208 no strict qw(refs);
  389         791  
  389         34300  
113 1152         3426 return \*{ qualify $_[0], $_[1] };
  0         0  
114             }
115             else {
116 389     389   4375 no strict qw(refs);
  389     0   2164  
  389         77830  
117 0         0 return \*{ qualify $_[0], (caller)[0] };
  1152         1826  
118             }
119             }
120             }
121              
122             # P.714 29.2.39. flock
123             # in Chapter 29: Functions
124             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
125              
126             # P.863 flock
127             # in Chapter 27: Functions
128             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
129              
130             sub LOCK_SH() {1}
131             sub LOCK_EX() {2}
132             sub LOCK_UN() {8}
133             sub LOCK_NB() {4}
134              
135             # instead of Carp.pm
136             sub carp;
137             sub croak;
138             sub cluck;
139             sub confess;
140              
141             # 6.18. Matching Multiple-Byte Characters
142             # in Chapter 6. Pattern Matching
143             # of ISBN 978-1-56592-243-3 Perl Perl Cookbook.
144             # (and so on)
145              
146             # regexp of character
147             my $your_char = q{[\x80-\xA0\xE0-\xFE][\x00-\xFF]|[\x00-\xFF]};
148 389     389   2645 use vars qw($qq_char); $qq_char = qr/\\c[\x40-\x5F]|\\?(?:$your_char)/oxms;
  389         3867  
  389         28320  
149 389     389   2276 use vars qw($q_char); $q_char = qr/$your_char/oxms;
  389         2488  
  389         672817  
150              
151             #
152             # HP-15 character range per length
153             #
154             my %range_tr = ();
155              
156             #
157             # HP-15 case conversion
158             #
159             my %lc = ();
160             @lc{qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)} =
161             qw(a b c d e f g h i j k l m n o p q r s t u v w x y z);
162             my %uc = ();
163             @uc{qw(a b c d e f g h i j k l m n o p q r s t u v w x y z)} =
164             qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z);
165             my %fc = ();
166             @fc{qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)} =
167             qw(a b c d e f g h i j k l m n o p q r s t u v w x y z);
168              
169             if (0) {
170             }
171              
172             elsif (__PACKAGE__ =~ / \b Ehp15 \z/oxms) {
173             %range_tr = (
174             1 => [ [0x00..0x7F],
175             [0xA1..0xDF],
176             [0xFF..0xFF],
177             ],
178             2 => [ [0x80..0xA0],[0x21..0x7E],
179             [0x80..0xA0],[0x80..0xFF],
180             [0xE0..0xFE],[0x21..0x7E],
181             [0xE0..0xFE],[0x80..0xFF],
182             ],
183             );
184             }
185              
186             else {
187             croak "Don't know my package name '@{[__PACKAGE__]}'";
188             }
189              
190             #
191             # @ARGV wildcard globbing
192             #
193             sub import {
194              
195 1152 50   5   6080 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
196 5         84 my @argv = ();
197 0         0 for (@ARGV) {
198              
199             # has space
200 0 0       0 if (/\A (?:$q_char)*? [ ] /oxms) {
    0          
201 0 0       0 if (my @glob = Ehp15::glob(qq{"$_"})) {
202 0         0 push @argv, @glob;
203             }
204             else {
205 0         0 push @argv, $_;
206             }
207             }
208              
209             # has wildcard metachar
210             elsif (/\A (?:$q_char)*? [*?] /oxms) {
211 0 0       0 if (my @glob = Ehp15::glob($_)) {
212 0         0 push @argv, @glob;
213             }
214             else {
215 0         0 push @argv, $_;
216             }
217             }
218              
219             # no wildcard globbing
220             else {
221 0         0 push @argv, $_;
222             }
223             }
224 0         0 @ARGV = @argv;
225             }
226              
227 0         0 *Char::ord = \&HP15::ord;
228 5         27 *Char::ord_ = \&HP15::ord_;
229 5         12 *Char::reverse = \&HP15::reverse;
230 5         12 *Char::getc = \&HP15::getc;
231 5         11 *Char::length = \&HP15::length;
232 5         10 *Char::substr = \&HP15::substr;
233 5         12 *Char::index = \&HP15::index;
234 5         10 *Char::rindex = \&HP15::rindex;
235 5         8 *Char::eval = \&HP15::eval;
236 5         33 *Char::escape = \&HP15::escape;
237 5         11 *Char::escape_token = \&HP15::escape_token;
238 5         11 *Char::escape_script = \&HP15::escape_script;
239             }
240              
241             # P.230 Care with Prototypes
242             # in Chapter 6: Subroutines
243             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
244             #
245             # If you aren't careful, you can get yourself into trouble with prototypes.
246             # But if you are careful, you can do a lot of neat things with them. This is
247             # all very powerful, of course, and should only be used in moderation to make
248             # the world a better place.
249              
250             # P.332 Care with Prototypes
251             # in Chapter 7: Subroutines
252             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
253             #
254             # If you aren't careful, you can get yourself into trouble with prototypes.
255             # But if you are careful, you can do a lot of neat things with them. This is
256             # all very powerful, of course, and should only be used in moderation to make
257             # the world a better place.
258              
259             #
260             # Prototypes of subroutines
261             #
262       0     sub unimport {}
263             sub Ehp15::split(;$$$);
264             sub Ehp15::tr($$$$;$);
265             sub Ehp15::chop(@);
266             sub Ehp15::index($$;$);
267             sub Ehp15::rindex($$;$);
268             sub Ehp15::lcfirst(@);
269             sub Ehp15::lcfirst_();
270             sub Ehp15::lc(@);
271             sub Ehp15::lc_();
272             sub Ehp15::ucfirst(@);
273             sub Ehp15::ucfirst_();
274             sub Ehp15::uc(@);
275             sub Ehp15::uc_();
276             sub Ehp15::fc(@);
277             sub Ehp15::fc_();
278             sub Ehp15::ignorecase;
279             sub Ehp15::classic_character_class;
280             sub Ehp15::capture;
281             sub Ehp15::chr(;$);
282             sub Ehp15::chr_();
283             sub Ehp15::filetest;
284             sub Ehp15::r(;*@);
285             sub Ehp15::w(;*@);
286             sub Ehp15::x(;*@);
287             sub Ehp15::o(;*@);
288             sub Ehp15::R(;*@);
289             sub Ehp15::W(;*@);
290             sub Ehp15::X(;*@);
291             sub Ehp15::O(;*@);
292             sub Ehp15::e(;*@);
293             sub Ehp15::z(;*@);
294             sub Ehp15::s(;*@);
295             sub Ehp15::f(;*@);
296             sub Ehp15::d(;*@);
297             sub Ehp15::l(;*@);
298             sub Ehp15::p(;*@);
299             sub Ehp15::S(;*@);
300             sub Ehp15::b(;*@);
301             sub Ehp15::c(;*@);
302             sub Ehp15::u(;*@);
303             sub Ehp15::g(;*@);
304             sub Ehp15::k(;*@);
305             sub Ehp15::T(;*@);
306             sub Ehp15::B(;*@);
307             sub Ehp15::M(;*@);
308             sub Ehp15::A(;*@);
309             sub Ehp15::C(;*@);
310             sub Ehp15::filetest_;
311             sub Ehp15::r_();
312             sub Ehp15::w_();
313             sub Ehp15::x_();
314             sub Ehp15::o_();
315             sub Ehp15::R_();
316             sub Ehp15::W_();
317             sub Ehp15::X_();
318             sub Ehp15::O_();
319             sub Ehp15::e_();
320             sub Ehp15::z_();
321             sub Ehp15::s_();
322             sub Ehp15::f_();
323             sub Ehp15::d_();
324             sub Ehp15::l_();
325             sub Ehp15::p_();
326             sub Ehp15::S_();
327             sub Ehp15::b_();
328             sub Ehp15::c_();
329             sub Ehp15::u_();
330             sub Ehp15::g_();
331             sub Ehp15::k_();
332             sub Ehp15::T_();
333             sub Ehp15::B_();
334             sub Ehp15::M_();
335             sub Ehp15::A_();
336             sub Ehp15::C_();
337             sub Ehp15::glob($);
338             sub Ehp15::glob_();
339             sub Ehp15::lstat(*);
340             sub Ehp15::lstat_();
341             sub Ehp15::opendir(*$);
342             sub Ehp15::stat(*);
343             sub Ehp15::stat_();
344             sub Ehp15::unlink(@);
345             sub Ehp15::chdir(;$);
346             sub Ehp15::do($);
347             sub Ehp15::require(;$);
348             sub Ehp15::telldir(*);
349              
350             sub HP15::ord(;$);
351             sub HP15::ord_();
352             sub HP15::reverse(@);
353             sub HP15::getc(;*@);
354             sub HP15::length(;$);
355             sub HP15::substr($$;$$);
356             sub HP15::index($$;$);
357             sub HP15::rindex($$;$);
358             sub HP15::escape(;$);
359              
360             #
361             # Regexp work
362             #
363 389         40554 use vars qw(
364             $re_a
365             $re_t
366             $re_n
367             $re_r
368 389     389   5195 );
  389         2103  
369              
370             #
371             # Character class
372             #
373 389         128597 use vars qw(
374             $dot
375             $dot_s
376             $eD
377             $eS
378             $eW
379             $eH
380             $eV
381             $eR
382             $eN
383             $not_alnum
384             $not_alpha
385             $not_ascii
386             $not_blank
387             $not_cntrl
388             $not_digit
389             $not_graph
390             $not_lower
391             $not_lower_i
392             $not_print
393             $not_punct
394             $not_space
395             $not_upper
396             $not_upper_i
397             $not_word
398             $not_xdigit
399             $eb
400             $eB
401 389     389   3576 );
  389         629  
402              
403 389         4931718 use vars qw(
404             $anchor
405             $matched
406 389     389   2376 );
  389         2592  
407             ${Ehp15::anchor} = qr{\G(?>[^\x80-\xA0\xE0-\xFE]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])*?}oxms;
408             my $q_char_SADAHIRO_Tomoyuki_2002_01_17 = '';
409              
410             # Quantifiers
411             # {n,m} --- Match at least n but not more than m times
412             #
413             # n and m are limited to non-negative integral values less than a
414             # preset limit defined when perl is built. This is usually 32766 on
415             # the most common platforms.
416             #
417             # The following code is an attempt to solve the above limitations
418             # in a multi-byte anchoring.
419              
420             # avoid "Segmentation fault" and "Error: Parse exception"
421              
422             # perl5101delta
423             # http://perldoc.perl.org/perl5101delta.html
424             # In 5.10.0, the * quantifier in patterns was sometimes treated as {0,32767}
425             # [RT #60034, #60464]. For example, this match would fail:
426             # ("ab" x 32768) =~ /^(ab)*$/
427              
428             # SEE ALSO
429             #
430             # Complex regular subexpression recursion limit
431             # http://www.perlmonks.org/?node_id=810857
432             #
433             # regexp iteration limits
434             # http://www.nntp.perl.org/group/perl.perl5.porters/2009/02/msg144065.html
435             #
436             # latest Perl won't match certain regexes more than 32768 characters long
437             # http://stackoverflow.com/questions/26226630/latest-perl-wont-match-certain-regexes-more-than-32768-characters-long
438             #
439             # Break through the limitations of regular expressions of Perl
440             # http://d.hatena.ne.jp/gfx/20110212/1297512479
441              
442             if (($] >= 5.010001) or
443             # ActivePerl 5.6 or later (include 5.10.0)
444             (defined($ActivePerl::VERSION) and ($ActivePerl::VERSION > 800)) or
445             (($^O eq 'MSWin32') and ($] =~ /\A 5\.006/oxms))
446             ) {
447             my $sbcs = ''; # Single Byte Character Set
448             for my $range (@{ $range_tr{1} }) {
449             $sbcs .= sprintf('\\x%02X-\\x%02X', $range->[0], $range->[-1]);
450             }
451              
452             if (0) {
453             }
454              
455             # other encoding
456             else {
457             ${Ehp15::q_char_SADAHIRO_Tomoyuki_2002_01_17} = qr{.*?[$sbcs](?:[^$sbcs][^$sbcs])*?}oxms;
458             # ******* octets not in multiple octet char (always char boundary)
459             # **************** 2 octet chars
460             }
461              
462             ${Ehp15::anchor_SADAHIRO_Tomoyuki_2002_01_17} =
463             qr{\G(?(?=.{0,32766}\z)(?:[^\x80-\xA0\xE0-\xFE]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])*?|(?(?=[$sbcs]+\z).*?|(?:${Ehp15::q_char_SADAHIRO_Tomoyuki_2002_01_17})))}oxms;
464             # qr{
465             # \G # (1), (2)
466             # (? # (3)
467             # (?=.{0,32766}\z) # (4)
468             # (?:[^\x80-\xA0\xE0-\xFE]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])*?| # (5)
469             # (?(?=[$sbcs]+\z) # (6)
470             # .*?| #(7)
471             # (?:${Ehp15::q_char_SADAHIRO_Tomoyuki_2002_01_17}) # (8)
472             # ))}oxms;
473              
474             # avoid: Complex regular subexpression recursion limit (32766) exceeded at here.
475             local $^W = 0;
476              
477             if (((('A' x 32768).'B') !~ / ${Ehp15::anchor} B /oxms) and
478             ((('A' x 32768).'B') =~ / ${Ehp15::anchor_SADAHIRO_Tomoyuki_2002_01_17} B /oxms)
479             ) {
480             ${Ehp15::anchor} = ${Ehp15::anchor_SADAHIRO_Tomoyuki_2002_01_17};
481             }
482             else {
483             undef ${Ehp15::q_char_SADAHIRO_Tomoyuki_2002_01_17};
484             }
485             }
486              
487             # (1)
488             # P.128 Start of match (or end of previous match): \G
489             # P.130 Advanced Use of \G with Perl
490             # in Chapter3: Over view of Regular Expression Features and Flavors
491             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
492              
493             # (2)
494             # P.255 Use leading anchors
495             # P.256 Expose ^ and \G at the front of expressions
496             # in Chapter6: Crafting an Efficient Expression
497             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
498              
499             # (3)
500             # P.138 Conditional: (? if then| else)
501             # in Chapter3: Over view of Regular Expression Features and Flavors
502             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
503              
504             # (4)
505             # perlre
506             # http://perldoc.perl.org/perlre.html
507             # The "*" quantifier is equivalent to {0,} , the "+" quantifier to {1,} ,
508             # and the "?" quantifier to {0,1}, ., n, and m are limited to non-negative
509             # integral values less than a preset limit defined when perl is built.
510             # This is usually 32766 on the most common platforms. The actual limit
511             # can be seen in the error message generated by code such as this:
512             # $_ **= $_ , / {$_} / for 2 .. 42;
513              
514             # (5)
515             # P.1023 Multiple-Byte Anchoring
516             # in Appendix W Perl Code Examples
517             # of ISBN 1-56592-224-7 CJKV Information Processing
518              
519             # (6)
520             # if string has only SBCS (Single Byte Character Set)
521              
522             # (7)
523             # then .*? (isn't limited to 32766)
524              
525             # (8)
526             # else HP-15::Regexp::Const (SADAHIRO Tomoyuki)
527             # http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#long
528             # http://search.cpan.org/~sadahiro/HP-15-Regexp/
529             # $PadA = ' (?:\A| [\x00-\x80\xA0-\xDF])(?:[\x80-\xA0\xE0-\xFE]{2})*?';
530             # $PadG = '\G(?: |[\x00-\xFF]*?[\x00-\x80\xA0-\xDF])(?:[\x80-\xA0\xE0-\xFE]{2})*?';
531             # $PadGA = '\G(?:\A|(?:[\x80-\xA0\xE0-\xFE]{2})+?|[\x00-\xFF]*?[\x00-\x80\xA0-\xDF] (?:[\x80-\xA0\xE0-\xFE]{2})*?)';
532              
533             ${Ehp15::dot} = qr{(?>[^\x80-\xA0\xE0-\xFE\x0A]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
534             ${Ehp15::dot_s} = qr{(?>[^\x80-\xA0\xE0-\xFE]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
535             ${Ehp15::eD} = qr{(?>[^\x80-\xA0\xE0-\xFE0-9]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
536              
537             # Vertical tabs are now whitespace
538             # \s in a regex now matches a vertical tab in all circumstances.
539             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
540             # ${Ehp15::eS} = qr{(?>[^\x80-\xA0\xE0-\xFE\x09\x0A \x0C\x0D\x20]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
541             # ${Ehp15::eS} = qr{(?>[^\x80-\xA0\xE0-\xFE\x09\x0A\x0B\x0C\x0D\x20]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
542             ${Ehp15::eS} = qr{(?>[^\x80-\xA0\xE0-\xFE\s]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
543              
544             ${Ehp15::eW} = qr{(?>[^\x80-\xA0\xE0-\xFE0-9A-Z_a-z]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
545             ${Ehp15::eH} = qr{(?>[^\x80-\xA0\xE0-\xFE\x09\x20]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
546             ${Ehp15::eV} = qr{(?>[^\x80-\xA0\xE0-\xFE\x0A\x0B\x0C\x0D]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
547             ${Ehp15::eR} = qr{(?>\x0D\x0A|[\x0A\x0D])};
548             ${Ehp15::eN} = qr{(?>[^\x80-\xA0\xE0-\xFE\x0A]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
549             ${Ehp15::not_alnum} = qr{(?>[^\x80-\xA0\xE0-\xFE\x30-\x39\x41-\x5A\x61-\x7A]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
550             ${Ehp15::not_alpha} = qr{(?>[^\x80-\xA0\xE0-\xFE\x41-\x5A\x61-\x7A]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
551             ${Ehp15::not_ascii} = qr{(?>[^\x80-\xA0\xE0-\xFE\x00-\x7F]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
552             ${Ehp15::not_blank} = qr{(?>[^\x80-\xA0\xE0-\xFE\x09\x20]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
553             ${Ehp15::not_cntrl} = qr{(?>[^\x80-\xA0\xE0-\xFE\x00-\x1F\x7F]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
554             ${Ehp15::not_digit} = qr{(?>[^\x80-\xA0\xE0-\xFE\x30-\x39]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
555             ${Ehp15::not_graph} = qr{(?>[^\x80-\xA0\xE0-\xFE\x21-\x7F]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
556             ${Ehp15::not_lower} = qr{(?>[^\x80-\xA0\xE0-\xFE\x61-\x7A]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
557             ${Ehp15::not_lower_i} = qr{(?>[^\x80-\xA0\xE0-\xFE\x41-\x5A\x61-\x7A]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])}; # Perl 5.16 compatible
558             # ${Ehp15::not_lower_i} = qr{(?>[^\x80-\xA0\xE0-\xFE]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])}; # older Perl compatible
559             ${Ehp15::not_print} = qr{(?>[^\x80-\xA0\xE0-\xFE\x20-\x7F]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
560             ${Ehp15::not_punct} = qr{(?>[^\x80-\xA0\xE0-\xFE\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
561             ${Ehp15::not_space} = qr{(?>[^\x80-\xA0\xE0-\xFE\s\x0B]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
562             ${Ehp15::not_upper} = qr{(?>[^\x80-\xA0\xE0-\xFE\x41-\x5A]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
563             ${Ehp15::not_upper_i} = qr{(?>[^\x80-\xA0\xE0-\xFE\x41-\x5A\x61-\x7A]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])}; # Perl 5.16 compatible
564             # ${Ehp15::not_upper_i} = qr{(?>[^\x80-\xA0\xE0-\xFE]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])}; # older Perl compatible
565             ${Ehp15::not_word} = qr{(?>[^\x80-\xA0\xE0-\xFE\x30-\x39\x41-\x5A\x5F\x61-\x7A]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
566             ${Ehp15::not_xdigit} = qr{(?>[^\x80-\xA0\xE0-\xFE\x30-\x39\x41-\x46\x61-\x66]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])};
567             ${Ehp15::eb} = qr{(?:\A(?=[0-9A-Z_a-z])|(?<=[\x00-\x2F\x40\x5B-\x5E\x60\x7B-\xFF])(?=[0-9A-Z_a-z])|(?<=[0-9A-Z_a-z])(?=[\x00-\x2F\x40\x5B-\x5E\x60\x7B-\xFF]|\z))};
568             ${Ehp15::eB} = qr{(?:(?<=[0-9A-Z_a-z])(?=[0-9A-Z_a-z])|(?<=[\x00-\x2F\x40\x5B-\x5E\x60\x7B-\xFF])(?=[\x00-\x2F\x40\x5B-\x5E\x60\x7B-\xFF]))};
569              
570             # avoid: Name "Ehp15::foo" used only once: possible typo at here.
571             ${Ehp15::dot} = ${Ehp15::dot};
572             ${Ehp15::dot_s} = ${Ehp15::dot_s};
573             ${Ehp15::eD} = ${Ehp15::eD};
574             ${Ehp15::eS} = ${Ehp15::eS};
575             ${Ehp15::eW} = ${Ehp15::eW};
576             ${Ehp15::eH} = ${Ehp15::eH};
577             ${Ehp15::eV} = ${Ehp15::eV};
578             ${Ehp15::eR} = ${Ehp15::eR};
579             ${Ehp15::eN} = ${Ehp15::eN};
580             ${Ehp15::not_alnum} = ${Ehp15::not_alnum};
581             ${Ehp15::not_alpha} = ${Ehp15::not_alpha};
582             ${Ehp15::not_ascii} = ${Ehp15::not_ascii};
583             ${Ehp15::not_blank} = ${Ehp15::not_blank};
584             ${Ehp15::not_cntrl} = ${Ehp15::not_cntrl};
585             ${Ehp15::not_digit} = ${Ehp15::not_digit};
586             ${Ehp15::not_graph} = ${Ehp15::not_graph};
587             ${Ehp15::not_lower} = ${Ehp15::not_lower};
588             ${Ehp15::not_lower_i} = ${Ehp15::not_lower_i};
589             ${Ehp15::not_print} = ${Ehp15::not_print};
590             ${Ehp15::not_punct} = ${Ehp15::not_punct};
591             ${Ehp15::not_space} = ${Ehp15::not_space};
592             ${Ehp15::not_upper} = ${Ehp15::not_upper};
593             ${Ehp15::not_upper_i} = ${Ehp15::not_upper_i};
594             ${Ehp15::not_word} = ${Ehp15::not_word};
595             ${Ehp15::not_xdigit} = ${Ehp15::not_xdigit};
596             ${Ehp15::eb} = ${Ehp15::eb};
597             ${Ehp15::eB} = ${Ehp15::eB};
598              
599             #
600             # HP-15 split
601             #
602             sub Ehp15::split(;$$$) {
603              
604             # P.794 29.2.161. split
605             # in Chapter 29: Functions
606             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
607              
608             # P.951 split
609             # in Chapter 27: Functions
610             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
611              
612 5     0 0 11396 my $pattern = $_[0];
613 0         0 my $string = $_[1];
614 0         0 my $limit = $_[2];
615              
616             # if $pattern is also omitted or is the literal space, " "
617 0 0       0 if (not defined $pattern) {
618 0         0 $pattern = ' ';
619             }
620              
621             # if $string is omitted, the function splits the $_ string
622 0 0       0 if (not defined $string) {
623 0 0       0 if (defined $_) {
624 0         0 $string = $_;
625             }
626             else {
627 0         0 $string = '';
628             }
629             }
630              
631 0         0 my @split = ();
632              
633             # when string is empty
634 0 0       0 if ($string eq '') {
    0          
635              
636             # resulting list value in list context
637 0 0       0 if (wantarray) {
638 0         0 return @split;
639             }
640              
641             # count of substrings in scalar context
642             else {
643 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
644 0         0 @_ = @split;
645 0         0 return scalar @_;
646             }
647             }
648              
649             # split's first argument is more consistently interpreted
650             #
651             # After some changes earlier in v5.17, split's behavior has been simplified:
652             # if the PATTERN argument evaluates to a string containing one space, it is
653             # treated the way that a literal string containing one space once was.
654             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#split's_first_argument_is_more_consistently_interpreted
655              
656             # if $pattern is also omitted or is the literal space, " ", the function splits
657             # on whitespace, /\s+/, after skipping any leading whitespace
658             # (and so on)
659              
660             elsif ($pattern eq ' ') {
661 0 0       0 if (not defined $limit) {
662 0         0 return CORE::split(' ', $string);
663             }
664             else {
665 0         0 return CORE::split(' ', $string, $limit);
666             }
667             }
668              
669 0         0 local $q_char = $q_char;
670 0 0       0 if (CORE::length($string) > 32766) {
671 0 0       0 if ($string =~ /\A [\x00-\x7F]+ \z/oxms) {
    0          
672 0         0 $q_char = qr{.}s;
673             }
674             elsif (defined ${Ehp15::q_char_SADAHIRO_Tomoyuki_2002_01_17}) {
675 0         0 $q_char = ${Ehp15::q_char_SADAHIRO_Tomoyuki_2002_01_17};
676             }
677             }
678              
679             # if $limit is negative, it is treated as if an arbitrarily large $limit has been specified
680 0 0 0     0 if ((not defined $limit) or ($limit <= 0)) {
    0          
681              
682             # a pattern capable of matching either the null string or something longer than the
683             # null string will split the value of $string into separate characters wherever it
684             # matches the null string between characters
685             # (and so on)
686              
687 0 0       0 if ('' =~ / \A $pattern \z /xms) {
688 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
689 0         0 my $limit = scalar(() = $string =~ /($pattern)/oxmsg);
690              
691             # P.1024 Appendix W.10 Multibyte Processing
692             # of ISBN 1-56592-224-7 CJKV Information Processing
693             # (and so on)
694              
695             # the //m modifier is assumed when you split on the pattern /^/
696             # (and so on)
697              
698             # V
699 0   0     0 while ((--$limit > 0) and ($string =~ s/\A((?:$q_char)+?)$pattern//m)) {
700              
701             # if the $pattern contains parentheses, then the substring matched by each pair of parentheses
702             # is included in the resulting list, interspersed with the fields that are ordinarily returned
703             # (and so on)
704              
705 0         0 local $@;
706 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
707 0         0 push @split, CORE::eval('$' . $digit);
708             }
709             }
710             }
711              
712             else {
713 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
714              
715             # V
716 0         0 while ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
717 0         0 local $@;
718 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
719 0         0 push @split, CORE::eval('$' . $digit);
720             }
721             }
722             }
723             }
724              
725             elsif ($limit > 0) {
726 0 0       0 if ('' =~ / \A $pattern \z /xms) {
727 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
728 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
729              
730             # V
731 0 0       0 if ($string =~ s/\A((?:$q_char)+?)$pattern//m) {
732 0         0 local $@;
733 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
734 0         0 push @split, CORE::eval('$' . $digit);
735             }
736             }
737             }
738             }
739             else {
740 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
741 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
742              
743             # V
744 0 0       0 if ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
745 0         0 local $@;
746 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
747 0         0 push @split, CORE::eval('$' . $digit);
748             }
749             }
750             }
751             }
752             }
753              
754 0 0       0 if (CORE::length($string) > 0) {
755 0         0 push @split, $string;
756             }
757              
758             # if $_[2] (NOT "$limit") is omitted or zero, trailing null fields are stripped from the result
759 0 0 0     0 if ((not defined $_[2]) or ($_[2] == 0)) {
760 0   0     0 while ((scalar(@split) >= 1) and ($split[-1] eq '')) {
761 0         0 pop @split;
762             }
763             }
764              
765             # resulting list value in list context
766 0 0       0 if (wantarray) {
767 0         0 return @split;
768             }
769              
770             # count of substrings in scalar context
771             else {
772 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
773 0         0 @_ = @split;
774 0         0 return scalar @_;
775             }
776             }
777              
778             #
779             # get last subexpression offsets
780             #
781             sub _last_subexpression_offsets {
782 0     0   0 my $pattern = $_[0];
783              
784             # remove comment
785 0         0 $pattern =~ s/\(\?\# .*? \)//oxmsg;
786              
787 0         0 my $modifier = '';
788 0 0       0 if ($pattern =~ /\(\?\^? ([\-A-Za-z]+) :/oxms) {
789 0         0 $modifier = $1;
790 0         0 $modifier =~ s/-[A-Za-z]*//;
791             }
792              
793             # with /x modifier
794 0         0 my @char = ();
795 0 0       0 if ($modifier =~ /x/oxms) {
796 0         0 @char = $pattern =~ /\G((?>
797             [^\x80-\xA0\xE0-\xFE\\\#\[\(]|[\x80-\xA0\xE0-\xFE][\x00-\xFF] |
798             \\ $q_char |
799             \# (?>[^\n]*) $ |
800             \[ (?>(?:[^\x80-\xA0\xE0-\xFE\\\]]|[\x80-\xA0\xE0-\xFE][\x00-\xFF]|\\\\|\\\]|$q_char)+) \] |
801             \(\? |
802             $q_char
803             ))/oxmsg;
804             }
805              
806             # without /x modifier
807             else {
808 0         0 @char = $pattern =~ /\G((?>
809             [^\x80-\xA0\xE0-\xFE\\\[\(]|[\x80-\xA0\xE0-\xFE][\x00-\xFF] |
810             \\ $q_char |
811             \[ (?>(?:[^\x80-\xA0\xE0-\xFE\\\]]|[\x80-\xA0\xE0-\xFE][\x00-\xFF]|\\\\|\\\]|$q_char)+) \] |
812             \(\? |
813             $q_char
814             ))/oxmsg;
815             }
816              
817 0         0 return scalar grep { $_ eq '(' } @char;
  0         0  
818             }
819              
820             #
821             # HP-15 transliteration (tr///)
822             #
823             sub Ehp15::tr($$$$;$) {
824              
825 0     0 0 0 my $bind_operator = $_[1];
826 0         0 my $searchlist = $_[2];
827 0         0 my $replacementlist = $_[3];
828 0   0     0 my $modifier = $_[4] || '';
829              
830 0 0       0 if ($modifier =~ /r/oxms) {
831 0 0       0 if ($bind_operator =~ / !~ /oxms) {
832 0         0 croak "Using !~ with tr///r doesn't make sense";
833             }
834             }
835              
836 0         0 my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
837 0         0 my @searchlist = _charlist_tr($searchlist);
838 0         0 my @replacementlist = _charlist_tr($replacementlist);
839              
840 0         0 my %tr = ();
841 0         0 for (my $i=0; $i <= $#searchlist; $i++) {
842 0 0       0 if (not exists $tr{$searchlist[$i]}) {
843 0 0 0     0 if (defined $replacementlist[$i] and ($replacementlist[$i] ne '')) {
    0 0        
    0          
844 0         0 $tr{$searchlist[$i]} = $replacementlist[$i];
845             }
846             elsif ($modifier =~ /d/oxms) {
847 0         0 $tr{$searchlist[$i]} = '';
848             }
849             elsif (defined $replacementlist[-1] and ($replacementlist[-1] ne '')) {
850 0         0 $tr{$searchlist[$i]} = $replacementlist[-1];
851             }
852             else {
853 0         0 $tr{$searchlist[$i]} = $searchlist[$i];
854             }
855             }
856             }
857              
858 0         0 my $tr = 0;
859 0         0 my $replaced = '';
860 0 0       0 if ($modifier =~ /c/oxms) {
861 0         0 while (defined(my $char = shift @char)) {
862 0 0       0 if (not exists $tr{$char}) {
863 0 0       0 if (defined $replacementlist[0]) {
864 0         0 $replaced .= $replacementlist[0];
865             }
866 0         0 $tr++;
867 0 0       0 if ($modifier =~ /s/oxms) {
868 0   0     0 while (@char and (not exists $tr{$char[0]})) {
869 0         0 shift @char;
870 0         0 $tr++;
871             }
872             }
873             }
874             else {
875 0         0 $replaced .= $char;
876             }
877             }
878             }
879             else {
880 0         0 while (defined(my $char = shift @char)) {
881 0 0       0 if (exists $tr{$char}) {
882 0         0 $replaced .= $tr{$char};
883 0         0 $tr++;
884 0 0       0 if ($modifier =~ /s/oxms) {
885 0   0     0 while (@char and (exists $tr{$char[0]}) and ($tr{$char[0]} eq $tr{$char})) {
      0        
886 0         0 shift @char;
887 0         0 $tr++;
888             }
889             }
890             }
891             else {
892 0         0 $replaced .= $char;
893             }
894             }
895             }
896              
897 0 0       0 if ($modifier =~ /r/oxms) {
898 0         0 return $replaced;
899             }
900             else {
901 0         0 $_[0] = $replaced;
902 0 0       0 if ($bind_operator =~ / !~ /oxms) {
903 0         0 return not $tr;
904             }
905             else {
906 0         0 return $tr;
907             }
908             }
909             }
910              
911             #
912             # HP-15 chop
913             #
914             sub Ehp15::chop(@) {
915              
916 0     0 0 0 my $chop;
917 0 0       0 if (@_ == 0) {
918 0         0 my @char = /\G (?>$q_char) /oxmsg;
919 0         0 $chop = pop @char;
920 0         0 $_ = join '', @char;
921             }
922             else {
923 0         0 for (@_) {
924 0         0 my @char = /\G (?>$q_char) /oxmsg;
925 0         0 $chop = pop @char;
926 0         0 $_ = join '', @char;
927             }
928             }
929 0         0 return $chop;
930             }
931              
932             #
933             # HP-15 index by octet
934             #
935             sub Ehp15::index($$;$) {
936              
937 0     2304 1 0 my($str,$substr,$position) = @_;
938 2304   50     5223 $position ||= 0;
939 2304         8619 my $pos = 0;
940              
941 2304         2875 while ($pos < CORE::length($str)) {
942 2304 50       5180 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
943 52332 0       75791 if ($pos >= $position) {
944 0         0 return $pos;
945             }
946             }
947 0 50       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
948 52332         137348 $pos += CORE::length($1);
949             }
950             else {
951 52332         90825 $pos += 1;
952             }
953             }
954 0         0 return -1;
955             }
956              
957             #
958             # HP-15 reverse index
959             #
960             sub Ehp15::rindex($$;$) {
961              
962 2304     0 0 23046 my($str,$substr,$position) = @_;
963 0   0     0 $position ||= CORE::length($str) - 1;
964 0         0 my $pos = 0;
965 0         0 my $rindex = -1;
966              
967 0   0     0 while (($pos < CORE::length($str)) and ($pos <= $position)) {
968 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
969 0         0 $rindex = $pos;
970             }
971 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
972 0         0 $pos += CORE::length($1);
973             }
974             else {
975 0         0 $pos += 1;
976             }
977             }
978 0         0 return $rindex;
979             }
980              
981             #
982             # HP-15 lower case first with parameter
983             #
984             sub Ehp15::lcfirst(@) {
985 0 0   0 0 0 if (@_) {
986 0         0 my $s = shift @_;
987 0 0 0     0 if (@_ and wantarray) {
988 0         0 return Ehp15::lc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
989             }
990             else {
991 0         0 return Ehp15::lc(CORE::substr($s,0,1)) . CORE::substr($s,1);
992             }
993             }
994             else {
995 0         0 return Ehp15::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
996             }
997             }
998              
999             #
1000             # HP-15 lower case first without parameter
1001             #
1002             sub Ehp15::lcfirst_() {
1003 0     0 0 0 return Ehp15::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
1004             }
1005              
1006             #
1007             # HP-15 lower case with parameter
1008             #
1009             sub Ehp15::lc(@) {
1010 0 0   0 0 0 if (@_) {
1011 0         0 my $s = shift @_;
1012 0 0 0     0 if (@_ and wantarray) {
1013 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
1014             }
1015             else {
1016 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  0         0  
1017             }
1018             }
1019             else {
1020 0         0 return Ehp15::lc_();
1021             }
1022             }
1023              
1024             #
1025             # HP-15 lower case without parameter
1026             #
1027             sub Ehp15::lc_() {
1028 0     0 0 0 my $s = $_;
1029 0 0       0 return join '', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
1030             }
1031              
1032             #
1033             # HP-15 upper case first with parameter
1034             #
1035             sub Ehp15::ucfirst(@) {
1036 0 0   0 0 0 if (@_) {
1037 0         0 my $s = shift @_;
1038 0 0 0     0 if (@_ and wantarray) {
1039 0         0 return Ehp15::uc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
1040             }
1041             else {
1042 0         0 return Ehp15::uc(CORE::substr($s,0,1)) . CORE::substr($s,1);
1043             }
1044             }
1045             else {
1046 0         0 return Ehp15::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
1047             }
1048             }
1049              
1050             #
1051             # HP-15 upper case first without parameter
1052             #
1053             sub Ehp15::ucfirst_() {
1054 0     0 0 0 return Ehp15::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
1055             }
1056              
1057             #
1058             # HP-15 upper case with parameter
1059             #
1060             sub Ehp15::uc(@) {
1061 0 50   3588 0 0 if (@_) {
1062 3588         4944 my $s = shift @_;
1063 3588 50 33     4194 if (@_ and wantarray) {
1064 3588 0       5833 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
1065             }
1066             else {
1067 0 100       0 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  3588         9856  
1068             }
1069             }
1070             else {
1071 3588         11798 return Ehp15::uc_();
1072             }
1073             }
1074              
1075             #
1076             # HP-15 upper case without parameter
1077             #
1078             sub Ehp15::uc_() {
1079 0     0 0 0 my $s = $_;
1080 0 0       0 return join '', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
1081             }
1082              
1083             #
1084             # HP-15 fold case with parameter
1085             #
1086             sub Ehp15::fc(@) {
1087 0 50   3891 0 0 if (@_) {
1088 3891         5281 my $s = shift @_;
1089 3891 50 33     4643 if (@_ and wantarray) {
1090 3891 0       6572 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
1091             }
1092             else {
1093 0 100       0 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  3891         8998  
1094             }
1095             }
1096             else {
1097 3891         14008 return Ehp15::fc_();
1098             }
1099             }
1100              
1101             #
1102             # HP-15 fold case without parameter
1103             #
1104             sub Ehp15::fc_() {
1105 0     0 0 0 my $s = $_;
1106 0 0       0 return join '', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
1107             }
1108              
1109             #
1110             # HP-15 regexp capture
1111             #
1112             {
1113             # 10.3. Creating Persistent Private Variables
1114             # in Chapter 10. Subroutines
1115             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
1116              
1117             my $last_s_matched = 0;
1118              
1119             sub Ehp15::capture {
1120 0 0 0 0 1 0 if ($last_s_matched and ($_[0] =~ /\A (?>[1-9][0-9]*) \z/oxms)) {
1121 0         0 return $_[0] + 1;
1122             }
1123 0         0 return $_[0];
1124             }
1125              
1126             # HP-15 mark last regexp matched
1127             sub Ehp15::matched() {
1128 0     0 0 0 $last_s_matched = 0;
1129             }
1130              
1131             # HP-15 mark last s/// matched
1132             sub Ehp15::s_matched() {
1133 0     0 0 0 $last_s_matched = 1;
1134             }
1135              
1136             # P.854 31.17. use re
1137             # in Chapter 31. Pragmatic Modules
1138             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1139              
1140             # P.1026 re
1141             # in Chapter 29. Pragmatic Modules
1142             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1143              
1144             $Ehp15::matched = qr/(?{Ehp15::matched})/;
1145             }
1146              
1147             #
1148             # HP-15 regexp ignore case modifier
1149             #
1150             sub Ehp15::ignorecase {
1151              
1152 0     0 0 0 my @string = @_;
1153 0         0 my $metachar = qr/[\@\\|[\]{]/oxms;
1154              
1155             # ignore case of $scalar or @array
1156 0         0 for my $string (@string) {
1157              
1158             # split regexp
1159 0         0 my @char = $string =~ /\G (?>\[\^|\\$q_char|$q_char) /oxmsg;
1160              
1161             # unescape character
1162 0         0 for (my $i=0; $i <= $#char; $i++) {
1163 0 0       0 next if not defined $char[$i];
1164              
1165             # open character class [...]
1166 0 0       0 if ($char[$i] eq '[') {
    0          
    0          
    0          
1167 0         0 my $left = $i;
1168              
1169             # [] make die "unmatched [] in regexp ...\n"
1170              
1171 0 0       0 if ($char[$i+1] eq ']') {
1172 0         0 $i++;
1173             }
1174              
1175 0         0 while (1) {
1176 0 0       0 if (++$i > $#char) {
1177 0         0 croak "Unmatched [] in regexp";
1178             }
1179 0 0       0 if ($char[$i] eq ']') {
1180 0         0 my $right = $i;
1181 0         0 my @charlist = charlist_qr(@char[$left+1..$right-1], 'i');
1182              
1183             # escape character
1184 0         0 for my $char (@charlist) {
1185 0 0       0 if (0) {
    0          
1186             }
1187              
1188             # do not use quotemeta here
1189 0         0 elsif ($char =~ /\A ([\x80-\xFF].*) ($metachar) \z/oxms) {
1190 0         0 $char = $1 . '\\' . $2;
1191             }
1192             elsif ($char =~ /\A [.|)] \z/oxms) {
1193 0         0 $char = '\\' . $char;
1194             }
1195             }
1196              
1197             # [...]
1198 0         0 splice @char, $left, $right-$left+1, '(?:' . join('|', @charlist) . ')';
1199              
1200 0         0 $i = $left;
1201 0         0 last;
1202             }
1203             }
1204             }
1205              
1206             # open character class [^...]
1207             elsif ($char[$i] eq '[^') {
1208 0         0 my $left = $i;
1209              
1210             # [^] make die "unmatched [] in regexp ...\n"
1211              
1212 0 0       0 if ($char[$i+1] eq ']') {
1213 0         0 $i++;
1214             }
1215              
1216 0         0 while (1) {
1217 0 0       0 if (++$i > $#char) {
1218 0         0 croak "Unmatched [] in regexp";
1219             }
1220 0 0       0 if ($char[$i] eq ']') {
1221 0         0 my $right = $i;
1222 0         0 my @charlist = charlist_not_qr(@char[$left+1..$right-1], 'i');
1223              
1224             # escape character
1225 0         0 for my $char (@charlist) {
1226 0 0       0 if (0) {
    0          
1227             }
1228              
1229             # do not use quotemeta here
1230 0         0 elsif ($char =~ /\A ([\x80-\xFF].*) ($metachar) \z/oxms) {
1231 0         0 $char = $1 . '\\' . $2;
1232             }
1233             elsif ($char =~ /\A [.|)] \z/oxms) {
1234 0         0 $char = '\\' . $char;
1235             }
1236             }
1237              
1238             # [^...]
1239 0         0 splice @char, $left, $right-$left+1, '(?!' . join('|', @charlist) . ")(?:$your_char)";
1240              
1241 0         0 $i = $left;
1242 0         0 last;
1243             }
1244             }
1245             }
1246              
1247             # rewrite classic character class or escape character
1248             elsif (my $char = classic_character_class($char[$i])) {
1249 0         0 $char[$i] = $char;
1250             }
1251              
1252             # with /i modifier
1253             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
1254 0         0 my $uc = Ehp15::uc($char[$i]);
1255 0         0 my $fc = Ehp15::fc($char[$i]);
1256 0 0       0 if ($uc ne $fc) {
1257 0 0       0 if (CORE::length($fc) == 1) {
1258 0         0 $char[$i] = '[' . $uc . $fc . ']';
1259             }
1260             else {
1261 0         0 $char[$i] = '(?:' . $uc . '|' . $fc . ')';
1262             }
1263             }
1264             }
1265             }
1266              
1267             # characterize
1268 0         0 for (my $i=0; $i <= $#char; $i++) {
1269 0 0       0 next if not defined $char[$i];
1270              
1271 0 0 0     0 if (0) {
    0          
1272             }
1273              
1274             # escape last octet of multiple-octet
1275 0         0 elsif ($char[$i] =~ /\A ([\x80-\xFF].*) ($metachar) \z/oxms) {
1276 0         0 $char[$i] = $1 . '\\' . $2;
1277             }
1278              
1279             # quote character before ? + * {
1280             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
1281 0 0       0 if ($char[$i-1] !~ /\A [\x00-\xFF] \z/oxms) {
1282 0         0 $char[$i-1] = '(?:' . $char[$i-1] . ')';
1283             }
1284             }
1285             }
1286              
1287 0         0 $string = join '', @char;
1288             }
1289              
1290             # make regexp string
1291 0         0 return @string;
1292             }
1293              
1294             #
1295             # classic character class ( \D \S \W \d \s \w \C \X \H \V \h \v \R \N \b \B )
1296             #
1297             sub Ehp15::classic_character_class {
1298 0     5227 0 0 my($char) = @_;
1299              
1300             return {
1301             '\D' => '${Ehp15::eD}',
1302             '\S' => '${Ehp15::eS}',
1303             '\W' => '${Ehp15::eW}',
1304             '\d' => '[0-9]',
1305              
1306             # Before Perl 5.6, \s only matched the five whitespace characters
1307             # tab, newline, form-feed, carriage return, and the space character
1308             # itself, which, taken together, is the character class [\t\n\f\r ].
1309              
1310             # Vertical tabs are now whitespace
1311             # \s in a regex now matches a vertical tab in all circumstances.
1312             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1313             # \t \n \v \f \r space
1314             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
1315             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
1316             '\s' => '\s',
1317              
1318             '\w' => '[0-9A-Z_a-z]',
1319             '\C' => '[\x00-\xFF]',
1320             '\X' => 'X',
1321              
1322             # \h \v \H \V
1323              
1324             # P.114 Character Class Shortcuts
1325             # in Chapter 7: In the World of Regular Expressions
1326             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
1327              
1328             # P.357 13.2.3 Whitespace
1329             # in Chapter 13: perlrecharclass: Perl Regular Expression Character Classes
1330             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
1331             #
1332             # 0x00009 CHARACTER TABULATION h s
1333             # 0x0000a LINE FEED (LF) vs
1334             # 0x0000b LINE TABULATION v
1335             # 0x0000c FORM FEED (FF) vs
1336             # 0x0000d CARRIAGE RETURN (CR) vs
1337             # 0x00020 SPACE h s
1338              
1339             # P.196 Table 5-9. Alphanumeric regex metasymbols
1340             # in Chapter 5. Pattern Matching
1341             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1342              
1343             # (and so on)
1344              
1345             '\H' => '${Ehp15::eH}',
1346             '\V' => '${Ehp15::eV}',
1347             '\h' => '[\x09\x20]',
1348             '\v' => '[\x0A\x0B\x0C\x0D]',
1349             '\R' => '${Ehp15::eR}',
1350              
1351             # \N
1352             #
1353             # http://perldoc.perl.org/perlre.html
1354             # Character Classes and other Special Escapes
1355             # Any character but \n (experimental). Not affected by /s modifier
1356              
1357             '\N' => '${Ehp15::eN}',
1358              
1359             # \b \B
1360              
1361             # P.180 Boundaries: The \b and \B Assertions
1362             # in Chapter 5: Pattern Matching
1363             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1364              
1365             # P.219 Boundaries: The \b and \B Assertions
1366             # in Chapter 5: Pattern Matching
1367             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1368              
1369             # \b really means (?:(?<=\w)(?!\w)|(?
1370             # or (?:(?<=\A|\W)(?=\w)|(?<=\w)(?=\W|\z))
1371             '\b' => '${Ehp15::eb}',
1372              
1373             # \B really means (?:(?<=\w)(?=\w)|(?
1374             # or (?:(?<=\w)(?=\w)|(?<=\W)(?=\W))
1375             '\B' => '${Ehp15::eB}',
1376              
1377 5227   100     8564 }->{$char} || '';
1378             }
1379              
1380             #
1381             # prepare HP-15 characters per length
1382             #
1383              
1384             # 1 octet characters
1385             my @chars1 = ();
1386             sub chars1 {
1387 5227 0   0 0 194499 if (@chars1) {
1388 0         0 return @chars1;
1389             }
1390 0 0       0 if (exists $range_tr{1}) {
1391 0         0 my @ranges = @{ $range_tr{1} };
  0         0  
1392 0         0 while (my @range = splice(@ranges,0,1)) {
1393 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1394 0         0 push @chars1, pack 'C', $oct0;
1395             }
1396             }
1397             }
1398 0         0 return @chars1;
1399             }
1400              
1401             # 2 octets characters
1402             my @chars2 = ();
1403             sub chars2 {
1404 0 0   0 0 0 if (@chars2) {
1405 0         0 return @chars2;
1406             }
1407 0 0       0 if (exists $range_tr{2}) {
1408 0         0 my @ranges = @{ $range_tr{2} };
  0         0  
1409 0         0 while (my @range = splice(@ranges,0,2)) {
1410 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1411 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1412 0         0 push @chars2, pack 'CC', $oct0,$oct1;
1413             }
1414             }
1415             }
1416             }
1417 0         0 return @chars2;
1418             }
1419              
1420             # 3 octets characters
1421             my @chars3 = ();
1422             sub chars3 {
1423 0 0   0 0 0 if (@chars3) {
1424 0         0 return @chars3;
1425             }
1426 0 0       0 if (exists $range_tr{3}) {
1427 0         0 my @ranges = @{ $range_tr{3} };
  0         0  
1428 0         0 while (my @range = splice(@ranges,0,3)) {
1429 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1430 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1431 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
1432 0         0 push @chars3, pack 'CCC', $oct0,$oct1,$oct2;
1433             }
1434             }
1435             }
1436             }
1437             }
1438 0         0 return @chars3;
1439             }
1440              
1441             # 4 octets characters
1442             my @chars4 = ();
1443             sub chars4 {
1444 0 0   0 0 0 if (@chars4) {
1445 0         0 return @chars4;
1446             }
1447 0 0       0 if (exists $range_tr{4}) {
1448 0         0 my @ranges = @{ $range_tr{4} };
  0         0  
1449 0         0 while (my @range = splice(@ranges,0,4)) {
1450 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1451 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1452 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
1453 0         0 for my $oct3 (@{$range[3]}) {
  0         0  
1454 0         0 push @chars4, pack 'CCCC', $oct0,$oct1,$oct2,$oct3;
1455             }
1456             }
1457             }
1458             }
1459             }
1460             }
1461 0         0 return @chars4;
1462             }
1463              
1464             #
1465             # HP-15 open character list for tr
1466             #
1467             sub _charlist_tr {
1468              
1469 0     0   0 local $_ = shift @_;
1470              
1471             # unescape character
1472 0         0 my @char = ();
1473 0         0 while (not /\G \z/oxmsgc) {
1474 0 0       0 if (/\G (\\0?55|\\x2[Dd]|\\-) /oxmsgc) {
    0          
    0          
    0          
    0          
    0          
    0          
1475 0         0 push @char, '\-';
1476             }
1477             elsif (/\G \\ ([0-7]{2,3}) /oxmsgc) {
1478 0         0 push @char, CORE::chr(oct $1);
1479             }
1480             elsif (/\G \\x ([0-9A-Fa-f]{1,2}) /oxmsgc) {
1481 0         0 push @char, CORE::chr(hex $1);
1482             }
1483             elsif (/\G \\c ([\x40-\x5F]) /oxmsgc) {
1484 0         0 push @char, CORE::chr(CORE::ord($1) & 0x1F);
1485             }
1486             elsif (/\G (\\ [0nrtfbae]) /oxmsgc) {
1487             push @char, {
1488             '\0' => "\0",
1489             '\n' => "\n",
1490             '\r' => "\r",
1491             '\t' => "\t",
1492             '\f' => "\f",
1493             '\b' => "\x08", # \b means backspace in character class
1494             '\a' => "\a",
1495             '\e' => "\e",
1496 0         0 }->{$1};
1497             }
1498             elsif (/\G \\ ($q_char) /oxmsgc) {
1499 0         0 push @char, $1;
1500             }
1501             elsif (/\G ($q_char) /oxmsgc) {
1502 0         0 push @char, $1;
1503             }
1504             }
1505              
1506             # join separated multiple-octet
1507 0         0 @char = join('',@char) =~ /\G (?>\\-|$q_char) /oxmsg;
1508              
1509             # unescape '-'
1510 0         0 my @i = ();
1511 0         0 for my $i (0 .. $#char) {
1512 0 0       0 if ($char[$i] eq '\-') {
    0          
1513 0         0 $char[$i] = '-';
1514             }
1515             elsif ($char[$i] eq '-') {
1516 0 0 0     0 if ((0 < $i) and ($i < $#char)) {
1517 0         0 push @i, $i;
1518             }
1519             }
1520             }
1521              
1522             # open character list (reverse for splice)
1523 0         0 for my $i (CORE::reverse @i) {
1524 0         0 my @range = ();
1525              
1526             # range error
1527 0 0 0     0 if ((CORE::length($char[$i-1]) > CORE::length($char[$i+1])) or ($char[$i-1] gt $char[$i+1])) {
1528 0         0 croak "Invalid tr/// range \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1529             }
1530              
1531             # range of multiple-octet code
1532 0 0       0 if (CORE::length($char[$i-1]) == 1) {
    0          
    0          
    0          
1533 0 0       0 if (CORE::length($char[$i+1]) == 1) {
    0          
    0          
    0          
1534 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars1();
  0         0  
1535             }
1536             elsif (CORE::length($char[$i+1]) == 2) {
1537 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1538 0         0 push @range, grep {$_ le $char[$i+1]} chars2();
  0         0  
1539             }
1540             elsif (CORE::length($char[$i+1]) == 3) {
1541 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1542 0         0 push @range, chars2();
1543 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
1544             }
1545             elsif (CORE::length($char[$i+1]) == 4) {
1546 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1547 0         0 push @range, chars2();
1548 0         0 push @range, chars3();
1549 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1550             }
1551             else {
1552 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1553             }
1554             }
1555             elsif (CORE::length($char[$i-1]) == 2) {
1556 0 0       0 if (CORE::length($char[$i+1]) == 2) {
    0          
    0          
1557 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars2();
  0         0  
1558             }
1559             elsif (CORE::length($char[$i+1]) == 3) {
1560 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
1561 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
1562             }
1563             elsif (CORE::length($char[$i+1]) == 4) {
1564 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
1565 0         0 push @range, chars3();
1566 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1567             }
1568             else {
1569 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1570             }
1571             }
1572             elsif (CORE::length($char[$i-1]) == 3) {
1573 0 0       0 if (CORE::length($char[$i+1]) == 3) {
    0          
1574 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars3();
  0         0  
1575             }
1576             elsif (CORE::length($char[$i+1]) == 4) {
1577 0         0 push @range, grep {$char[$i-1] le $_} chars3();
  0         0  
1578 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1579             }
1580             else {
1581 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1582             }
1583             }
1584             elsif (CORE::length($char[$i-1]) == 4) {
1585 0 0       0 if (CORE::length($char[$i+1]) == 4) {
1586 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars4();
  0         0  
1587             }
1588             else {
1589 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1590             }
1591             }
1592             else {
1593 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1594             }
1595              
1596 0         0 splice @char, $i-1, 3, @range;
1597             }
1598              
1599 0         0 return @char;
1600             }
1601              
1602             #
1603             # HP-15 open character class
1604             #
1605             sub _cc {
1606 0 50   684   0 if (scalar(@_) == 0) {
    100          
    50          
1607 684         1352 die __FILE__, ": subroutine cc got no parameter.\n";
1608             }
1609             elsif (scalar(@_) == 1) {
1610 0         0 return sprintf('\x%02X',$_[0]);
1611             }
1612             elsif (scalar(@_) == 2) {
1613 302 50       922 if ($_[0] > $_[1]) {
    100          
    50          
1614 382         750 die __FILE__, ": subroutine cc got \$_[0] > \$_[1] parameters).\n";
1615             }
1616             elsif ($_[0] == $_[1]) {
1617 0         0 return sprintf('\x%02X',$_[0]);
1618             }
1619             elsif (($_[0]+1) == $_[1]) {
1620 40         89 return sprintf('[\\x%02X\\x%02X]',$_[0],$_[1]);
1621             }
1622             else {
1623 0         0 return sprintf('[\\x%02X-\\x%02X]',$_[0],$_[1]);
1624             }
1625             }
1626             else {
1627 342         1595 die __FILE__, ": subroutine cc got 3 or more parameters (@{[scalar(@_)]} parameters).\n";
  0         0  
1628             }
1629             }
1630              
1631             #
1632             # HP-15 octet range
1633             #
1634             sub _octets {
1635 0     688   0 my $length = shift @_;
1636              
1637 688 100       1171 if ($length == 1) {
    50          
    0          
    0          
1638 688         1345 my($a1) = unpack 'C', $_[0];
1639 426         1295 my($z1) = unpack 'C', $_[1];
1640              
1641 426 50       724 if ($a1 > $z1) {
1642 426         784 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$a1) . '-\x' . unpack('H*',$z1);
1643             }
1644              
1645 0 100       0 if ($a1 == $z1) {
    50          
1646 426         978 return sprintf('\x%02X',$a1);
1647             }
1648             elsif (($a1+1) == $z1) {
1649 20         80 return sprintf('\x%02X\x%02X',$a1,$z1);
1650             }
1651             else {
1652 0         0 return sprintf('\x%02X-\x%02X',$a1,$z1);
1653             }
1654             }
1655             elsif ($length == 2) {
1656 406         2325 my($a1,$a2) = unpack 'CC', $_[0];
1657 262         578 my($z1,$z2) = unpack 'CC', $_[1];
1658 262         450 my($A1,$A2) = unpack 'CC', $_[2];
1659 262         372 my($Z1,$Z2) = unpack 'CC', $_[3];
1660              
1661 262 100       363 if ($a1 == $z1) {
    50          
1662             return (
1663             # 11111111 222222222222
1664             # A A Z
1665 262         392 _cc($a1) . _cc($a2,$z2), # a2-z2
1666             );
1667             }
1668             elsif (($a1+1) == $z1) {
1669             return (
1670             # 11111111111 222222222222
1671             # A Z A Z
1672 222         321 _cc($a1) . _cc($a2,$Z2), # a2-
1673             _cc( $z1) . _cc($A2,$z2), # -z2
1674             );
1675             }
1676             else {
1677             return (
1678             # 1111111111111111 222222222222
1679             # A Z A Z
1680 0         0 _cc($a1) . _cc($a2,$Z2), # a2-
1681             _cc($a1+1,$z1-1) . _cc($A2,$Z2), # -
1682             _cc( $z1) . _cc($A2,$z2), # -z2
1683             );
1684             }
1685             }
1686             elsif ($length == 3) {
1687 40         65 my($a1,$a2,$a3) = unpack 'CCC', $_[0];
1688 0         0 my($z1,$z2,$z3) = unpack 'CCC', $_[1];
1689 0         0 my($A1,$A2,$A3) = unpack 'CCC', $_[2];
1690 0         0 my($Z1,$Z2,$Z3) = unpack 'CCC', $_[3];
1691              
1692 0 0       0 if ($a1 == $z1) {
    0          
1693 0 0       0 if ($a2 == $z2) {
    0          
1694             return (
1695             # 11111111 22222222 333333333333
1696             # A A A Z
1697 0         0 _cc($a1) . _cc($a2) . _cc($a3,$z3), # a3-z3
1698             );
1699             }
1700             elsif (($a2+1) == $z2) {
1701             return (
1702             # 11111111 22222222222 333333333333
1703             # A A Z A Z
1704 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1705             _cc($a1) . _cc( $z2) . _cc($A3,$z3), # -z3
1706             );
1707             }
1708             else {
1709             return (
1710             # 11111111 2222222222222222 333333333333
1711             # A A Z A Z
1712 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1713             _cc($a1) . _cc($a2+1,$z2-1) . _cc($A3,$Z3), # -
1714             _cc($a1) . _cc( $z2) . _cc($A3,$z3), # -z3
1715             );
1716             }
1717             }
1718             elsif (($a1+1) == $z1) {
1719             return (
1720             # 11111111111 22222222222222 333333333333
1721             # A Z A Z A Z
1722 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1723             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3), # -
1724             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3), # -
1725             _cc( $z1) . _cc( $z2) . _cc($A3,$z3), # -z3
1726             );
1727             }
1728             else {
1729             return (
1730             # 1111111111111111 22222222222222 333333333333
1731             # A Z A Z A Z
1732 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1733             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3), # -
1734             _cc($a1+1,$z1-1) . _cc($A2,$Z2) . _cc($A3,$Z3), # -
1735             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3), # -
1736             _cc( $z1) . _cc( $z2) . _cc($A3,$z3), # -z3
1737             );
1738             }
1739             }
1740             elsif ($length == 4) {
1741 0         0 my($a1,$a2,$a3,$a4) = unpack 'CCCC', $_[0];
1742 0         0 my($z1,$z2,$z3,$z4) = unpack 'CCCC', $_[1];
1743 0         0 my($A1,$A2,$A3,$A4) = unpack 'CCCC', $_[0];
1744 0         0 my($Z1,$Z2,$Z3,$Z4) = unpack 'CCCC', $_[1];
1745              
1746 0 0       0 if ($a1 == $z1) {
    0          
1747 0 0       0 if ($a2 == $z2) {
    0          
1748 0 0       0 if ($a3 == $z3) {
    0          
1749             return (
1750             # 11111111 22222222 33333333 444444444444
1751             # A A A A Z
1752 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$z4), # a4-z4
1753             );
1754             }
1755             elsif (($a3+1) == $z3) {
1756             return (
1757             # 11111111 22222222 33333333333 444444444444
1758             # A A A Z A Z
1759 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1760             _cc($a1) . _cc($a2) . _cc( $z3) . _cc($A4,$z4), # -z4
1761             );
1762             }
1763             else {
1764             return (
1765             # 11111111 22222222 3333333333333333 444444444444
1766             # A A A Z A Z
1767 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1768             _cc($a1) . _cc($a2) . _cc($a3+1,$z3-1) . _cc($A4,$Z4), # -
1769             _cc($a1) . _cc($a2) . _cc( $z3) . _cc($A4,$z4), # -z4
1770             );
1771             }
1772             }
1773             elsif (($a2+1) == $z2) {
1774             return (
1775             # 11111111 22222222222 33333333333333 444444444444
1776             # A A Z A Z A Z
1777 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1778             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1779             _cc($a1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1780             _cc($a1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1781             );
1782             }
1783             else {
1784             return (
1785             # 11111111 2222222222222222 33333333333333 444444444444
1786             # A A Z A Z A Z
1787 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1788             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1789             _cc($a1) . _cc($a2+1,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1790             _cc($a1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1791             _cc($a1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1792             );
1793             }
1794             }
1795             elsif (($a1+1) == $z1) {
1796             return (
1797             # 11111111111 22222222222222 33333333333333 444444444444
1798             # A Z A Z A Z A Z
1799 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1800             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1801             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1802             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1803             _cc( $z1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1804             _cc( $z1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1805             );
1806             }
1807             else {
1808             return (
1809             # 1111111111111111 22222222222222 33333333333333 444444444444
1810             # A Z A Z A Z A Z
1811 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1812             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1813             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1814             _cc($a1+1,$z1-1) . _cc($A2,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1815             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1816             _cc( $z1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1817             _cc( $z1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1818             );
1819             }
1820             }
1821             else {
1822 0         0 die __FILE__, ": subroutine _octets got invalid length ($length).\n";
1823             }
1824             }
1825              
1826             #
1827             # HP-15 range regexp
1828             #
1829             sub _range_regexp {
1830 0     517   0 my($length,$first,$last) = @_;
1831              
1832 517         1060 my @range_regexp = ();
1833 517 50       677 if (not exists $range_tr{$length}) {
1834 517         1218 return @range_regexp;
1835             }
1836              
1837 0         0 my @ranges = @{ $range_tr{$length} };
  517         702  
1838 517         1179 while (my @range = splice(@ranges,0,$length)) {
1839 517         1666 my $min = '';
1840 1682         2194 my $max = '';
1841 1682         1769 for (my $i=0; $i < $length; $i++) {
1842 1682         2797 $min .= pack 'C', $range[$i][0];
1843 2206         4156 $max .= pack 'C', $range[$i][-1];
1844             }
1845              
1846             # min___max
1847             # FIRST_____________LAST
1848             # (nothing)
1849              
1850 2206 50 66     4307 if ($max lt $first) {
    100 100        
    50 33        
    100 100        
    100 66        
    100 66        
    50 66        
1851             }
1852              
1853             # **********
1854             # min_________max
1855             # FIRST_____________LAST
1856             # **********
1857              
1858             elsif (($min le $first) and ($first le $max) and ($max le $last)) {
1859 1682         13252 push @range_regexp, _octets($length,$first,$max,$min,$max);
1860             }
1861              
1862             # **********************
1863             # min________________max
1864             # FIRST_____________LAST
1865             # **********************
1866              
1867             elsif (($min eq $first) and ($max eq $last)) {
1868 28         72 push @range_regexp, _octets($length,$first,$last,$min,$max);
1869             }
1870              
1871             # *********
1872             # min___max
1873             # FIRST_____________LAST
1874             # *********
1875              
1876             elsif (($first le $min) and ($max le $last)) {
1877 0         0 push @range_regexp, _octets($length,$min,$max,$min,$max);
1878             }
1879              
1880             # **********************
1881             # min__________________________max
1882             # FIRST_____________LAST
1883             # **********************
1884              
1885             elsif (($min le $first) and ($last le $max)) {
1886 40         68 push @range_regexp, _octets($length,$first,$last,$min,$max);
1887             }
1888              
1889             # *********
1890             # min________max
1891             # FIRST_____________LAST
1892             # *********
1893              
1894             elsif (($first le $min) and ($min le $last) and ($last le $max)) {
1895 580         1245 push @range_regexp, _octets($length,$min,$last,$min,$max);
1896             }
1897              
1898             # min___max
1899             # FIRST_____________LAST
1900             # (nothing)
1901              
1902             elsif ($last lt $min) {
1903             }
1904              
1905             else {
1906 40         69 die __FILE__, ": subroutine _range_regexp panic.\n";
1907             }
1908             }
1909              
1910 0         0 return @range_regexp;
1911             }
1912              
1913             #
1914             # HP-15 open character list for qr and not qr
1915             #
1916             sub _charlist {
1917              
1918 517     758   1152 my $modifier = pop @_;
1919 758         1593 my @char = @_;
1920              
1921 758 100       1617 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
1922              
1923             # unescape character
1924 758         1773 for (my $i=0; $i <= $#char; $i++) {
1925              
1926             # escape - to ...
1927 758 100 100     2393 if ($char[$i] eq '-') {
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
1928 2648 100 100     17811 if ((0 < $i) and ($i < $#char)) {
1929 522         1995 $char[$i] = '...';
1930             }
1931             }
1932              
1933             # octal escape sequence
1934             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
1935 497         1068 $char[$i] = octchr($1);
1936             }
1937              
1938             # hexadecimal escape sequence
1939             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
1940 0         0 $char[$i] = hexchr($1);
1941             }
1942              
1943             # \b{...} --> b\{...}
1944             # \B{...} --> B\{...}
1945             # \N{CHARNAME} --> N\{CHARNAME}
1946             # \p{PROPERTY} --> p\{PROPERTY}
1947             # \P{PROPERTY} --> P\{PROPERTY}
1948             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x80-\xA0\xE0-\xFE0-9\}][^\x80-\xA0\xE0-\xFE\}]*) \} ) \z/oxms) {
1949 0         0 $char[$i] = $1 . '\\' . $2;
1950             }
1951              
1952             # \p, \P, \X --> p, P, X
1953             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
1954 0         0 $char[$i] = $1;
1955             }
1956              
1957             elsif ($char[$i] =~ /\A \\ ([0-7]{2,3}) \z/oxms) {
1958 0         0 $char[$i] = CORE::chr oct $1;
1959             }
1960             elsif ($char[$i] =~ /\A \\x ([0-9A-Fa-f]{1,2}) \z/oxms) {
1961 0         0 $char[$i] = CORE::chr hex $1;
1962             }
1963             elsif ($char[$i] =~ /\A \\c ([\x40-\x5F]) \z/oxms) {
1964 206         742 $char[$i] = CORE::chr(CORE::ord($1) & 0x1F);
1965             }
1966             elsif ($char[$i] =~ /\A (\\ [0nrtfbaedswDSWHVhvR]) \z/oxms) {
1967             $char[$i] = {
1968             '\0' => "\0",
1969             '\n' => "\n",
1970             '\r' => "\r",
1971             '\t' => "\t",
1972             '\f' => "\f",
1973             '\b' => "\x08", # \b means backspace in character class
1974             '\a' => "\a",
1975             '\e' => "\e",
1976             '\d' => '[0-9]',
1977              
1978             # Vertical tabs are now whitespace
1979             # \s in a regex now matches a vertical tab in all circumstances.
1980             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1981             # \t \n \v \f \r space
1982             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
1983             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
1984             '\s' => '\s',
1985              
1986             '\w' => '[0-9A-Z_a-z]',
1987             '\D' => '${Ehp15::eD}',
1988             '\S' => '${Ehp15::eS}',
1989             '\W' => '${Ehp15::eW}',
1990              
1991             '\H' => '${Ehp15::eH}',
1992             '\V' => '${Ehp15::eV}',
1993             '\h' => '[\x09\x20]',
1994             '\v' => '[\x0A\x0B\x0C\x0D]',
1995             '\R' => '${Ehp15::eR}',
1996              
1997 0         0 }->{$1};
1998             }
1999              
2000             # POSIX-style character classes
2001             elsif ($ignorecase and ($char[$i] =~ /\A ( \[\: \^? (?:lower|upper) :\] ) \z/oxms)) {
2002             $char[$i] = {
2003              
2004             '[:lower:]' => '[\x41-\x5A\x61-\x7A]',
2005             '[:upper:]' => '[\x41-\x5A\x61-\x7A]',
2006             '[:^lower:]' => '${Ehp15::not_lower_i}',
2007             '[:^upper:]' => '${Ehp15::not_upper_i}',
2008              
2009 33         497 }->{$1};
2010             }
2011             elsif ($char[$i] =~ /\A ( \[\: \^? (?:alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print|punct|space|upper|word|xdigit) :\] ) \z/oxms) {
2012             $char[$i] = {
2013              
2014             '[:alnum:]' => '[\x30-\x39\x41-\x5A\x61-\x7A]',
2015             '[:alpha:]' => '[\x41-\x5A\x61-\x7A]',
2016             '[:ascii:]' => '[\x00-\x7F]',
2017             '[:blank:]' => '[\x09\x20]',
2018             '[:cntrl:]' => '[\x00-\x1F\x7F]',
2019             '[:digit:]' => '[\x30-\x39]',
2020             '[:graph:]' => '[\x21-\x7F]',
2021             '[:lower:]' => '[\x61-\x7A]',
2022             '[:print:]' => '[\x20-\x7F]',
2023             '[:punct:]' => '[\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]',
2024              
2025             # P.174 POSIX-Style Character Classes
2026             # in Chapter 5: Pattern Matching
2027             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2028              
2029             # P.311 11.2.4 Character Classes and other Special Escapes
2030             # in Chapter 11: perlre: Perl regular expressions
2031             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
2032              
2033             # P.210 POSIX-Style Character Classes
2034             # in Chapter 5: Pattern Matching
2035             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2036              
2037             '[:space:]' => '[\s\x0B]', # "\s" plus vertical tab ("\cK")
2038              
2039             '[:upper:]' => '[\x41-\x5A]',
2040             '[:word:]' => '[\x30-\x39\x41-\x5A\x5F\x61-\x7A]',
2041             '[:xdigit:]' => '[\x30-\x39\x41-\x46\x61-\x66]',
2042             '[:^alnum:]' => '${Ehp15::not_alnum}',
2043             '[:^alpha:]' => '${Ehp15::not_alpha}',
2044             '[:^ascii:]' => '${Ehp15::not_ascii}',
2045             '[:^blank:]' => '${Ehp15::not_blank}',
2046             '[:^cntrl:]' => '${Ehp15::not_cntrl}',
2047             '[:^digit:]' => '${Ehp15::not_digit}',
2048             '[:^graph:]' => '${Ehp15::not_graph}',
2049             '[:^lower:]' => '${Ehp15::not_lower}',
2050             '[:^print:]' => '${Ehp15::not_print}',
2051             '[:^punct:]' => '${Ehp15::not_punct}',
2052             '[:^space:]' => '${Ehp15::not_space}',
2053             '[:^upper:]' => '${Ehp15::not_upper}',
2054             '[:^word:]' => '${Ehp15::not_word}',
2055             '[:^xdigit:]' => '${Ehp15::not_xdigit}',
2056              
2057 8         71 }->{$1};
2058             }
2059             elsif ($char[$i] =~ /\A \\ ($q_char) \z/oxms) {
2060 70         1561 $char[$i] = $1;
2061             }
2062             }
2063              
2064             # open character list
2065 7         34 my @singleoctet = ();
2066 758         1296 my @multipleoctet = ();
2067 758         1012 for (my $i=0; $i <= $#char; ) {
2068              
2069             # escaped -
2070 758 100 100     1726 if (defined($char[$i+1]) and ($char[$i+1] eq '...')) {
    100          
    100          
    50          
    50          
    100          
2071 2151         9424 $i += 1;
2072 497         677 next;
2073             }
2074              
2075             # make range regexp
2076             elsif ($char[$i] eq '...') {
2077              
2078             # range error
2079 497 50       922 if (CORE::length($char[$i-1]) > CORE::length($char[$i+1])) {
    100          
2080 497         1668 croak 'Invalid [] range in regexp (length(A) > length(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
2081             }
2082             elsif (CORE::length($char[$i-1]) == CORE::length($char[$i+1])) {
2083 0 50       0 if ($char[$i-1] gt $char[$i+1]) {
2084 477         1183 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
2085             }
2086             }
2087              
2088             # make range regexp per length
2089 0         0 for my $length (CORE::length($char[$i-1]) .. CORE::length($char[$i+1])) {
2090 497         1290 my @regexp = ();
2091              
2092             # is first and last
2093 517 100 100     722 if (($length == CORE::length($char[$i-1])) and ($length == CORE::length($char[$i+1]))) {
    100 33        
    50          
    50          
2094 517         1921 push @regexp, _range_regexp($length, $char[$i-1], $char[$i+1]);
2095             }
2096              
2097             # is first
2098             elsif ($length == CORE::length($char[$i-1])) {
2099 477         1278 push @regexp, _range_regexp($length, $char[$i-1], "\xFF" x $length);
2100             }
2101              
2102             # is inside in first and last
2103             elsif ((CORE::length($char[$i-1]) < $length) and ($length < CORE::length($char[$i+1]))) {
2104 20         67 push @regexp, _range_regexp($length, "\x00" x $length, "\xFF" x $length);
2105             }
2106              
2107             # is last
2108             elsif ($length == CORE::length($char[$i+1])) {
2109 0         0 push @regexp, _range_regexp($length, "\x00" x $length, $char[$i+1]);
2110             }
2111              
2112             else {
2113 20         83 die __FILE__, ": subroutine make_regexp panic.\n";
2114             }
2115              
2116 0 100       0 if ($length == 1) {
2117 517         1025 push @singleoctet, @regexp;
2118             }
2119             else {
2120 386         856 push @multipleoctet, @regexp;
2121             }
2122             }
2123              
2124 131         317 $i += 2;
2125             }
2126              
2127             # with /i modifier
2128             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
2129 497 100       975 if ($modifier =~ /i/oxms) {
2130 764         1199 my $uc = Ehp15::uc($char[$i]);
2131 192         313 my $fc = Ehp15::fc($char[$i]);
2132 192 50       321 if ($uc ne $fc) {
2133 192 50       305 if (CORE::length($fc) == 1) {
2134 192         269 push @singleoctet, $uc, $fc;
2135             }
2136             else {
2137 192         348 push @singleoctet, $uc;
2138 0         0 push @multipleoctet, $fc;
2139             }
2140             }
2141             else {
2142 0         0 push @singleoctet, $char[$i];
2143             }
2144             }
2145             else {
2146 0         0 push @singleoctet, $char[$i];
2147             }
2148 572         950 $i += 1;
2149             }
2150              
2151             # single character of single octet code
2152             elsif ($char[$i] =~ /\A (?: \\h ) \z/oxms) {
2153 764         1298 push @singleoctet, "\t", "\x20";
2154 0         0 $i += 1;
2155             }
2156             elsif ($char[$i] =~ /\A (?: \\v ) \z/oxms) {
2157 0         0 push @singleoctet, "\x0A", "\x0B", "\x0C", "\x0D";
2158 0         0 $i += 1;
2159             }
2160             elsif ($char[$i] =~ /\A (?: \\d | \\s | \\w ) \z/oxms) {
2161 0         0 push @singleoctet, $char[$i];
2162 2         6 $i += 1;
2163             }
2164              
2165             # single character of multiple-octet code
2166             else {
2167 2         6 push @multipleoctet, $char[$i];
2168 391         689 $i += 1;
2169             }
2170             }
2171              
2172             # quote metachar
2173 391         997 for (@singleoctet) {
2174 758 50       1437 if ($_ eq '...') {
    100          
    100          
    100          
    100          
2175 1384         5631 $_ = '-';
2176             }
2177             elsif (/\A \n \z/oxms) {
2178 0         0 $_ = '\n';
2179             }
2180             elsif (/\A \r \z/oxms) {
2181 8         17 $_ = '\r';
2182             }
2183             elsif (/\A ([\x00-\x20\x7F-\xFF]) \z/oxms) {
2184 8         16 $_ = sprintf('\x%02X', CORE::ord $1);
2185             }
2186             elsif (/\A [\x00-\xFF] \z/oxms) {
2187 1         5 $_ = quotemeta $_;
2188             }
2189             }
2190 939         1392 for (@multipleoctet) {
2191 758 100       1322 if (/\A ([\x80-\xFF].*) ([\x00-\xFF]) \z/oxms) {
2192 733         1749 $_ = $1 . quotemeta $2;
2193             }
2194             }
2195              
2196             # return character list
2197 307         683 return \@singleoctet, \@multipleoctet;
2198             }
2199              
2200             #
2201             # HP-15 octal escape sequence
2202             #
2203             sub octchr {
2204 758     5 0 2832 my($octdigit) = @_;
2205              
2206 5         17 my @binary = ();
2207 5         10 for my $octal (split(//,$octdigit)) {
2208             push @binary, {
2209             '0' => '000',
2210             '1' => '001',
2211             '2' => '010',
2212             '3' => '011',
2213             '4' => '100',
2214             '5' => '101',
2215             '6' => '110',
2216             '7' => '111',
2217 5         24 }->{$octal};
2218             }
2219 50         181 my $binary = join '', @binary;
2220              
2221             my $octchr = {
2222             # 1234567
2223             1 => pack('B*', "0000000$binary"),
2224             2 => pack('B*', "000000$binary"),
2225             3 => pack('B*', "00000$binary"),
2226             4 => pack('B*', "0000$binary"),
2227             5 => pack('B*', "000$binary"),
2228             6 => pack('B*', "00$binary"),
2229             7 => pack('B*', "0$binary"),
2230             0 => pack('B*', "$binary"),
2231              
2232 5         16 }->{CORE::length($binary) % 8};
2233              
2234 5         77 return $octchr;
2235             }
2236              
2237             #
2238             # HP-15 hexadecimal escape sequence
2239             #
2240             sub hexchr {
2241 5     5 0 20 my($hexdigit) = @_;
2242              
2243             my $hexchr = {
2244             1 => pack('H*', "0$hexdigit"),
2245             0 => pack('H*', "$hexdigit"),
2246              
2247 5         14 }->{CORE::length($_[0]) % 2};
2248              
2249 5         37 return $hexchr;
2250             }
2251              
2252             #
2253             # HP-15 open character list for qr
2254             #
2255             sub charlist_qr {
2256              
2257 5     519 0 19 my $modifier = pop @_;
2258 519         956 my @char = @_;
2259              
2260 519         1315 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
2261 519         1681 my @singleoctet = @$singleoctet;
2262 519         1124 my @multipleoctet = @$multipleoctet;
2263              
2264             # return character list
2265 519 100       816 if (scalar(@singleoctet) >= 1) {
2266              
2267             # with /i modifier
2268 519 100       1277 if ($modifier =~ m/i/oxms) {
2269 384         834 my %singleoctet_ignorecase = ();
2270 107         154 for (@singleoctet) {
2271 107   100     161 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
2272 277         895 for my $ord (hex($1) .. hex($2)) {
2273 85         288 my $char = CORE::chr($ord);
2274 1356         1703 my $uc = Ehp15::uc($char);
2275 1356         1616 my $fc = Ehp15::fc($char);
2276 1356 100       1899 if ($uc eq $fc) {
2277 1356         1919 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
2278             }
2279             else {
2280 767 50       1687 if (CORE::length($fc) == 1) {
2281 589         787 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2282 589         1143 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
2283             }
2284             else {
2285 589         1375 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2286 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
2287             }
2288             }
2289             }
2290             }
2291 0 100       0 if ($_ ne '') {
2292 277         448 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
2293             }
2294             }
2295 192         421 my $i = 0;
2296 107         125 my @singleoctet_ignorecase = ();
2297 107         121 for my $ord (0 .. 255) {
2298 107 100       178 if (exists $singleoctet_ignorecase{$ord}) {
2299 27392         30402 push @{$singleoctet_ignorecase[$i]}, $ord;
  1887         1727  
2300             }
2301             else {
2302 1887         3049 $i++;
2303             }
2304             }
2305 25505         25686 @singleoctet = ();
2306 107         174 for my $range (@singleoctet_ignorecase) {
2307 107 100       219 if (ref $range) {
2308 11102 100       17161 if (scalar(@{$range}) == 1) {
  219 50       228  
2309 219         317 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  5         5  
2310             }
2311 5         113 elsif (scalar(@{$range}) == 2) {
2312 214         324 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
2313             }
2314             else {
2315 0         0 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  214         227  
  214         259  
2316             }
2317             }
2318             }
2319             }
2320              
2321 214         881 my $not_anchor = '';
2322 384         575 $not_anchor = '(?![\x80-\xA0\xE0-\xFE])';
2323              
2324 384         668 push @multipleoctet, join('', $not_anchor, '[', @singleoctet, ']' );
2325             }
2326 384 100       1112 if (scalar(@multipleoctet) >= 2) {
2327 519         1460 return '(?:' . join('|', @multipleoctet) . ')';
2328             }
2329             else {
2330 131         885 return $multipleoctet[0];
2331             }
2332             }
2333              
2334             #
2335             # HP-15 open character list for not qr
2336             #
2337             sub charlist_not_qr {
2338              
2339 388     239 0 1636 my $modifier = pop @_;
2340 239         504 my @char = @_;
2341              
2342 239         654 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
2343 239         514 my @singleoctet = @$singleoctet;
2344 239         508 my @multipleoctet = @$multipleoctet;
2345              
2346             # with /i modifier
2347 239 100       366 if ($modifier =~ m/i/oxms) {
2348 239         554 my %singleoctet_ignorecase = ();
2349 128         198 for (@singleoctet) {
2350 128   100     183 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
2351 277         911 for my $ord (hex($1) .. hex($2)) {
2352 85         287 my $char = CORE::chr($ord);
2353 1356         1742 my $uc = Ehp15::uc($char);
2354 1356         1648 my $fc = Ehp15::fc($char);
2355 1356 100       1875 if ($uc eq $fc) {
2356 1356         1962 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
2357             }
2358             else {
2359 767 50       1757 if (CORE::length($fc) == 1) {
2360 589         717 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2361 589         1171 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
2362             }
2363             else {
2364 589         1352 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2365 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
2366             }
2367             }
2368             }
2369             }
2370 0 100       0 if ($_ ne '') {
2371 277         426 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
2372             }
2373             }
2374 192         437 my $i = 0;
2375 128         150 my @singleoctet_ignorecase = ();
2376 128         159 for my $ord (0 .. 255) {
2377 128 100       206 if (exists $singleoctet_ignorecase{$ord}) {
2378 32768         37675 push @{$singleoctet_ignorecase[$i]}, $ord;
  1887         1820  
2379             }
2380             else {
2381 1887         2962 $i++;
2382             }
2383             }
2384 30881         30596 @singleoctet = ();
2385 128         220 for my $range (@singleoctet_ignorecase) {
2386 128 100       270 if (ref $range) {
2387 11102 100       17134 if (scalar(@{$range}) == 1) {
  219 50       209  
2388 219         318 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  5         5  
2389             }
2390 5         88 elsif (scalar(@{$range}) == 2) {
2391 214         272 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
2392             }
2393             else {
2394 0         0 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  214         326  
  214         247  
2395             }
2396             }
2397             }
2398             }
2399              
2400             # return character list
2401 214 100       882 if (scalar(@multipleoctet) >= 1) {
2402 239 100       474 if (scalar(@singleoctet) >= 1) {
2403              
2404             # any character other than multiple-octet and single octet character class
2405 114         190 return '(?!' . join('|', @multipleoctet) . ')(?:[^\x80-\xA0\xE0-\xFE' . join('', @singleoctet) . ']|[\x80-\xA0\xE0-\xFE][\x00-\xFF])';
2406             }
2407             else {
2408              
2409             # any character other than multiple-octet character class
2410 70         461 return '(?!' . join('|', @multipleoctet) . ")(?:$your_char)";
2411             }
2412             }
2413             else {
2414 44 50       303 if (scalar(@singleoctet) >= 1) {
2415              
2416             # any character other than single octet character class
2417 125         267 return '(?:[^\x80-\xA0\xE0-\xFE' . join('', @singleoctet) . ']|[\x80-\xA0\xE0-\xFE][\x00-\xFF])';
2418             }
2419             else {
2420              
2421             # any character
2422 125         679 return "(?:$your_char)";
2423             }
2424             }
2425             }
2426              
2427             #
2428             # open file in read mode
2429             #
2430             sub _open_r {
2431 0     768   0 my(undef,$file) = @_;
2432 389     389   8823 use Fcntl qw(O_RDONLY);
  389         2780  
  389         59198  
2433 768         2579 return CORE::sysopen($_[0], $file, &O_RDONLY);
2434             }
2435              
2436             #
2437             # open file in append mode
2438             #
2439             sub _open_a {
2440 768     384   31421 my(undef,$file) = @_;
2441 389     389   4626 use Fcntl qw(O_WRONLY O_APPEND O_CREAT);
  389         3335  
  389         5551219  
2442 384         1150 return CORE::sysopen($_[0], $file, &O_WRONLY|&O_APPEND|&O_CREAT);
2443             }
2444              
2445             #
2446             # safe system
2447             #
2448             sub _systemx {
2449              
2450             # P.707 29.2.33. exec
2451             # in Chapter 29: Functions
2452             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2453             #
2454             # Be aware that in older releases of Perl, exec (and system) did not flush
2455             # your output buffer, so you needed to enable command buffering by setting $|
2456             # on one or more filehandles to avoid lost output in the case of exec, or
2457             # misordererd output in the case of system. This situation was largely remedied
2458             # in the 5.6 release of Perl. (So, 5.005 release not yet.)
2459              
2460             # P.855 exec
2461             # in Chapter 27: Functions
2462             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2463             #
2464             # In very old release of Perl (before v5.6), exec (and system) did not flush
2465             # your output buffer, so you needed to enable command buffering by setting $|
2466             # on one or more filehandles to avoid lost output with exec or misordered
2467             # output with system.
2468              
2469 384     384   64451 $| = 1;
2470              
2471             # P.565 23.1.2. Cleaning Up Your Environment
2472             # in Chapter 23: Security
2473             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2474              
2475             # P.656 Cleaning Up Your Environment
2476             # in Chapter 20: Security
2477             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2478              
2479             # local $ENV{'PATH'} = '.';
2480 384         1747 local @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Make %ENV safer
2481              
2482             # P.707 29.2.33. exec
2483             # in Chapter 29: Functions
2484             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2485             #
2486             # As we mentioned earlier, exec treats a discrete list of arguments as an
2487             # indication that it should bypass shell processing. However, there is one
2488             # place where you might still get tripped up. The exec call (and system, too)
2489             # will not distinguish between a single scalar argument and an array containing
2490             # only one element.
2491             #
2492             # @args = ("echo surprise"); # just one element in list
2493             # exec @args # still subject to shell escapes
2494             # or die "exec: $!"; # because @args == 1
2495             #
2496             # To avoid this, you can use the PATHNAME syntax, explicitly duplicating the
2497             # first argument as the pathname, which forces the rest of the arguments to be
2498             # interpreted as a list, even if there is only one of them:
2499             #
2500             # exec { $args[0] } @args # safe even with one-argument list
2501             # or die "can't exec @args: $!";
2502              
2503             # P.855 exec
2504             # in Chapter 27: Functions
2505             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2506             #
2507             # As we mentioned earlier, exec treats a discrete list of arguments as a
2508             # directive to bypass shell processing. However, there is one place where
2509             # you might still get tripped up. The exec call (and system, too) cannot
2510             # distinguish between a single scalar argument and an array containing
2511             # only one element.
2512             #
2513             # @args = ("echo surprise"); # just one element in list
2514             # exec @args # still subject to shell escapes
2515             # || die "exec: $!"; # because @args == 1
2516             #
2517             # To avoid this, use the PATHNAME syntax, explicitly duplicating the first
2518             # argument as the pathname, which forces the rest of the arguments to be
2519             # interpreted as a list, even if there is only one of them:
2520             #
2521             # exec { $args[0] } @args # safe even with one-argument list
2522             # || die "can't exec @args: $!";
2523              
2524 384         3495 return CORE::system { $_[0] } @_; # safe even with one-argument list
  384         937  
2525             }
2526              
2527             #
2528             # HP-15 order to character (with parameter)
2529             #
2530             sub Ehp15::chr(;$) {
2531              
2532 384 0   0 0 51199230 my $c = @_ ? $_[0] : $_;
2533              
2534 0 0       0 if ($c == 0x00) {
2535 0         0 return "\x00";
2536             }
2537             else {
2538 0         0 my @chr = ();
2539 0         0 while ($c > 0) {
2540 0         0 unshift @chr, ($c % 0x100);
2541 0         0 $c = int($c / 0x100);
2542             }
2543 0         0 return pack 'C*', @chr;
2544             }
2545             }
2546              
2547             #
2548             # HP-15 order to character (without parameter)
2549             #
2550             sub Ehp15::chr_() {
2551              
2552 0     0 0 0 my $c = $_;
2553              
2554 0 0       0 if ($c == 0x00) {
2555 0         0 return "\x00";
2556             }
2557             else {
2558 0         0 my @chr = ();
2559 0         0 while ($c > 0) {
2560 0         0 unshift @chr, ($c % 0x100);
2561 0         0 $c = int($c / 0x100);
2562             }
2563 0         0 return pack 'C*', @chr;
2564             }
2565             }
2566              
2567             #
2568             # HP-15 stacked file test expr
2569             #
2570             sub Ehp15::filetest {
2571              
2572 0     0 0 0 my $file = pop @_;
2573 0         0 my $filetest = substr(pop @_, 1);
2574              
2575 0 0       0 unless (CORE::eval qq{Ehp15::$filetest(\$file)}) {
2576 0         0 return '';
2577             }
2578 0         0 for my $filetest (CORE::reverse @_) {
2579 0 0       0 unless (CORE::eval qq{ $filetest _ }) {
2580 0         0 return '';
2581             }
2582             }
2583 0         0 return 1;
2584             }
2585              
2586             #
2587             # HP-15 file test -r expr
2588             #
2589             sub Ehp15::r(;*@) {
2590              
2591 0 0   0 0 0 local $_ = shift if @_;
2592 0 0 0     0 croak 'Too many arguments for -r (Ehp15::r)' if @_ and not wantarray;
2593              
2594 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
2595 0 0       0 return wantarray ? (-r _,@_) : -r _;
2596             }
2597              
2598             # P.908 32.39. Symbol
2599             # in Chapter 32: Standard Modules
2600             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2601              
2602             # P.326 Prototypes
2603             # in Chapter 7: Subroutines
2604             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2605              
2606             # (and so on)
2607              
2608             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
2609 0 0       0 return wantarray ? (-r $fh,@_) : -r $fh;
2610             }
2611             elsif (-e $_) {
2612 0 0       0 return wantarray ? (-r _,@_) : -r _;
2613             }
2614             elsif (_MSWin32_5Cended_path($_)) {
2615 0 0       0 if (-d "$_/.") {
2616 0 0       0 return wantarray ? (-r _,@_) : -r _;
2617             }
2618             else {
2619              
2620             # Even if ${^WIN32_SLOPPY_STAT} is set to a true value, Ehp15::*()
2621             # on Windows opens the file for the path which has 5c at end.
2622             # (and so on)
2623              
2624 0         0 my $fh = gensym();
2625 0 0       0 if (_open_r($fh, $_)) {
2626 0         0 my $r = -r $fh;
2627 0         0 close $fh;
2628 0 0       0 return wantarray ? ($r,@_) : $r;
2629             }
2630             }
2631             }
2632 0 0       0 return wantarray ? (undef,@_) : undef;
2633             }
2634              
2635             #
2636             # HP-15 file test -w expr
2637             #
2638             sub Ehp15::w(;*@) {
2639              
2640 0 0   0 0 0 local $_ = shift if @_;
2641 0 0 0     0 croak 'Too many arguments for -w (Ehp15::w)' if @_ and not wantarray;
2642              
2643 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
2644 0 0       0 return wantarray ? (-w _,@_) : -w _;
2645             }
2646             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
2647 0 0       0 return wantarray ? (-w $fh,@_) : -w $fh;
2648             }
2649             elsif (-e $_) {
2650 0 0       0 return wantarray ? (-w _,@_) : -w _;
2651             }
2652             elsif (_MSWin32_5Cended_path($_)) {
2653 0 0       0 if (-d "$_/.") {
2654 0 0       0 return wantarray ? (-w _,@_) : -w _;
2655             }
2656             else {
2657 0         0 my $fh = gensym();
2658 0 0       0 if (_open_a($fh, $_)) {
2659 0         0 my $w = -w $fh;
2660 0         0 close $fh;
2661 0 0       0 return wantarray ? ($w,@_) : $w;
2662             }
2663             }
2664             }
2665 0 0       0 return wantarray ? (undef,@_) : undef;
2666             }
2667              
2668             #
2669             # HP-15 file test -x expr
2670             #
2671             sub Ehp15::x(;*@) {
2672              
2673 0 0   0 0 0 local $_ = shift if @_;
2674 0 0 0     0 croak 'Too many arguments for -x (Ehp15::x)' if @_ and not wantarray;
2675              
2676 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
2677 0 0       0 return wantarray ? (-x _,@_) : -x _;
2678             }
2679             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
2680 0 0       0 return wantarray ? (-x $fh,@_) : -x $fh;
2681             }
2682             elsif (-e $_) {
2683 0 0       0 return wantarray ? (-x _,@_) : -x _;
2684             }
2685             elsif (_MSWin32_5Cended_path($_)) {
2686 0 0       0 if (-d "$_/.") {
2687 0 0       0 return wantarray ? (-x _,@_) : -x _;
2688             }
2689             else {
2690 0         0 my $fh = gensym();
2691 0 0       0 if (_open_r($fh, $_)) {
2692 0         0 my $dummy_for_underline_cache = -x $fh;
2693 0         0 close $fh;
2694             }
2695              
2696             # filename is not .COM .EXE .BAT .CMD
2697 0 0       0 return wantarray ? ('',@_) : '';
2698             }
2699             }
2700 0 0       0 return wantarray ? (undef,@_) : undef;
2701             }
2702              
2703             #
2704             # HP-15 file test -o expr
2705             #
2706             sub Ehp15::o(;*@) {
2707              
2708 0 0   0 0 0 local $_ = shift if @_;
2709 0 0 0     0 croak 'Too many arguments for -o (Ehp15::o)' if @_ and not wantarray;
2710              
2711 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
2712 0 0       0 return wantarray ? (-o _,@_) : -o _;
2713             }
2714             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
2715 0 0       0 return wantarray ? (-o $fh,@_) : -o $fh;
2716             }
2717             elsif (-e $_) {
2718 0 0       0 return wantarray ? (-o _,@_) : -o _;
2719             }
2720             elsif (_MSWin32_5Cended_path($_)) {
2721 0 0       0 if (-d "$_/.") {
2722 0 0       0 return wantarray ? (-o _,@_) : -o _;
2723             }
2724             else {
2725 0         0 my $fh = gensym();
2726 0 0       0 if (_open_r($fh, $_)) {
2727 0         0 my $o = -o $fh;
2728 0         0 close $fh;
2729 0 0       0 return wantarray ? ($o,@_) : $o;
2730             }
2731             }
2732             }
2733 0 0       0 return wantarray ? (undef,@_) : undef;
2734             }
2735              
2736             #
2737             # HP-15 file test -R expr
2738             #
2739             sub Ehp15::R(;*@) {
2740              
2741 0 0   0 0 0 local $_ = shift if @_;
2742 0 0 0     0 croak 'Too many arguments for -R (Ehp15::R)' if @_ and not wantarray;
2743              
2744 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
2745 0 0       0 return wantarray ? (-R _,@_) : -R _;
2746             }
2747             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
2748 0 0       0 return wantarray ? (-R $fh,@_) : -R $fh;
2749             }
2750             elsif (-e $_) {
2751 0 0       0 return wantarray ? (-R _,@_) : -R _;
2752             }
2753             elsif (_MSWin32_5Cended_path($_)) {
2754 0 0       0 if (-d "$_/.") {
2755 0 0       0 return wantarray ? (-R _,@_) : -R _;
2756             }
2757             else {
2758 0         0 my $fh = gensym();
2759 0 0       0 if (_open_r($fh, $_)) {
2760 0         0 my $R = -R $fh;
2761 0         0 close $fh;
2762 0 0       0 return wantarray ? ($R,@_) : $R;
2763             }
2764             }
2765             }
2766 0 0       0 return wantarray ? (undef,@_) : undef;
2767             }
2768              
2769             #
2770             # HP-15 file test -W expr
2771             #
2772             sub Ehp15::W(;*@) {
2773              
2774 0 0   0 0 0 local $_ = shift if @_;
2775 0 0 0     0 croak 'Too many arguments for -W (Ehp15::W)' if @_ and not wantarray;
2776              
2777 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
2778 0 0       0 return wantarray ? (-W _,@_) : -W _;
2779             }
2780             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
2781 0 0       0 return wantarray ? (-W $fh,@_) : -W $fh;
2782             }
2783             elsif (-e $_) {
2784 0 0       0 return wantarray ? (-W _,@_) : -W _;
2785             }
2786             elsif (_MSWin32_5Cended_path($_)) {
2787 0 0       0 if (-d "$_/.") {
2788 0 0       0 return wantarray ? (-W _,@_) : -W _;
2789             }
2790             else {
2791 0         0 my $fh = gensym();
2792 0 0       0 if (_open_a($fh, $_)) {
2793 0         0 my $W = -W $fh;
2794 0         0 close $fh;
2795 0 0       0 return wantarray ? ($W,@_) : $W;
2796             }
2797             }
2798             }
2799 0 0       0 return wantarray ? (undef,@_) : undef;
2800             }
2801              
2802             #
2803             # HP-15 file test -X expr
2804             #
2805             sub Ehp15::X(;*@) {
2806              
2807 0 0   0 1 0 local $_ = shift if @_;
2808 0 0 0     0 croak 'Too many arguments for -X (Ehp15::X)' if @_ and not wantarray;
2809              
2810 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
2811 0 0       0 return wantarray ? (-X _,@_) : -X _;
2812             }
2813             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
2814 0 0       0 return wantarray ? (-X $fh,@_) : -X $fh;
2815             }
2816             elsif (-e $_) {
2817 0 0       0 return wantarray ? (-X _,@_) : -X _;
2818             }
2819             elsif (_MSWin32_5Cended_path($_)) {
2820 0 0       0 if (-d "$_/.") {
2821 0 0       0 return wantarray ? (-X _,@_) : -X _;
2822             }
2823             else {
2824 0         0 my $fh = gensym();
2825 0 0       0 if (_open_r($fh, $_)) {
2826 0         0 my $dummy_for_underline_cache = -X $fh;
2827 0         0 close $fh;
2828             }
2829              
2830             # filename is not .COM .EXE .BAT .CMD
2831 0 0       0 return wantarray ? ('',@_) : '';
2832             }
2833             }
2834 0 0       0 return wantarray ? (undef,@_) : undef;
2835             }
2836              
2837             #
2838             # HP-15 file test -O expr
2839             #
2840             sub Ehp15::O(;*@) {
2841              
2842 0 0   0 0 0 local $_ = shift if @_;
2843 0 0 0     0 croak 'Too many arguments for -O (Ehp15::O)' if @_ and not wantarray;
2844              
2845 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
2846 0 0       0 return wantarray ? (-O _,@_) : -O _;
2847             }
2848             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
2849 0 0       0 return wantarray ? (-O $fh,@_) : -O $fh;
2850             }
2851             elsif (-e $_) {
2852 0 0       0 return wantarray ? (-O _,@_) : -O _;
2853             }
2854             elsif (_MSWin32_5Cended_path($_)) {
2855 0 0       0 if (-d "$_/.") {
2856 0 0       0 return wantarray ? (-O _,@_) : -O _;
2857             }
2858             else {
2859 0         0 my $fh = gensym();
2860 0 0       0 if (_open_r($fh, $_)) {
2861 0         0 my $O = -O $fh;
2862 0         0 close $fh;
2863 0 0       0 return wantarray ? ($O,@_) : $O;
2864             }
2865             }
2866             }
2867 0 0       0 return wantarray ? (undef,@_) : undef;
2868             }
2869              
2870             #
2871             # HP-15 file test -e expr
2872             #
2873             sub Ehp15::e(;*@) {
2874              
2875 0 50   768 0 0 local $_ = shift if @_;
2876 768 50 33     2905 croak 'Too many arguments for -e (Ehp15::e)' if @_ and not wantarray;
2877              
2878 768         3056 local $^W = 0;
2879              
2880 768         2447 my $fh = qualify_to_ref $_;
2881 768 50       2076 if ($_ eq '_') {
    50          
    50          
    50          
    50          
2882 768 0       3964 return wantarray ? (-e _,@_) : -e _;
2883             }
2884              
2885             # return false if directory handle
2886             elsif (defined Ehp15::telldir($fh)) {
2887 0 0       0 return wantarray ? ('',@_) : '';
2888             }
2889              
2890             # return true if file handle
2891             elsif (defined fileno $fh) {
2892 0 0       0 return wantarray ? (1,@_) : 1;
2893             }
2894              
2895             elsif (-e $_) {
2896 0 0       0 return wantarray ? (1,@_) : 1;
2897             }
2898             elsif (_MSWin32_5Cended_path($_)) {
2899 0 0       0 if (-d "$_/.") {
2900 0 0       0 return wantarray ? (1,@_) : 1;
2901             }
2902             else {
2903 0         0 my $fh = gensym();
2904 0 0       0 if (_open_r($fh, $_)) {
2905 0         0 my $e = -e $fh;
2906 0         0 close $fh;
2907 0 0       0 return wantarray ? ($e,@_) : $e;
2908             }
2909             }
2910             }
2911 0 50       0 return wantarray ? (undef,@_) : undef;
2912             }
2913              
2914             #
2915             # HP-15 file test -z expr
2916             #
2917             sub Ehp15::z(;*@) {
2918              
2919 768 0   0 0 4430 local $_ = shift if @_;
2920 0 0 0     0 croak 'Too many arguments for -z (Ehp15::z)' if @_ and not wantarray;
2921              
2922 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
2923 0 0       0 return wantarray ? (-z _,@_) : -z _;
2924             }
2925             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
2926 0 0       0 return wantarray ? (-z $fh,@_) : -z $fh;
2927             }
2928             elsif (-e $_) {
2929 0 0       0 return wantarray ? (-z _,@_) : -z _;
2930             }
2931             elsif (_MSWin32_5Cended_path($_)) {
2932 0 0       0 if (-d "$_/.") {
2933 0 0       0 return wantarray ? (-z _,@_) : -z _;
2934             }
2935             else {
2936 0         0 my $fh = gensym();
2937 0 0       0 if (_open_r($fh, $_)) {
2938 0         0 my $z = -z $fh;
2939 0         0 close $fh;
2940 0 0       0 return wantarray ? ($z,@_) : $z;
2941             }
2942             }
2943             }
2944 0 0       0 return wantarray ? (undef,@_) : undef;
2945             }
2946              
2947             #
2948             # HP-15 file test -s expr
2949             #
2950             sub Ehp15::s(;*@) {
2951              
2952 0 0   0 0 0 local $_ = shift if @_;
2953 0 0 0     0 croak 'Too many arguments for -s (Ehp15::s)' if @_ and not wantarray;
2954              
2955 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
2956 0 0       0 return wantarray ? (-s _,@_) : -s _;
2957             }
2958             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
2959 0 0       0 return wantarray ? (-s $fh,@_) : -s $fh;
2960             }
2961             elsif (-e $_) {
2962 0 0       0 return wantarray ? (-s _,@_) : -s _;
2963             }
2964             elsif (_MSWin32_5Cended_path($_)) {
2965 0 0       0 if (-d "$_/.") {
2966 0 0       0 return wantarray ? (-s _,@_) : -s _;
2967             }
2968             else {
2969 0         0 my $fh = gensym();
2970 0 0       0 if (_open_r($fh, $_)) {
2971 0         0 my $s = -s $fh;
2972 0         0 close $fh;
2973 0 0       0 return wantarray ? ($s,@_) : $s;
2974             }
2975             }
2976             }
2977 0 0       0 return wantarray ? (undef,@_) : undef;
2978             }
2979              
2980             #
2981             # HP-15 file test -f expr
2982             #
2983             sub Ehp15::f(;*@) {
2984              
2985 0 0   0 0 0 local $_ = shift if @_;
2986 0 0 0     0 croak 'Too many arguments for -f (Ehp15::f)' if @_ and not wantarray;
2987              
2988 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
2989 0 0       0 return wantarray ? (-f _,@_) : -f _;
2990             }
2991             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
2992 0 0       0 return wantarray ? (-f $fh,@_) : -f $fh;
2993             }
2994             elsif (-e $_) {
2995 0 0       0 return wantarray ? (-f _,@_) : -f _;
2996             }
2997             elsif (_MSWin32_5Cended_path($_)) {
2998 0 0       0 if (-d "$_/.") {
2999 0 0       0 return wantarray ? ('',@_) : '';
3000             }
3001             else {
3002 0         0 my $fh = gensym();
3003 0 0       0 if (_open_r($fh, $_)) {
3004 0         0 my $f = -f $fh;
3005 0         0 close $fh;
3006 0 0       0 return wantarray ? ($f,@_) : $f;
3007             }
3008             }
3009             }
3010 0 0       0 return wantarray ? (undef,@_) : undef;
3011             }
3012              
3013             #
3014             # HP-15 file test -d expr
3015             #
3016             sub Ehp15::d(;*@) {
3017              
3018 0 0   0 0 0 local $_ = shift if @_;
3019 0 0 0     0 croak 'Too many arguments for -d (Ehp15::d)' if @_ and not wantarray;
3020              
3021 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
3022 0 0       0 return wantarray ? (-d _,@_) : -d _;
3023             }
3024              
3025             # return false if file handle or directory handle
3026             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
3027 0 0       0 return wantarray ? ('',@_) : '';
3028             }
3029             elsif (-e $_) {
3030 0 0       0 return wantarray ? (-d _,@_) : -d _;
3031             }
3032             elsif (_MSWin32_5Cended_path($_)) {
3033 0 0       0 return wantarray ? (-d "$_/.",@_) : -d "$_/.";
3034             }
3035 0 0       0 return wantarray ? (undef,@_) : undef;
3036             }
3037              
3038             #
3039             # HP-15 file test -l expr
3040             #
3041             sub Ehp15::l(;*@) {
3042              
3043 0 0   0 0 0 local $_ = shift if @_;
3044 0 0 0     0 croak 'Too many arguments for -l (Ehp15::l)' if @_ and not wantarray;
3045              
3046 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
3047 0 0       0 return wantarray ? (-l _,@_) : -l _;
3048             }
3049             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
3050 0 0       0 return wantarray ? (-l $fh,@_) : -l $fh;
3051             }
3052             elsif (-e $_) {
3053 0 0       0 return wantarray ? (-l _,@_) : -l _;
3054             }
3055             elsif (_MSWin32_5Cended_path($_)) {
3056 0 0       0 if (-d "$_/.") {
3057 0 0       0 return wantarray ? (-l _,@_) : -l _;
3058             }
3059             else {
3060 0         0 my $fh = gensym();
3061 0 0       0 if (_open_r($fh, $_)) {
3062 0         0 my $l = -l $fh;
3063 0         0 close $fh;
3064 0 0       0 return wantarray ? ($l,@_) : $l;
3065             }
3066             }
3067             }
3068 0 0       0 return wantarray ? (undef,@_) : undef;
3069             }
3070              
3071             #
3072             # HP-15 file test -p expr
3073             #
3074             sub Ehp15::p(;*@) {
3075              
3076 0 0   0 0 0 local $_ = shift if @_;
3077 0 0 0     0 croak 'Too many arguments for -p (Ehp15::p)' if @_ and not wantarray;
3078              
3079 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
3080 0 0       0 return wantarray ? (-p _,@_) : -p _;
3081             }
3082             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
3083 0 0       0 return wantarray ? (-p $fh,@_) : -p $fh;
3084             }
3085             elsif (-e $_) {
3086 0 0       0 return wantarray ? (-p _,@_) : -p _;
3087             }
3088             elsif (_MSWin32_5Cended_path($_)) {
3089 0 0       0 if (-d "$_/.") {
3090 0 0       0 return wantarray ? (-p _,@_) : -p _;
3091             }
3092             else {
3093 0         0 my $fh = gensym();
3094 0 0       0 if (_open_r($fh, $_)) {
3095 0         0 my $p = -p $fh;
3096 0         0 close $fh;
3097 0 0       0 return wantarray ? ($p,@_) : $p;
3098             }
3099             }
3100             }
3101 0 0       0 return wantarray ? (undef,@_) : undef;
3102             }
3103              
3104             #
3105             # HP-15 file test -S expr
3106             #
3107             sub Ehp15::S(;*@) {
3108              
3109 0 0   0 0 0 local $_ = shift if @_;
3110 0 0 0     0 croak 'Too many arguments for -S (Ehp15::S)' if @_ and not wantarray;
3111              
3112 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
3113 0 0       0 return wantarray ? (-S _,@_) : -S _;
3114             }
3115             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
3116 0 0       0 return wantarray ? (-S $fh,@_) : -S $fh;
3117             }
3118             elsif (-e $_) {
3119 0 0       0 return wantarray ? (-S _,@_) : -S _;
3120             }
3121             elsif (_MSWin32_5Cended_path($_)) {
3122 0 0       0 if (-d "$_/.") {
3123 0 0       0 return wantarray ? (-S _,@_) : -S _;
3124             }
3125             else {
3126 0         0 my $fh = gensym();
3127 0 0       0 if (_open_r($fh, $_)) {
3128 0         0 my $S = -S $fh;
3129 0         0 close $fh;
3130 0 0       0 return wantarray ? ($S,@_) : $S;
3131             }
3132             }
3133             }
3134 0 0       0 return wantarray ? (undef,@_) : undef;
3135             }
3136              
3137             #
3138             # HP-15 file test -b expr
3139             #
3140             sub Ehp15::b(;*@) {
3141              
3142 0 0   0 0 0 local $_ = shift if @_;
3143 0 0 0     0 croak 'Too many arguments for -b (Ehp15::b)' if @_ and not wantarray;
3144              
3145 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
3146 0 0       0 return wantarray ? (-b _,@_) : -b _;
3147             }
3148             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
3149 0 0       0 return wantarray ? (-b $fh,@_) : -b $fh;
3150             }
3151             elsif (-e $_) {
3152 0 0       0 return wantarray ? (-b _,@_) : -b _;
3153             }
3154             elsif (_MSWin32_5Cended_path($_)) {
3155 0 0       0 if (-d "$_/.") {
3156 0 0       0 return wantarray ? (-b _,@_) : -b _;
3157             }
3158             else {
3159 0         0 my $fh = gensym();
3160 0 0       0 if (_open_r($fh, $_)) {
3161 0         0 my $b = -b $fh;
3162 0         0 close $fh;
3163 0 0       0 return wantarray ? ($b,@_) : $b;
3164             }
3165             }
3166             }
3167 0 0       0 return wantarray ? (undef,@_) : undef;
3168             }
3169              
3170             #
3171             # HP-15 file test -c expr
3172             #
3173             sub Ehp15::c(;*@) {
3174              
3175 0 0   0 0 0 local $_ = shift if @_;
3176 0 0 0     0 croak 'Too many arguments for -c (Ehp15::c)' if @_ and not wantarray;
3177              
3178 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
3179 0 0       0 return wantarray ? (-c _,@_) : -c _;
3180             }
3181             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
3182 0 0       0 return wantarray ? (-c $fh,@_) : -c $fh;
3183             }
3184             elsif (-e $_) {
3185 0 0       0 return wantarray ? (-c _,@_) : -c _;
3186             }
3187             elsif (_MSWin32_5Cended_path($_)) {
3188 0 0       0 if (-d "$_/.") {
3189 0 0       0 return wantarray ? (-c _,@_) : -c _;
3190             }
3191             else {
3192 0         0 my $fh = gensym();
3193 0 0       0 if (_open_r($fh, $_)) {
3194 0         0 my $c = -c $fh;
3195 0         0 close $fh;
3196 0 0       0 return wantarray ? ($c,@_) : $c;
3197             }
3198             }
3199             }
3200 0 0       0 return wantarray ? (undef,@_) : undef;
3201             }
3202              
3203             #
3204             # HP-15 file test -u expr
3205             #
3206             sub Ehp15::u(;*@) {
3207              
3208 0 0   0 0 0 local $_ = shift if @_;
3209 0 0 0     0 croak 'Too many arguments for -u (Ehp15::u)' if @_ and not wantarray;
3210              
3211 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
3212 0 0       0 return wantarray ? (-u _,@_) : -u _;
3213             }
3214             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
3215 0 0       0 return wantarray ? (-u $fh,@_) : -u $fh;
3216             }
3217             elsif (-e $_) {
3218 0 0       0 return wantarray ? (-u _,@_) : -u _;
3219             }
3220             elsif (_MSWin32_5Cended_path($_)) {
3221 0 0       0 if (-d "$_/.") {
3222 0 0       0 return wantarray ? (-u _,@_) : -u _;
3223             }
3224             else {
3225 0         0 my $fh = gensym();
3226 0 0       0 if (_open_r($fh, $_)) {
3227 0         0 my $u = -u $fh;
3228 0         0 close $fh;
3229 0 0       0 return wantarray ? ($u,@_) : $u;
3230             }
3231             }
3232             }
3233 0 0       0 return wantarray ? (undef,@_) : undef;
3234             }
3235              
3236             #
3237             # HP-15 file test -g expr
3238             #
3239             sub Ehp15::g(;*@) {
3240              
3241 0 0   0 0 0 local $_ = shift if @_;
3242 0 0 0     0 croak 'Too many arguments for -g (Ehp15::g)' if @_ and not wantarray;
3243              
3244 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
3245 0 0       0 return wantarray ? (-g _,@_) : -g _;
3246             }
3247             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
3248 0 0       0 return wantarray ? (-g $fh,@_) : -g $fh;
3249             }
3250             elsif (-e $_) {
3251 0 0       0 return wantarray ? (-g _,@_) : -g _;
3252             }
3253             elsif (_MSWin32_5Cended_path($_)) {
3254 0 0       0 if (-d "$_/.") {
3255 0 0       0 return wantarray ? (-g _,@_) : -g _;
3256             }
3257             else {
3258 0         0 my $fh = gensym();
3259 0 0       0 if (_open_r($fh, $_)) {
3260 0         0 my $g = -g $fh;
3261 0         0 close $fh;
3262 0 0       0 return wantarray ? ($g,@_) : $g;
3263             }
3264             }
3265             }
3266 0 0       0 return wantarray ? (undef,@_) : undef;
3267             }
3268              
3269             #
3270             # HP-15 file test -k expr
3271             #
3272             sub Ehp15::k(;*@) {
3273              
3274 0 0   0 0 0 local $_ = shift if @_;
3275 0 0 0     0 croak 'Too many arguments for -k (Ehp15::k)' if @_ and not wantarray;
3276              
3277 0 0       0 if ($_ eq '_') {
    0          
    0          
3278 0 0       0 return wantarray ? ('',@_) : '';
3279             }
3280             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
3281 0 0       0 return wantarray ? ('',@_) : '';
3282             }
3283             elsif ($] =~ /^5\.008/oxms) {
3284 0 0       0 return wantarray ? ('',@_) : '';
3285             }
3286 0 0       0 return wantarray ? ($_,@_) : $_;
3287             }
3288              
3289             #
3290             # HP-15 file test -T expr
3291             #
3292             sub Ehp15::T(;*@) {
3293              
3294 0 0   0 0 0 local $_ = shift if @_;
3295              
3296             # Use of croak without parentheses makes die on Strawberry Perl 5.008 and 5.010, like:
3297             # croak 'Too many arguments for -T (Ehp15::T)';
3298             # Must be used by parentheses like:
3299             # croak('Too many arguments for -T (Ehp15::T)');
3300              
3301 0 0 0     0 if (@_ and not wantarray) {
3302 0         0 croak('Too many arguments for -T (Ehp15::T)');
3303             }
3304              
3305 0         0 my $T = 1;
3306              
3307 0         0 my $fh = qualify_to_ref $_;
3308 0 0       0 if (defined fileno $fh) {
3309              
3310 0 0       0 if (defined Ehp15::telldir($fh)) {
3311 0 0       0 return wantarray ? (undef,@_) : undef;
3312             }
3313              
3314             # P.813 29.2.176. tell
3315             # in Chapter 29: Functions
3316             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
3317              
3318             # P.970 tell
3319             # in Chapter 27: Functions
3320             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3321              
3322             # (and so on)
3323              
3324 0         0 my $systell = sysseek $fh, 0, 1;
3325              
3326 0 0       0 if (sysread $fh, my $block, 512) {
3327              
3328             # P.163 Binary file check in Little Perl Parlor 16
3329             # of Book No. T1008901080816 ZASSHI 08901-8 UNIX MAGAZINE 1993 Aug VOL8#8
3330             # (and so on)
3331              
3332 0 0       0 if ($block =~ /[\000\377]/oxms) {
    0          
3333 0         0 $T = '';
3334             }
3335             elsif (($block =~ tr/\000-\007\013\016-\032\034-\037\377//) * 10 > CORE::length $block) {
3336 0         0 $T = '';
3337             }
3338             }
3339              
3340             # 0 byte or eof
3341             else {
3342 0         0 $T = 1;
3343             }
3344              
3345 0         0 my $dummy_for_underline_cache = -T $fh;
3346 0         0 sysseek $fh, $systell, 0;
3347             }
3348             else {
3349 0 0 0     0 if (-d $_ or -d "$_/.") {
3350 0 0       0 return wantarray ? (undef,@_) : undef;
3351             }
3352              
3353 0         0 $fh = gensym();
3354 0 0       0 if (_open_r($fh, $_)) {
3355             }
3356             else {
3357 0 0       0 return wantarray ? (undef,@_) : undef;
3358             }
3359 0 0       0 if (sysread $fh, my $block, 512) {
3360 0 0       0 if ($block =~ /[\000\377]/oxms) {
    0          
3361 0         0 $T = '';
3362             }
3363             elsif (($block =~ tr/\000-\007\013\016-\032\034-\037\377//) * 10 > CORE::length $block) {
3364 0         0 $T = '';
3365             }
3366             }
3367              
3368             # 0 byte or eof
3369             else {
3370 0         0 $T = 1;
3371             }
3372 0         0 my $dummy_for_underline_cache = -T $fh;
3373 0         0 close $fh;
3374             }
3375              
3376 0 0       0 return wantarray ? ($T,@_) : $T;
3377             }
3378              
3379             #
3380             # HP-15 file test -B expr
3381             #
3382             sub Ehp15::B(;*@) {
3383              
3384 0 0   0 0 0 local $_ = shift if @_;
3385 0 0 0     0 croak 'Too many arguments for -B (Ehp15::B)' if @_ and not wantarray;
3386 0         0 my $B = '';
3387              
3388 0         0 my $fh = qualify_to_ref $_;
3389 0 0       0 if (defined fileno $fh) {
3390              
3391 0 0       0 if (defined Ehp15::telldir($fh)) {
3392 0 0       0 return wantarray ? (undef,@_) : undef;
3393             }
3394              
3395 0         0 my $systell = sysseek $fh, 0, 1;
3396              
3397 0 0       0 if (sysread $fh, my $block, 512) {
3398 0 0       0 if ($block =~ /[\000\377]/oxms) {
    0          
3399 0         0 $B = 1;
3400             }
3401             elsif (($block =~ tr/\000-\007\013\016-\032\034-\037\377//) * 10 > CORE::length $block) {
3402 0         0 $B = 1;
3403             }
3404             }
3405              
3406             # 0 byte or eof
3407             else {
3408 0         0 $B = 1;
3409             }
3410              
3411 0         0 my $dummy_for_underline_cache = -B $fh;
3412 0         0 sysseek $fh, $systell, 0;
3413             }
3414             else {
3415 0 0 0     0 if (-d $_ or -d "$_/.") {
3416 0 0       0 return wantarray ? (undef,@_) : undef;
3417             }
3418              
3419 0         0 $fh = gensym();
3420 0 0       0 if (_open_r($fh, $_)) {
3421             }
3422             else {
3423 0 0       0 return wantarray ? (undef,@_) : undef;
3424             }
3425 0 0       0 if (sysread $fh, my $block, 512) {
3426 0 0       0 if ($block =~ /[\000\377]/oxms) {
    0          
3427 0         0 $B = 1;
3428             }
3429             elsif (($block =~ tr/\000-\007\013\016-\032\034-\037\377//) * 10 > CORE::length $block) {
3430 0         0 $B = 1;
3431             }
3432             }
3433              
3434             # 0 byte or eof
3435             else {
3436 0         0 $B = 1;
3437             }
3438 0         0 my $dummy_for_underline_cache = -B $fh;
3439 0         0 close $fh;
3440             }
3441              
3442 0 0       0 return wantarray ? ($B,@_) : $B;
3443             }
3444              
3445             #
3446             # HP-15 file test -M expr
3447             #
3448             sub Ehp15::M(;*@) {
3449              
3450 0 0   0 0 0 local $_ = shift if @_;
3451 0 0 0     0 croak 'Too many arguments for -M (Ehp15::M)' if @_ and not wantarray;
3452              
3453 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
3454 0 0       0 return wantarray ? (-M _,@_) : -M _;
3455             }
3456             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
3457 0 0       0 return wantarray ? (-M $fh,@_) : -M $fh;
3458             }
3459             elsif (-e $_) {
3460 0 0       0 return wantarray ? (-M _,@_) : -M _;
3461             }
3462             elsif (_MSWin32_5Cended_path($_)) {
3463 0 0       0 if (-d "$_/.") {
3464 0 0       0 return wantarray ? (-M _,@_) : -M _;
3465             }
3466             else {
3467 0         0 my $fh = gensym();
3468 0 0       0 if (_open_r($fh, $_)) {
3469 0         0 my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = CORE::stat $fh;
3470 0         0 close $fh;
3471 0         0 my $M = ($^T - $mtime) / (24*60*60);
3472 0 0       0 return wantarray ? ($M,@_) : $M;
3473             }
3474             }
3475             }
3476 0 0       0 return wantarray ? (undef,@_) : undef;
3477             }
3478              
3479             #
3480             # HP-15 file test -A expr
3481             #
3482             sub Ehp15::A(;*@) {
3483              
3484 0 0   0 0 0 local $_ = shift if @_;
3485 0 0 0     0 croak 'Too many arguments for -A (Ehp15::A)' if @_ and not wantarray;
3486              
3487 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
3488 0 0       0 return wantarray ? (-A _,@_) : -A _;
3489             }
3490             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
3491 0 0       0 return wantarray ? (-A $fh,@_) : -A $fh;
3492             }
3493             elsif (-e $_) {
3494 0 0       0 return wantarray ? (-A _,@_) : -A _;
3495             }
3496             elsif (_MSWin32_5Cended_path($_)) {
3497 0 0       0 if (-d "$_/.") {
3498 0 0       0 return wantarray ? (-A _,@_) : -A _;
3499             }
3500             else {
3501 0         0 my $fh = gensym();
3502 0 0       0 if (_open_r($fh, $_)) {
3503 0         0 my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = CORE::stat $fh;
3504 0         0 close $fh;
3505 0         0 my $A = ($^T - $atime) / (24*60*60);
3506 0 0       0 return wantarray ? ($A,@_) : $A;
3507             }
3508             }
3509             }
3510 0 0       0 return wantarray ? (undef,@_) : undef;
3511             }
3512              
3513             #
3514             # HP-15 file test -C expr
3515             #
3516             sub Ehp15::C(;*@) {
3517              
3518 0 0   0 0 0 local $_ = shift if @_;
3519 0 0 0     0 croak 'Too many arguments for -C (Ehp15::C)' if @_ and not wantarray;
3520              
3521 0 0       0 if ($_ eq '_') {
    0          
    0          
    0          
3522 0 0       0 return wantarray ? (-C _,@_) : -C _;
3523             }
3524             elsif (defined fileno(my $fh = qualify_to_ref $_)) {
3525 0 0       0 return wantarray ? (-C $fh,@_) : -C $fh;
3526             }
3527             elsif (-e $_) {
3528 0 0       0 return wantarray ? (-C _,@_) : -C _;
3529             }
3530             elsif (_MSWin32_5Cended_path($_)) {
3531 0 0       0 if (-d "$_/.") {
3532 0 0       0 return wantarray ? (-C _,@_) : -C _;
3533             }
3534             else {
3535 0         0 my $fh = gensym();
3536 0 0       0 if (_open_r($fh, $_)) {
3537 0         0 my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = CORE::stat $fh;
3538 0         0 close $fh;
3539 0         0 my $C = ($^T - $ctime) / (24*60*60);
3540 0 0       0 return wantarray ? ($C,@_) : $C;
3541             }
3542             }
3543             }
3544 0 0       0 return wantarray ? (undef,@_) : undef;
3545             }
3546              
3547             #
3548             # HP-15 stacked file test $_
3549             #
3550             sub Ehp15::filetest_ {
3551              
3552 0     0 0 0 my $filetest = substr(pop @_, 1);
3553              
3554 0 0       0 unless (CORE::eval qq{Ehp15::${filetest}_}) {
3555 0         0 return '';
3556             }
3557 0         0 for my $filetest (CORE::reverse @_) {
3558 0 0       0 unless (CORE::eval qq{ $filetest _ }) {
3559 0         0 return '';
3560             }
3561             }
3562 0         0 return 1;
3563             }
3564              
3565             #
3566             # HP-15 file test -r $_
3567             #
3568             sub Ehp15::r_() {
3569              
3570 0 0   0 0 0 if (-e $_) {
    0          
3571 0 0       0 return -r _ ? 1 : '';
3572             }
3573             elsif (_MSWin32_5Cended_path($_)) {
3574 0 0       0 if (-d "$_/.") {
3575 0 0       0 return -r _ ? 1 : '';
3576             }
3577             else {
3578 0         0 my $fh = gensym();
3579 0 0       0 if (_open_r($fh, $_)) {
3580 0         0 my $r = -r $fh;
3581 0         0 close $fh;
3582 0 0       0 return $r ? 1 : '';
3583             }
3584             }
3585             }
3586              
3587             # 10.10. Returning Failure
3588             # in Chapter 10. Subroutines
3589             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
3590             # (and so on)
3591              
3592             # 2010-01-26 The difference of "return;" and "return undef;"
3593             # http://d.hatena.ne.jp/gfx/20100126/1264474754
3594             #
3595             # "Perl Best Practices" recommends to use "return;"*1 to return nothing, but
3596             # it might be wrong in some cases. If you use this idiom for those functions
3597             # which are expected to return a scalar value, e.g. searching functions, the
3598             # user of those functions will be surprised at what they return in list
3599             # context, an empty list - note that many functions and all the methods
3600             # evaluate their arguments in list context. You'd better to use "return undef;"
3601             # for such scalar functions.
3602             #
3603             # sub search_something {
3604             # my($arg) = @_;
3605             # # search_something...
3606             # if(defined $found){
3607             # return $found;
3608             # }
3609             # return; # XXX: you'd better to "return undef;"
3610             # }
3611             #
3612             # # ...
3613             #
3614             # # you'll get what you want, but ...
3615             # my $something = search_something($source);
3616             #
3617             # # you won't get what you want here.
3618             # # @_ for doit() is (-foo => $opt), not (undef, -foo => $opt).
3619             # $obj->doit(search_something($source), -option=> $optval);
3620             #
3621             # # you have to use the "scalar" operator in such a case.
3622             # $obj->doit(scalar search_something($source), ...);
3623             #
3624             # *1: it returns an empty list in list context, or returns undef in scalar
3625             # context
3626             #
3627             # (and so on)
3628              
3629 0         0 return undef;
3630             }
3631              
3632             #
3633             # HP-15 file test -w $_
3634             #
3635             sub Ehp15::w_() {
3636              
3637 0 0   0 0 0 if (-e $_) {
    0          
3638 0 0       0 return -w _ ? 1 : '';
3639             }
3640             elsif (_MSWin32_5Cended_path($_)) {
3641 0 0       0 if (-d "$_/.") {
3642 0 0       0 return -w _ ? 1 : '';
3643             }
3644             else {
3645 0         0 my $fh = gensym();
3646 0 0       0 if (_open_a($fh, $_)) {
3647 0         0 my $w = -w $fh;
3648 0         0 close $fh;
3649 0 0       0 return $w ? 1 : '';
3650             }
3651             }
3652             }
3653 0         0 return undef;
3654             }
3655              
3656             #
3657             # HP-15 file test -x $_
3658             #
3659             sub Ehp15::x_() {
3660              
3661 0 0   0 0 0 if (-e $_) {
    0          
3662 0 0       0 return -x _ ? 1 : '';
3663             }
3664             elsif (_MSWin32_5Cended_path($_)) {
3665 0 0       0 if (-d "$_/.") {
3666 0 0       0 return -x _ ? 1 : '';
3667             }
3668             else {
3669 0         0 my $fh = gensym();
3670 0 0       0 if (_open_r($fh, $_)) {
3671 0         0 my $dummy_for_underline_cache = -x $fh;
3672 0         0 close $fh;
3673             }
3674              
3675             # filename is not .COM .EXE .BAT .CMD
3676 0         0 return '';
3677             }
3678             }
3679 0         0 return undef;
3680             }
3681              
3682             #
3683             # HP-15 file test -o $_
3684             #
3685             sub Ehp15::o_() {
3686              
3687 0 0   0 0 0 if (-e $_) {
    0          
3688 0 0       0 return -o _ ? 1 : '';
3689             }
3690             elsif (_MSWin32_5Cended_path($_)) {
3691 0 0       0 if (-d "$_/.") {
3692 0 0       0 return -o _ ? 1 : '';
3693             }
3694             else {
3695 0         0 my $fh = gensym();
3696 0 0       0 if (_open_r($fh, $_)) {
3697 0         0 my $o = -o $fh;
3698 0         0 close $fh;
3699 0 0       0 return $o ? 1 : '';
3700             }
3701             }
3702             }
3703 0         0 return undef;
3704             }
3705              
3706             #
3707             # HP-15 file test -R $_
3708             #
3709             sub Ehp15::R_() {
3710              
3711 0 0   0 0 0 if (-e $_) {
    0          
3712 0 0       0 return -R _ ? 1 : '';
3713             }
3714             elsif (_MSWin32_5Cended_path($_)) {
3715 0 0       0 if (-d "$_/.") {
3716 0 0       0 return -R _ ? 1 : '';
3717             }
3718             else {
3719 0         0 my $fh = gensym();
3720 0 0       0 if (_open_r($fh, $_)) {
3721 0         0 my $R = -R $fh;
3722 0         0 close $fh;
3723 0 0       0 return $R ? 1 : '';
3724             }
3725             }
3726             }
3727 0         0 return undef;
3728             }
3729              
3730             #
3731             # HP-15 file test -W $_
3732             #
3733             sub Ehp15::W_() {
3734              
3735 0 0   0 0 0 if (-e $_) {
    0          
3736 0 0       0 return -W _ ? 1 : '';
3737             }
3738             elsif (_MSWin32_5Cended_path($_)) {
3739 0 0       0 if (-d "$_/.") {
3740 0 0       0 return -W _ ? 1 : '';
3741             }
3742             else {
3743 0         0 my $fh = gensym();
3744 0 0       0 if (_open_a($fh, $_)) {
3745 0         0 my $W = -W $fh;
3746 0         0 close $fh;
3747 0 0       0 return $W ? 1 : '';
3748             }
3749             }
3750             }
3751 0         0 return undef;
3752             }
3753              
3754             #
3755             # HP-15 file test -X $_
3756             #
3757             sub Ehp15::X_() {
3758              
3759 0 0   0 0 0 if (-e $_) {
    0          
3760 0 0       0 return -X _ ? 1 : '';
3761             }
3762             elsif (_MSWin32_5Cended_path($_)) {
3763 0 0       0 if (-d "$_/.") {
3764 0 0       0 return -X _ ? 1 : '';
3765             }
3766             else {
3767 0         0 my $fh = gensym();
3768 0 0       0 if (_open_r($fh, $_)) {
3769 0         0 my $dummy_for_underline_cache = -X $fh;
3770 0         0 close $fh;
3771             }
3772              
3773             # filename is not .COM .EXE .BAT .CMD
3774 0         0 return '';
3775             }
3776             }
3777 0         0 return undef;
3778             }
3779              
3780             #
3781             # HP-15 file test -O $_
3782             #
3783             sub Ehp15::O_() {
3784              
3785 0 0   0 0 0 if (-e $_) {
    0          
3786 0 0       0 return -O _ ? 1 : '';
3787             }
3788             elsif (_MSWin32_5Cended_path($_)) {
3789 0 0       0 if (-d "$_/.") {
3790 0 0       0 return -O _ ? 1 : '';
3791             }
3792             else {
3793 0         0 my $fh = gensym();
3794 0 0       0 if (_open_r($fh, $_)) {
3795 0         0 my $O = -O $fh;
3796 0         0 close $fh;
3797 0 0       0 return $O ? 1 : '';
3798             }
3799             }
3800             }
3801 0         0 return undef;
3802             }
3803              
3804             #
3805             # HP-15 file test -e $_
3806             #
3807             sub Ehp15::e_() {
3808              
3809 0 0   0 0 0 if (-e $_) {
    0          
3810 0         0 return 1;
3811             }
3812             elsif (_MSWin32_5Cended_path($_)) {
3813 0 0       0 if (-d "$_/.") {
3814 0         0 return 1;
3815             }
3816             else {
3817 0         0 my $fh = gensym();
3818 0 0       0 if (_open_r($fh, $_)) {
3819 0         0 my $e = -e $fh;
3820 0         0 close $fh;
3821 0 0       0 return $e ? 1 : '';
3822             }
3823             }
3824             }
3825 0         0 return undef;
3826             }
3827              
3828             #
3829             # HP-15 file test -z $_
3830             #
3831             sub Ehp15::z_() {
3832              
3833 0 0   0 0 0 if (-e $_) {
    0          
3834 0 0       0 return -z _ ? 1 : '';
3835             }
3836             elsif (_MSWin32_5Cended_path($_)) {
3837 0 0       0 if (-d "$_/.") {
3838 0 0       0 return -z _ ? 1 : '';
3839             }
3840             else {
3841 0         0 my $fh = gensym();
3842 0 0       0 if (_open_r($fh, $_)) {
3843 0         0 my $z = -z $fh;
3844 0         0 close $fh;
3845 0 0       0 return $z ? 1 : '';
3846             }
3847             }
3848             }
3849 0         0 return undef;
3850             }
3851              
3852             #
3853             # HP-15 file test -s $_
3854             #
3855             sub Ehp15::s_() {
3856              
3857 0 0   0 0 0 if (-e $_) {
    0          
3858 0         0 return -s _;
3859             }
3860             elsif (_MSWin32_5Cended_path($_)) {
3861 0 0       0 if (-d "$_/.") {
3862 0         0 return -s _;
3863             }
3864             else {
3865 0         0 my $fh = gensym();
3866 0 0       0 if (_open_r($fh, $_)) {
3867 0         0 my $s = -s $fh;
3868 0         0 close $fh;
3869 0         0 return $s;
3870             }
3871             }
3872             }
3873 0         0 return undef;
3874             }
3875              
3876             #
3877             # HP-15 file test -f $_
3878             #
3879             sub Ehp15::f_() {
3880              
3881 0 0   0 0 0 if (-e $_) {
    0          
3882 0 0       0 return -f _ ? 1 : '';
3883             }
3884             elsif (_MSWin32_5Cended_path($_)) {
3885 0 0       0 if (-d "$_/.") {
3886 0         0 return '';
3887             }
3888             else {
3889 0         0 my $fh = gensym();
3890 0 0       0 if (_open_r($fh, $_)) {
3891 0         0 my $f = -f $fh;
3892 0         0 close $fh;
3893 0 0       0 return $f ? 1 : '';
3894             }
3895             }
3896             }
3897 0         0 return undef;
3898             }
3899              
3900             #
3901             # HP-15 file test -d $_
3902             #
3903             sub Ehp15::d_() {
3904              
3905 0 0   0 0 0 if (-e $_) {
    0          
3906 0 0       0 return -d _ ? 1 : '';
3907             }
3908             elsif (_MSWin32_5Cended_path($_)) {
3909 0 0       0 return -d "$_/." ? 1 : '';
3910             }
3911 0         0 return undef;
3912             }
3913              
3914             #
3915             # HP-15 file test -l $_
3916             #
3917             sub Ehp15::l_() {
3918              
3919 0 0   0 0 0 if (-e $_) {
    0          
3920 0 0       0 return -l _ ? 1 : '';
3921             }
3922             elsif (_MSWin32_5Cended_path($_)) {
3923 0 0       0 if (-d "$_/.") {
3924 0 0       0 return -l _ ? 1 : '';
3925             }
3926             else {
3927 0         0 my $fh = gensym();
3928 0 0       0 if (_open_r($fh, $_)) {
3929 0         0 my $l = -l $fh;
3930 0         0 close $fh;
3931 0 0       0 return $l ? 1 : '';
3932             }
3933             }
3934             }
3935 0         0 return undef;
3936             }
3937              
3938             #
3939             # HP-15 file test -p $_
3940             #
3941             sub Ehp15::p_() {
3942              
3943 0 0   0 0 0 if (-e $_) {
    0          
3944 0 0       0 return -p _ ? 1 : '';
3945             }
3946             elsif (_MSWin32_5Cended_path($_)) {
3947 0 0       0 if (-d "$_/.") {
3948 0 0       0 return -p _ ? 1 : '';
3949             }
3950             else {
3951 0         0 my $fh = gensym();
3952 0 0       0 if (_open_r($fh, $_)) {
3953 0         0 my $p = -p $fh;
3954 0         0 close $fh;
3955 0 0       0 return $p ? 1 : '';
3956             }
3957             }
3958             }
3959 0         0 return undef;
3960             }
3961              
3962             #
3963             # HP-15 file test -S $_
3964             #
3965             sub Ehp15::S_() {
3966              
3967 0 0   0 0 0 if (-e $_) {
    0          
3968 0 0       0 return -S _ ? 1 : '';
3969             }
3970             elsif (_MSWin32_5Cended_path($_)) {
3971 0 0       0 if (-d "$_/.") {
3972 0 0       0 return -S _ ? 1 : '';
3973             }
3974             else {
3975 0         0 my $fh = gensym();
3976 0 0       0 if (_open_r($fh, $_)) {
3977 0         0 my $S = -S $fh;
3978 0         0 close $fh;
3979 0 0       0 return $S ? 1 : '';
3980             }
3981             }
3982             }
3983 0         0 return undef;
3984             }
3985              
3986             #
3987             # HP-15 file test -b $_
3988             #
3989             sub Ehp15::b_() {
3990              
3991 0 0   0 0 0 if (-e $_) {
    0          
3992 0 0       0 return -b _ ? 1 : '';
3993             }
3994             elsif (_MSWin32_5Cended_path($_)) {
3995 0 0       0 if (-d "$_/.") {
3996 0 0       0 return -b _ ? 1 : '';
3997             }
3998             else {
3999 0         0 my $fh = gensym();
4000 0 0       0 if (_open_r($fh, $_)) {
4001 0         0 my $b = -b $fh;
4002 0         0 close $fh;
4003 0 0       0 return $b ? 1 : '';
4004             }
4005             }
4006             }
4007 0         0 return undef;
4008             }
4009              
4010             #
4011             # HP-15 file test -c $_
4012             #
4013             sub Ehp15::c_() {
4014              
4015 0 0   0 0 0 if (-e $_) {
    0          
4016 0 0       0 return -c _ ? 1 : '';
4017             }
4018             elsif (_MSWin32_5Cended_path($_)) {
4019 0 0       0 if (-d "$_/.") {
4020 0 0       0 return -c _ ? 1 : '';
4021             }
4022             else {
4023 0         0 my $fh = gensym();
4024 0 0       0 if (_open_r($fh, $_)) {
4025 0         0 my $c = -c $fh;
4026 0         0 close $fh;
4027 0 0       0 return $c ? 1 : '';
4028             }
4029             }
4030             }
4031 0         0 return undef;
4032             }
4033              
4034             #
4035             # HP-15 file test -u $_
4036             #
4037             sub Ehp15::u_() {
4038              
4039 0 0   0 0 0 if (-e $_) {
    0          
4040 0 0       0 return -u _ ? 1 : '';
4041             }
4042             elsif (_MSWin32_5Cended_path($_)) {
4043 0 0       0 if (-d "$_/.") {
4044 0 0       0 return -u _ ? 1 : '';
4045             }
4046             else {
4047 0         0 my $fh = gensym();
4048 0 0       0 if (_open_r($fh, $_)) {
4049 0         0 my $u = -u $fh;
4050 0         0 close $fh;
4051 0 0       0 return $u ? 1 : '';
4052             }
4053             }
4054             }
4055 0         0 return undef;
4056             }
4057              
4058             #
4059             # HP-15 file test -g $_
4060             #
4061             sub Ehp15::g_() {
4062              
4063 0 0   0 0 0 if (-e $_) {
    0          
4064 0 0       0 return -g _ ? 1 : '';
4065             }
4066             elsif (_MSWin32_5Cended_path($_)) {
4067 0 0       0 if (-d "$_/.") {
4068 0 0       0 return -g _ ? 1 : '';
4069             }
4070             else {
4071 0         0 my $fh = gensym();
4072 0 0       0 if (_open_r($fh, $_)) {
4073 0         0 my $g = -g $fh;
4074 0         0 close $fh;
4075 0 0       0 return $g ? 1 : '';
4076             }
4077             }
4078             }
4079 0         0 return undef;
4080             }
4081              
4082             #
4083             # HP-15 file test -k $_
4084             #
4085             sub Ehp15::k_() {
4086              
4087 0 0   0 0 0 if ($] =~ /^5\.008/oxms) {
4088 0 0       0 return wantarray ? ('',@_) : '';
4089             }
4090 0 0       0 return wantarray ? ($_,@_) : $_;
4091             }
4092              
4093             #
4094             # HP-15 file test -T $_
4095             #
4096             sub Ehp15::T_() {
4097              
4098 0     0 0 0 my $T = 1;
4099              
4100 0 0 0     0 if (-d $_ or -d "$_/.") {
4101 0         0 return undef;
4102             }
4103 0         0 my $fh = gensym();
4104 0 0       0 if (_open_r($fh, $_)) {
4105             }
4106             else {
4107 0         0 return undef;
4108             }
4109              
4110 0 0       0 if (sysread $fh, my $block, 512) {
4111 0 0       0 if ($block =~ /[\000\377]/oxms) {
    0          
4112 0         0 $T = '';
4113             }
4114             elsif (($block =~ tr/\000-\007\013\016-\032\034-\037\377//) * 10 > CORE::length $block) {
4115 0         0 $T = '';
4116             }
4117             }
4118              
4119             # 0 byte or eof
4120             else {
4121 0         0 $T = 1;
4122             }
4123 0         0 my $dummy_for_underline_cache = -T $fh;
4124 0         0 close $fh;
4125              
4126 0         0 return $T;
4127             }
4128              
4129             #
4130             # HP-15 file test -B $_
4131             #
4132             sub Ehp15::B_() {
4133              
4134 0     0 0 0 my $B = '';
4135              
4136 0 0 0     0 if (-d $_ or -d "$_/.") {
4137 0         0 return undef;
4138             }
4139 0         0 my $fh = gensym();
4140 0 0       0 if (_open_r($fh, $_)) {
4141             }
4142             else {
4143 0         0 return undef;
4144             }
4145              
4146 0 0       0 if (sysread $fh, my $block, 512) {
4147 0 0       0 if ($block =~ /[\000\377]/oxms) {
    0          
4148 0         0 $B = 1;
4149             }
4150             elsif (($block =~ tr/\000-\007\013\016-\032\034-\037\377//) * 10 > CORE::length $block) {
4151 0         0 $B = 1;
4152             }
4153             }
4154              
4155             # 0 byte or eof
4156             else {
4157 0         0 $B = 1;
4158             }
4159 0         0 my $dummy_for_underline_cache = -B $fh;
4160 0         0 close $fh;
4161              
4162 0         0 return $B;
4163             }
4164              
4165             #
4166             # HP-15 file test -M $_
4167             #
4168             sub Ehp15::M_() {
4169              
4170 0 0   0 0 0 if (-e $_) {
    0          
4171 0         0 return -M _;
4172             }
4173             elsif (_MSWin32_5Cended_path($_)) {
4174 0 0       0 if (-d "$_/.") {
4175 0         0 return -M _;
4176             }
4177             else {
4178 0         0 my $fh = gensym();
4179 0 0       0 if (_open_r($fh, $_)) {
4180 0         0 my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = CORE::stat $fh;
4181 0         0 close $fh;
4182 0         0 my $M = ($^T - $mtime) / (24*60*60);
4183 0         0 return $M;
4184             }
4185             }
4186             }
4187 0         0 return undef;
4188             }
4189              
4190             #
4191             # HP-15 file test -A $_
4192             #
4193             sub Ehp15::A_() {
4194              
4195 0 0   0 0 0 if (-e $_) {
    0          
4196 0         0 return -A _;
4197             }
4198             elsif (_MSWin32_5Cended_path($_)) {
4199 0 0       0 if (-d "$_/.") {
4200 0         0 return -A _;
4201             }
4202             else {
4203 0         0 my $fh = gensym();
4204 0 0       0 if (_open_r($fh, $_)) {
4205 0         0 my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = CORE::stat $fh;
4206 0         0 close $fh;
4207 0         0 my $A = ($^T - $atime) / (24*60*60);
4208 0         0 return $A;
4209             }
4210             }
4211             }
4212 0         0 return undef;
4213             }
4214              
4215             #
4216             # HP-15 file test -C $_
4217             #
4218             sub Ehp15::C_() {
4219              
4220 0 0   0 0 0 if (-e $_) {
    0          
4221 0         0 return -C _;
4222             }
4223             elsif (_MSWin32_5Cended_path($_)) {
4224 0 0       0 if (-d "$_/.") {
4225 0         0 return -C _;
4226             }
4227             else {
4228 0         0 my $fh = gensym();
4229 0 0       0 if (_open_r($fh, $_)) {
4230 0         0 my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = CORE::stat $fh;
4231 0         0 close $fh;
4232 0         0 my $C = ($^T - $ctime) / (24*60*60);
4233 0         0 return $C;
4234             }
4235             }
4236             }
4237 0         0 return undef;
4238             }
4239              
4240             #
4241             # HP-15 path globbing (with parameter)
4242             #
4243             sub Ehp15::glob($) {
4244              
4245 0 0   0 0 0 if (wantarray) {
4246 0         0 my @glob = _DOS_like_glob(@_);
4247 0         0 for my $glob (@glob) {
4248 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
4249             }
4250 0         0 return @glob;
4251             }
4252             else {
4253 0         0 my $glob = _DOS_like_glob(@_);
4254 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
4255 0         0 return $glob;
4256             }
4257             }
4258              
4259             #
4260             # HP-15 path globbing (without parameter)
4261             #
4262             sub Ehp15::glob_() {
4263              
4264 0 0   0 0 0 if (wantarray) {
4265 0         0 my @glob = _DOS_like_glob();
4266 0         0 for my $glob (@glob) {
4267 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
4268             }
4269 0         0 return @glob;
4270             }
4271             else {
4272 0         0 my $glob = _DOS_like_glob();
4273 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
4274 0         0 return $glob;
4275             }
4276             }
4277              
4278             #
4279             # HP-15 path globbing via File::DosGlob 1.10
4280             #
4281             # Often I confuse "_dosglob" and "_doglob".
4282             # So, I renamed "_dosglob" to "_DOS_like_glob".
4283             #
4284             my %iter;
4285             my %entries;
4286             sub _DOS_like_glob {
4287              
4288             # context (keyed by second cxix argument provided by core)
4289 0     0   0 my($expr,$cxix) = @_;
4290              
4291             # glob without args defaults to $_
4292 0 0       0 $expr = $_ if not defined $expr;
4293              
4294             # represents the current user's home directory
4295             #
4296             # 7.3. Expanding Tildes in Filenames
4297             # in Chapter 7. File Access
4298             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
4299             #
4300             # and File::HomeDir, File::HomeDir::Windows module
4301              
4302             # DOS-like system
4303 0 0       0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
4304 0         0 $expr =~ s{ \A ~ (?= [^/\\] ) }
  0         0  
4305             { my_home_MSWin32() }oxmse;
4306             }
4307              
4308             # UNIX-like system
4309 0 0 0     0 else {
  0         0  
4310             $expr =~ s{ \A ~ ( (?:[^\x80-\xA0\xE0-\xFE/]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])* ) }
4311             { $1 ? (CORE::eval(q{(getpwnam($1))[7]})||my_home()) : my_home() }oxmse;
4312             }
4313 0 0       0  
4314 0 0       0 # assume global context if not provided one
4315             $cxix = '_G_' if not defined $cxix;
4316             $iter{$cxix} = 0 if not exists $iter{$cxix};
4317 0 0       0  
4318 0         0 # if we're just beginning, do it all first
4319             if ($iter{$cxix} == 0) {
4320             $entries{$cxix} = [ _do_glob(1, _parse_line($expr)) ];
4321             }
4322 0 0       0  
4323 0         0 # chuck it all out, quick or slow
4324 0         0 if (wantarray) {
  0         0  
4325             delete $iter{$cxix};
4326             return @{delete $entries{$cxix}};
4327 0 0       0 }
  0         0  
4328 0         0 else {
  0         0  
4329             if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
4330             return shift @{$entries{$cxix}};
4331             }
4332 0         0 else {
4333 0         0 # return undef for EOL
4334 0         0 delete $iter{$cxix};
4335             delete $entries{$cxix};
4336             return undef;
4337             }
4338             }
4339             }
4340              
4341             #
4342             # HP-15 path globbing subroutine
4343             #
4344 0     0   0 sub _do_glob {
4345 0         0  
4346 0         0 my($cond,@expr) = @_;
4347             my @glob = ();
4348             my $fix_drive_relative_paths = 0;
4349 0         0  
4350 0 0       0 OUTER:
4351 0 0       0 for my $expr (@expr) {
4352             next OUTER if not defined $expr;
4353 0         0 next OUTER if $expr eq '';
4354 0         0  
4355 0         0 my @matched = ();
4356 0         0 my @globdir = ();
4357 0         0 my $head = '.';
4358             my $pathsep = '/';
4359             my $tail;
4360 0 0       0  
4361 0         0 # if argument is within quotes strip em and do no globbing
4362 0 0       0 if ($expr =~ /\A " ((?:$q_char)*?) " \z/oxms) {
4363 0 0       0 $expr = $1;
4364 0         0 if ($cond eq 'd') {
4365             if (Ehp15::d $expr) {
4366             push @glob, $expr;
4367             }
4368 0 0       0 }
4369 0         0 else {
4370             if (Ehp15::e $expr) {
4371             push @glob, $expr;
4372 0         0 }
4373             }
4374             next OUTER;
4375             }
4376              
4377 0 0       0 # wildcards with a drive prefix such as h:*.pm must be changed
4378 0 0       0 # to h:./*.pm to expand correctly
4379 0         0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
4380             if ($expr =~ s# \A ((?:[A-Za-z]:)?) ([^\x80-\xA0\xE0-\xFE/\\]|[\x80-\xA0\xE0-\xFE][\x00-\xFF]) #$1./$2#oxms) {
4381             $fix_drive_relative_paths = 1;
4382             }
4383 0 0       0 }
4384 0 0       0  
4385 0         0 if (($head, $tail) = _parse_path($expr,$pathsep)) {
4386 0         0 if ($tail eq '') {
4387             push @glob, $expr;
4388 0 0       0 next OUTER;
4389 0 0       0 }
4390 0         0 if ($head =~ / \A (?:$q_char)*? [*?] /oxms) {
  0         0  
4391 0         0 if (@globdir = _do_glob('d', $head)) {
4392             push @glob, _do_glob($cond, map {"$_$pathsep$tail"} @globdir);
4393             next OUTER;
4394 0 0 0     0 }
4395 0         0 }
4396             if ($head eq '' or $head =~ /\A [A-Za-z]: \z/oxms) {
4397 0         0 $head .= $pathsep;
4398             }
4399             $expr = $tail;
4400             }
4401 0 0       0  
4402 0 0       0 # If file component has no wildcards, we can avoid opendir
4403 0         0 if ($expr !~ / \A (?:$q_char)*? [*?] /oxms) {
4404             if ($head eq '.') {
4405 0 0 0     0 $head = '';
4406 0         0 }
4407             if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
4408 0         0 $head .= $pathsep;
4409 0 0       0 }
4410 0 0       0 $head .= $expr;
4411 0         0 if ($cond eq 'd') {
4412             if (Ehp15::d $head) {
4413             push @glob, $head;
4414             }
4415 0 0       0 }
4416 0         0 else {
4417             if (Ehp15::e $head) {
4418             push @glob, $head;
4419 0         0 }
4420             }
4421 0 0       0 next OUTER;
4422 0         0 }
4423 0         0 Ehp15::opendir(*DIR, $head) or next OUTER;
4424             my @leaf = readdir DIR;
4425 0 0       0 closedir DIR;
4426 0         0  
4427             if ($head eq '.') {
4428 0 0 0     0 $head = '';
4429 0         0 }
4430             if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
4431             $head .= $pathsep;
4432 0         0 }
4433 0         0  
4434 0         0 my $pattern = '';
4435             while ($expr =~ / \G ($q_char) /oxgc) {
4436             my $char = $1;
4437              
4438             # 6.9. Matching Shell Globs as Regular Expressions
4439             # in Chapter 6. Pattern Matching
4440             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
4441 0 0       0 # (and so on)
    0          
    0          
4442 0         0  
4443             if ($char eq '*') {
4444             $pattern .= "(?:$your_char)*",
4445 0         0 }
4446             elsif ($char eq '?') {
4447             $pattern .= "(?:$your_char)?", # DOS style
4448             # $pattern .= "(?:$your_char)", # UNIX style
4449 0         0 }
4450             elsif ((my $fc = Ehp15::fc($char)) ne $char) {
4451             $pattern .= $fc;
4452 0         0 }
4453             else {
4454             $pattern .= quotemeta $char;
4455 0     0   0 }
  0         0  
4456             }
4457             my $matchsub = sub { Ehp15::fc($_[0]) =~ /\A $pattern \z/xms };
4458              
4459             # if ($@) {
4460             # print STDERR "$0: $@\n";
4461             # next OUTER;
4462             # }
4463 0         0  
4464 0 0 0     0 INNER:
4465 0         0 for my $leaf (@leaf) {
4466             if ($leaf eq '.' or $leaf eq '..') {
4467 0 0 0     0 next INNER;
4468 0         0 }
4469             if ($cond eq 'd' and not Ehp15::d "$head$leaf") {
4470             next INNER;
4471 0 0       0 }
4472 0         0  
4473 0         0 if (&$matchsub($leaf)) {
4474             push @matched, "$head$leaf";
4475             next INNER;
4476             }
4477              
4478             # [DOS compatibility special case]
4479 0 0 0     0 # Failed, add a trailing dot and try again, but only...
      0        
4480              
4481             if (Ehp15::index($leaf,'.') == -1 and # if name does not have a dot in it *and*
4482             CORE::length($leaf) <= 8 and # name is shorter than or equal to 8 chars *and*
4483 0 0       0 Ehp15::index($pattern,'\\.') != -1 # pattern has a dot.
4484 0         0 ) {
4485 0         0 if (&$matchsub("$leaf.")) {
4486             push @matched, "$head$leaf";
4487             next INNER;
4488             }
4489 0 0       0 }
4490 0         0 }
4491             if (@matched) {
4492             push @glob, @matched;
4493 0 0       0 }
4494 0         0 }
4495 0         0 if ($fix_drive_relative_paths) {
4496             for my $glob (@glob) {
4497             $glob =~ s# \A ([A-Za-z]:) \./ #$1#oxms;
4498 0         0 }
4499             }
4500             return @glob;
4501             }
4502              
4503             #
4504             # HP-15 parse line
4505             #
4506 0     0   0 sub _parse_line {
4507              
4508 0         0 my($line) = @_;
4509 0         0  
4510 0         0 $line .= ' ';
4511             my @piece = ();
4512             while ($line =~ /
4513             " ( (?>(?: [^\x80-\xA0\xE0-\xFE"] |[\x80-\xA0\xE0-\xFE][\x00-\xFF] )* ) ) " (?>\s+) |
4514             ( (?>(?: [^\x80-\xA0\xE0-\xFE"\s]|[\x80-\xA0\xE0-\xFE][\x00-\xFF] )* ) ) (?>\s+)
4515 0 0       0 /oxmsg
4516             ) {
4517 0         0 push @piece, defined($1) ? $1 : $2;
4518             }
4519             return @piece;
4520             }
4521              
4522             #
4523             # HP-15 parse path
4524             #
4525 0     0   0 sub _parse_path {
4526              
4527 0         0 my($path,$pathsep) = @_;
4528 0         0  
4529 0         0 $path .= '/';
4530             my @subpath = ();
4531             while ($path =~ /
4532             ((?: [^\x80-\xA0\xE0-\xFE\/\\]|[\x80-\xA0\xE0-\xFE][\x00-\xFF] )+?) [\/\\]
4533 0         0 /oxmsg
4534             ) {
4535             push @subpath, $1;
4536 0         0 }
4537 0         0  
4538 0         0 my $tail = pop @subpath;
4539             my $head = join $pathsep, @subpath;
4540             return $head, $tail;
4541             }
4542              
4543             #
4544             # via File::HomeDir::Windows 1.00
4545             #
4546             sub my_home_MSWin32 {
4547              
4548             # A lot of unix people and unix-derived tools rely on
4549 0 0 0 0 0 0 # the ability to overload HOME. We will support it too
    0 0        
    0 0        
      0        
      0        
4550 0         0 # so that they can replace raw HOME calls with File::HomeDir.
4551             if (exists $ENV{'HOME'} and $ENV{'HOME'}) {
4552             return $ENV{'HOME'};
4553             }
4554              
4555 0         0 # Do we have a user profile?
4556             elsif (exists $ENV{'USERPROFILE'} and $ENV{'USERPROFILE'}) {
4557             return $ENV{'USERPROFILE'};
4558             }
4559              
4560 0         0 # Some Windows use something like $ENV{'HOME'}
4561             elsif (exists $ENV{'HOMEDRIVE'} and exists $ENV{'HOMEPATH'} and $ENV{'HOMEDRIVE'} and $ENV{'HOMEPATH'}) {
4562             return join '', $ENV{'HOMEDRIVE'}, $ENV{'HOMEPATH'};
4563 0         0 }
4564              
4565             return undef;
4566             }
4567              
4568             #
4569             # via File::HomeDir::Unix 1.00
4570 0     0 0 0 #
4571             sub my_home {
4572 0 0 0     0 my $home;
    0 0        
4573 0         0  
4574             if (exists $ENV{'HOME'} and defined $ENV{'HOME'}) {
4575             $home = $ENV{'HOME'};
4576             }
4577              
4578             # This is from the original code, but I'm guessing
4579 0         0 # it means "login directory" and exists on some Unixes.
4580             elsif (exists $ENV{'LOGDIR'} and $ENV{'LOGDIR'}) {
4581             $home = $ENV{'LOGDIR'};
4582             }
4583              
4584             ### More-desperate methods
4585              
4586 0         0 # Light desperation on any (Unixish) platform
4587             else {
4588             $home = CORE::eval q{ (getpwuid($<))[7] };
4589             }
4590              
4591 0 0 0     0 # On Unix in general, a non-existant home means "no home"
4592 0         0 # For example, "nobody"-like users might use /nonexistant
4593             if (defined $home and ! Ehp15::d($home)) {
4594 0         0 $home = undef;
4595             }
4596             return $home;
4597             }
4598              
4599             #
4600             # HP-15 file lstat (with parameter)
4601             #
4602 0 0   0 0 0 sub Ehp15::lstat(*) {
4603              
4604 0 0       0 local $_ = shift if @_;
    0          
4605 0         0  
4606             if (-e $_) {
4607             return CORE::lstat _;
4608             }
4609             elsif (_MSWin32_5Cended_path($_)) {
4610              
4611             # Even if ${^WIN32_SLOPPY_STAT} is set to a true value, Ehp15::lstat()
4612             # on Windows opens the file for the path which has 5c at end.
4613 0         0 # (and so on)
4614 0 0       0  
4615 0 0       0 local *MUST_BE_BAREWORD_AT_HERE;
4616 0         0 if (CORE::open(MUST_BE_BAREWORD_AT_HERE, $_)) {
4617 0         0 if (wantarray) {
4618 0         0 my @stat = CORE::stat MUST_BE_BAREWORD_AT_HERE; # not CORE::lstat
4619             close MUST_BE_BAREWORD_AT_HERE;
4620             return @stat;
4621 0         0 }
4622 0         0 else {
4623 0         0 my $stat = CORE::stat MUST_BE_BAREWORD_AT_HERE; # not CORE::lstat
4624             close MUST_BE_BAREWORD_AT_HERE;
4625             return $stat;
4626             }
4627 0 0       0 }
4628             }
4629             return wantarray ? () : undef;
4630             }
4631              
4632             #
4633             # HP-15 file lstat (without parameter)
4634             #
4635 0 0   0 0 0 sub Ehp15::lstat_() {
    0          
4636 0         0  
4637             if (-e $_) {
4638             return CORE::lstat _;
4639 0         0 }
4640 0 0       0 elsif (_MSWin32_5Cended_path($_)) {
4641 0 0       0 local *MUST_BE_BAREWORD_AT_HERE;
4642 0         0 if (CORE::open(MUST_BE_BAREWORD_AT_HERE, $_)) {
4643 0         0 if (wantarray) {
4644 0         0 my @stat = CORE::stat MUST_BE_BAREWORD_AT_HERE; # not CORE::lstat
4645             close MUST_BE_BAREWORD_AT_HERE;
4646             return @stat;
4647 0         0 }
4648 0         0 else {
4649 0         0 my $stat = CORE::stat MUST_BE_BAREWORD_AT_HERE; # not CORE::lstat
4650             close MUST_BE_BAREWORD_AT_HERE;
4651             return $stat;
4652             }
4653 0 0       0 }
4654             }
4655             return wantarray ? () : undef;
4656             }
4657              
4658             #
4659             # HP-15 path opendir
4660             #
4661 0     0 0 0 sub Ehp15::opendir(*$) {
4662 0 0       0  
    0          
4663 0         0 my $dh = qualify_to_ref $_[0];
4664             if (CORE::opendir $dh, $_[1]) {
4665             return 1;
4666 0 0       0 }
4667 0         0 elsif (_MSWin32_5Cended_path($_[1])) {
4668             if (CORE::opendir $dh, "$_[1]/.") {
4669             return 1;
4670 0         0 }
4671             }
4672             return undef;
4673             }
4674              
4675             #
4676             # HP-15 file stat (with parameter)
4677             #
4678 0 50   384 0 0 sub Ehp15::stat(*) {
4679              
4680 384         2331 local $_ = shift if @_;
4681 384 50       2647  
    50          
    0          
4682 384         12735 my $fh = qualify_to_ref $_;
4683             if (defined fileno $fh) {
4684             return CORE::stat $fh;
4685 0         0 }
4686             elsif (-e $_) {
4687             return CORE::stat _;
4688             }
4689             elsif (_MSWin32_5Cended_path($_)) {
4690              
4691             # Even if ${^WIN32_SLOPPY_STAT} is set to a true value, Ehp15::stat()
4692             # on Windows opens the file for the path which has 5c at end.
4693 384         3485 # (and so on)
4694 0 0       0  
4695 0 0       0 local *MUST_BE_BAREWORD_AT_HERE;
4696 0         0 if (CORE::open(MUST_BE_BAREWORD_AT_HERE, $_)) {
4697 0         0 if (wantarray) {
4698 0         0 my @stat = CORE::stat MUST_BE_BAREWORD_AT_HERE;
4699             close MUST_BE_BAREWORD_AT_HERE;
4700             return @stat;
4701 0         0 }
4702 0         0 else {
4703 0         0 my $stat = CORE::stat MUST_BE_BAREWORD_AT_HERE;
4704             close MUST_BE_BAREWORD_AT_HERE;
4705             return $stat;
4706             }
4707 0 0       0 }
4708             }
4709             return wantarray ? () : undef;
4710             }
4711              
4712             #
4713             # HP-15 file stat (without parameter)
4714             #
4715 0     0 0 0 sub Ehp15::stat_() {
4716 0 0       0  
    0          
    0          
4717 0         0 my $fh = qualify_to_ref $_;
4718             if (defined fileno $fh) {
4719             return CORE::stat $fh;
4720 0         0 }
4721             elsif (-e $_) {
4722             return CORE::stat _;
4723 0         0 }
4724 0 0       0 elsif (_MSWin32_5Cended_path($_)) {
4725 0 0       0 local *MUST_BE_BAREWORD_AT_HERE;
4726 0         0 if (CORE::open(MUST_BE_BAREWORD_AT_HERE, $_)) {
4727 0         0 if (wantarray) {
4728 0         0 my @stat = CORE::stat MUST_BE_BAREWORD_AT_HERE;
4729             close MUST_BE_BAREWORD_AT_HERE;
4730             return @stat;
4731 0         0 }
4732 0         0 else {
4733 0         0 my $stat = CORE::stat MUST_BE_BAREWORD_AT_HERE;
4734             close MUST_BE_BAREWORD_AT_HERE;
4735             return $stat;
4736             }
4737 0 0       0 }
4738             }
4739             return wantarray ? () : undef;
4740             }
4741              
4742             #
4743             # HP-15 path unlink
4744             #
4745 0 0   0 0 0 sub Ehp15::unlink(@) {
4746              
4747 0         0 local @_ = ($_) unless @_;
4748 0         0  
4749 0 0       0 my $unlink = 0;
    0          
    0          
4750 0         0 for (@_) {
4751             if (CORE::unlink) {
4752             $unlink++;
4753             }
4754             elsif (Ehp15::d($_)) {
4755 0         0 }
4756 0 0       0 elsif (_MSWin32_5Cended_path($_)) {
  0         0  
4757 0 0       0 my @char = /\G (?>$q_char) /oxmsg;
4758 0         0 my $file = join '', map {{'/' => '\\'}->{$_} || $_} @char;
4759             if ($file =~ / \A (?:$q_char)*? [ ] /oxms) {
4760 0         0 $file = qq{"$file"};
4761 0 0       0 }
4762 0         0 my $fh = gensym();
4763             if (_open_r($fh, $_)) {
4764             close $fh;
4765 0 0 0     0  
    0          
4766 0         0 # cmd.exe on Windows NT, Windows 2000, Windows XP, Windows Vista, Windows 7, Windows 8, Windows 8.1, Windows 10 or later
4767             if ((defined $ENV{'OS'}) and ($ENV{'OS'} eq 'Windows_NT')) {
4768             CORE::system 'DEL', '/F', $file, '2>NUL';
4769             }
4770              
4771 0         0 # Win95Cmd.exe on any Windows (when SET PERL5SHELL=Win95Cmd.exe /c, `var` returns "Windows 2000")
4772             elsif (qx{ver} =~ /\b(?:Windows 2000)\b/oms) {
4773             CORE::system 'DEL', '/F', $file, '2>NUL';
4774             }
4775              
4776             # COMMAND.COM on Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition
4777 0         0 # command.com can not "2>NUL"
4778 0         0 else {
4779             CORE::system 'ATTRIB', '-R', $file; # clears Read-only file attribute
4780             CORE::system 'DEL', $file;
4781 0 0       0 }
4782 0         0  
4783             if (_open_r($fh, $_)) {
4784             close $fh;
4785 0         0 }
4786             else {
4787             $unlink++;
4788             }
4789             }
4790 0         0 }
4791             }
4792             return $unlink;
4793             }
4794              
4795             #
4796             # HP-15 chdir
4797             #
4798 0 0   0 0 0 sub Ehp15::chdir(;$) {
4799 0         0  
4800             if (@_ == 0) {
4801             return CORE::chdir;
4802 0         0 }
4803              
4804 0 0       0 my($dir) = @_;
4805 0 0       0  
4806 0         0 if (_MSWin32_5Cended_path($dir)) {
4807             if (not Ehp15::d $dir) {
4808             return 0;
4809 0 0 0     0 }
    0          
4810 0         0  
4811             if ($] =~ /^5\.005/oxms) {
4812             return CORE::chdir $dir;
4813 0         0 }
4814 0         0 elsif (($] =~ /^(?:5\.006|5\.008000)/oxms) and ($^O eq 'MSWin32')) {
4815             local $@;
4816             my $chdir = CORE::eval q{
4817             CORE::require 'jacode.pl';
4818              
4819             # P.676 ${^WIDE_SYSTEM_CALLS}
4820             # in Chapter 28: Special Names
4821             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4822              
4823             # P.790 ${^WIDE_SYSTEM_CALLS}
4824             # in Chapter 25: Special Names
4825             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4826              
4827             local ${^WIDE_SYSTEM_CALLS} = 1;
4828 0 0       0 return CORE::chdir jcode::utf8($dir,'sjis');
4829 0         0 };
4830             if (not $@) {
4831             return $chdir;
4832             }
4833             }
4834              
4835             # old idea (Win32 module required)
4836             elsif (0) {
4837             local $@;
4838             my $shortdir = '';
4839             my $chdir = CORE::eval q{
4840             use Win32;
4841             $shortdir = Win32::GetShortPathName($dir);
4842             if ($shortdir ne $dir) {
4843             return CORE::chdir $shortdir;
4844             }
4845             else {
4846             return 0;
4847             }
4848             };
4849             if ($@) {
4850             my @char = $dir =~ /\G (?>$q_char) /oxmsg;
4851             while ($char[-1] eq "\x5C") {
4852             pop @char;
4853             }
4854             $dir = join '', @char;
4855             croak "Perl$] can't chdir to $dir (chr(0x5C) ended path), Win32.pm module may help you";
4856             }
4857             elsif ($shortdir eq $dir) {
4858             my @char = $dir =~ /\G (?>$q_char) /oxmsg;
4859             while ($char[-1] eq "\x5C") {
4860             pop @char;
4861             }
4862             $dir = join '', @char;
4863             croak "Perl$] can't chdir to $dir (chr(0x5C) ended path)";
4864             }
4865             return $chdir;
4866             }
4867 0         0  
4868             # rejected idea ...
4869             elsif (0) {
4870              
4871             # MSDN SetCurrentDirectory function
4872             # http://msdn.microsoft.com/ja-jp/library/windows/desktop/aa365530(v=vs.85).aspx
4873             #
4874             # Data Execution Prevention (DEP)
4875             # http://vlaurie.com/computers2/Articles/dep.htm
4876             #
4877             # Learning x86 assembler with Perl -- Shibuya.pm#11
4878             # http://developer.cybozu.co.jp/takesako/2009/06/perl-x86-shibuy.html
4879             #
4880             # Introduction to Win32::API programming in Perl
4881             # http://d.hatena.ne.jp/TAKESAKO/20090324/1237879559
4882             #
4883             # DynaLoader - Dynamically load C libraries into Perl code
4884             # http://perldoc.perl.org/DynaLoader.html
4885             #
4886             # Basic knowledge of DynaLoader
4887             # http://blog.64p.org/entry/20090313/1236934042
4888              
4889             if (($] =~ /^5\.006/oxms) and
4890             ($^O eq 'MSWin32') and
4891             ($ENV{'PROCESSOR_ARCHITECTURE'} eq 'x86') and
4892             CORE::eval(q{CORE::require 'Dyna'.'Loader'})
4893             ) {
4894             my $x86 = join('',
4895              
4896             # PUSH Iv
4897             "\x68", pack('P', "$dir\\\0"),
4898              
4899             # MOV eAX, Iv
4900             "\xb8", pack('L',
4901             *{'Dyna'.'Loader::dl_find_symbol'}{'CODE'}->(
4902             *{'Dyna'.'Loader::dl_load_file'}{'CODE'}->("$ENV{'SystemRoot'}\\system32\\kernel32.dll"),
4903             'SetCurrentDirectoryA'
4904             )
4905             ),
4906              
4907             # CALL eAX
4908             "\xff\xd0",
4909              
4910             # RETN
4911             "\xc3",
4912             );
4913             *{'Dyna'.'Loader::dl_install_xsub'}{'CODE'}->('_SetCurrentDirectoryA', unpack('L', pack 'P', $x86));
4914             _SetCurrentDirectoryA();
4915             chomp(my $chdir = qx{chdir});
4916             if (Ehp15::fc($chdir) eq Ehp15::fc($dir)) {
4917             return 1;
4918             }
4919             else {
4920             return 0;
4921             }
4922             }
4923             }
4924              
4925             # COMMAND.COM's unhelpful tips:
4926             # Displays a list of files and subdirectories in a directory.
4927             # http://www.lagmonster.org/docs/DOS7/z-dir.html
4928             #
4929             # Syntax:
4930             #
4931             # DIR [drive:] [path] [filename] [/Switches]
4932             #
4933             # /Z Long file names are not displayed in the file listing
4934             #
4935             # Limitations
4936             # The undocumented /Z switch (no long names) would appear to
4937             # have been not fully developed and has a couple of problems:
4938             #
4939             # 1. It will only work if:
4940             # There is no path specified (ie. for the current directory in
4941             # the current drive)
4942             # The path is specified as the root directory of any drive
4943             # (eg. C:\, D:\, etc.)
4944             # The path is specified as the current directory of any drive
4945             # by using the drive letter only (eg. C:, D:, etc.)
4946             # The path is specified as the parent directory using the ..
4947             # notation (eg. DIR .. /Z)
4948             # Any other syntax results in a "File Not Found" error message.
4949             #
4950             # 2. The /Z switch is compatable with the /S switch to show
4951             # subdirectories (as long as the above rules are followed) and
4952             # all the files are shown with short names only. The
4953             # subdirectories are also shown with short names only. However,
4954             # the header for each subdirectory after the first level gives
4955             # the subdirectory's long name.
4956             #
4957             # 3. The /Z switch is also compatable with the /B switch to give
4958             # a simple list of files with short names only. When used with
4959             # the /S switch as well, all files are listed with their full
4960             # paths. The file names themselves are all in short form, and
4961             # the path of those files in the current directory are in short
4962             # form, but the paths of any files in subdirectories are in
4963 0         0 # long filename form.
4964 0         0  
4965 0         0 my $shortdir = '';
4966 0         0 my $i = 0;
4967 0         0 my @subdir = ();
4968 0 0 0     0 while ($dir =~ / \G ($q_char) /oxgc) {
4969 0         0 my $char = $1;
4970 0         0 if (($char eq '\\') or ($char eq '/')) {
4971 0         0 $i++;
4972             $subdir[$i] = $char;
4973             $i++;
4974 0         0 }
4975             else {
4976             $subdir[$i] .= $char;
4977 0 0 0     0 }
4978 0         0 }
4979             if (($subdir[-1] eq '\\') or ($subdir[-1] eq '/')) {
4980             pop @subdir;
4981             }
4982              
4983             # P.504 PERL5SHELL (Microsoft ports only)
4984             # in Chapter 19: The Command-Line Interface
4985             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4986              
4987             # P.597 PERL5SHELL (Microsoft ports only)
4988             # in Chapter 17: The Command-Line Interface
4989             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4990              
4991 0 0 0     0 # Win95Cmd.exe on any Windows (when SET PERL5SHELL=Win95Cmd.exe /c, `var` returns "Windows 2000")
    0          
4992 0         0 # cmd.exe on Windows NT, Windows 2000
4993 0         0 if (qx{ver} =~ /\b(?:Windows NT|Windows 2000)\b/oms) {
  0         0  
4994 0 0       0 chomp(my @dirx = grep //oxms, qx{dir /ad /x "$dir*" 2>NUL});
4995             for my $dirx (sort { CORE::length($a) <=> CORE::length($b) } @dirx) {
4996             if (Ehp15::fc(CORE::substr $dirx,-CORE::length($subdir[-1]),CORE::length($subdir[-1])) eq Ehp15::fc($subdir[-1])) {
4997 0         0  
4998 0         0 # short file name (8dot3name) here-----vv
4999 0         0 my $shortleafdir = CORE::substr $dirx, 39, 8+1+3;
5000 0         0 $shortleafdir =~ s/ [ ]+ \z//oxms;
5001             $shortdir = join '', @subdir[0..$#subdir-1], $shortleafdir;
5002             last;
5003             }
5004             }
5005             }
5006              
5007             # an idea (not so portable, only Windows 2000 or later)
5008             elsif (0) {
5009             chomp($shortdir = qx{for %I in ("$dir") do \@echo %~sI 2>NUL});
5010             }
5011              
5012 0         0 # cmd.exe on Windows XP, Windows Vista, Windows 7, Windows 8, Windows 8.1, Windows 10 or later
5013 0         0 elsif ((defined $ENV{'OS'}) and ($ENV{'OS'} eq 'Windows_NT')) {
  0         0  
5014 0 0       0 chomp(my @dirx = grep //oxms, qx{dir /ad /x "$dir*" 2>NUL});
5015             for my $dirx (sort { CORE::length($a) <=> CORE::length($b) } @dirx) {
5016             if (Ehp15::fc(CORE::substr $dirx,-CORE::length($subdir[-1]),CORE::length($subdir[-1])) eq Ehp15::fc($subdir[-1])) {
5017 0         0  
5018 0         0 # short file name (8dot3name) here-----vv
5019 0         0 my $shortleafdir = CORE::substr $dirx, 36, 8+1+3;
5020 0         0 $shortleafdir =~ s/ [ ]+ \z//oxms;
5021             $shortdir = join '', @subdir[0..$#subdir-1], $shortleafdir;
5022             last;
5023             }
5024             }
5025             }
5026              
5027 0         0 # COMMAND.COM on Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition
5028 0         0 else {
  0         0  
5029 0 0       0 chomp(my @dirx = grep //oxms, qx{dir /ad "$dir*"});
5030             for my $dirx (sort { CORE::length($a) <=> CORE::length($b) } @dirx) {
5031             if (Ehp15::fc(CORE::substr $dirx,-CORE::length($subdir[-1]),CORE::length($subdir[-1])) eq Ehp15::fc($subdir[-1])) {
5032 0         0  
5033 0         0 # short file name (8dot3name) here-----v
5034 0         0 my $shortleafdir = CORE::substr $dirx, 0, 8+1+3;
5035 0         0 CORE::substr($shortleafdir,8,1) = '.';
5036 0         0 $shortleafdir =~ s/ \. [ ]+ \z//oxms;
5037             $shortdir = join '', @subdir[0..$#subdir-1], $shortleafdir;
5038             last;
5039             }
5040             }
5041 0 0       0 }
    0          
5042 0         0  
5043             if ($shortdir eq '') {
5044             return 0;
5045 0         0 }
5046             elsif (Ehp15::fc($shortdir) eq Ehp15::fc($dir)) {
5047 0         0 return 0;
5048             }
5049             return CORE::chdir $shortdir;
5050 0         0 }
5051             else {
5052             return CORE::chdir $dir;
5053             }
5054             }
5055              
5056             #
5057             # HP-15 chr(0x5C) ended path on MSWin32
5058             #
5059 0 50 33 768   0 sub _MSWin32_5Cended_path {
5060 768 50       5327  
5061 768         4495 if ((@_ >= 1) and ($_[0] ne '')) {
5062 0 0       0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
5063 0         0 my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
5064             if ($char[-1] =~ / \x5C \z/oxms) {
5065             return 1;
5066             }
5067 0         0 }
5068             }
5069             return undef;
5070             }
5071              
5072             #
5073             # do HP-15 file
5074             #
5075 768     0 0 1893 sub Ehp15::do($) {
5076              
5077 0         0 my($filename) = @_;
5078              
5079             my $realfilename;
5080             my $result;
5081 0         0 ITER_DO:
  0         0  
5082 0 0       0 {
5083 0         0 for my $prefix (@INC) {
5084             if ($^O eq 'MacOS') {
5085             $realfilename = "$prefix$filename";
5086 0         0 }
5087             else {
5088             $realfilename = "$prefix/$filename";
5089 0 0       0 }
5090              
5091 0         0 if (Ehp15::f($realfilename)) {
5092              
5093 0 0       0 my $script = '';
5094 0         0  
5095 0         0 if (Ehp15::e("$realfilename.e")) {
5096 0         0 my $e_mtime = (Ehp15::stat("$realfilename.e"))[9];
5097 0 0 0     0 my $mtime = (Ehp15::stat($realfilename))[9];
5098 0         0 my $module_mtime = (Ehp15::stat(__FILE__))[9];
5099             if (($e_mtime < $mtime) or ($mtime < $module_mtime)) {
5100             Ehp15::unlink "$realfilename.e";
5101             }
5102 0 0       0 }
5103 0         0  
5104 0 0       0 if (Ehp15::e("$realfilename.e")) {
5105 0 0       0 my $fh = gensym();
    0          
5106 0         0 if (_open_r($fh, "$realfilename.e")) {
5107             if ($^O eq 'MacOS') {
5108             CORE::eval q{
5109             CORE::require Mac::Files;
5110             Mac::Files::FSpSetFLock("$realfilename.e");
5111             };
5112             }
5113             elsif (exists $ENV{'CHAR_NONBLOCK'}) {
5114              
5115             # P.419 File Locking
5116             # in Chapter 16: Interprocess Communication
5117             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
5118              
5119             # P.524 File Locking
5120             # in Chapter 15: Interprocess Communication
5121             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5122              
5123 0         0 # (and so on)
5124 0 0       0  
5125 0         0 CORE::eval q{ flock($fh, LOCK_SH | LOCK_NB) };
5126             if ($@) {
5127             carp "Can't immediately read-lock the file: $realfilename.e";
5128             }
5129 0         0 }
5130             else {
5131 0         0 CORE::eval q{ flock($fh, LOCK_SH) };
5132 0         0 }
5133 0 0       0 local $/ = undef; # slurp mode
5134 0         0 $script = <$fh>;
5135             if ($^O eq 'MacOS') {
5136             CORE::eval q{
5137             CORE::require Mac::Files;
5138             Mac::Files::FSpRstFLock("$realfilename.e");
5139 0         0 };
5140             }
5141             close $fh;
5142             }
5143 0         0 }
5144 0 0       0 else {
5145 0 0       0 my $fh = gensym();
    0          
5146 0         0 if (_open_r($fh, $realfilename)) {
5147             if ($^O eq 'MacOS') {
5148             CORE::eval q{
5149             CORE::require Mac::Files;
5150             Mac::Files::FSpSetFLock($realfilename);
5151             };
5152 0         0 }
5153 0 0       0 elsif (exists $ENV{'CHAR_NONBLOCK'}) {
5154 0         0 CORE::eval q{ flock($fh, LOCK_SH | LOCK_NB) };
5155             if ($@) {
5156             carp "Can't immediately read-lock the file: $realfilename";
5157             }
5158 0         0 }
5159             else {
5160 0         0 CORE::eval q{ flock($fh, LOCK_SH) };
5161 0         0 }
5162 0 0       0 local $/ = undef; # slurp mode
5163 0         0 $script = <$fh>;
5164             if ($^O eq 'MacOS') {
5165             CORE::eval q{
5166             CORE::require Mac::Files;
5167             Mac::Files::FSpRstFLock($realfilename);
5168 0         0 };
5169             }
5170             close $fh;
5171 0 0       0 }
5172 0         0  
5173 0         0 if ($script =~ /^ (?>\s*) use (?>\s+) HP15 (?>\s*) ([^\x80-\xA0\xE0-\xFE;]*) ; (?>\s*) \n? $/oxms) {
5174 0         0 CORE::require HP15;
5175 0 0       0 $script = HP15::escape_script($script);
5176 0 0       0 my $fh = gensym();
    0          
5177 0         0 open($fh, ">$realfilename.e") or die __FILE__, ": Can't write open file: $realfilename.e\n";
5178             if ($^O eq 'MacOS') {
5179             CORE::eval q{
5180             CORE::require Mac::Files;
5181             Mac::Files::FSpSetFLock("$realfilename.e");
5182             };
5183 0         0 }
5184 0 0       0 elsif (exists $ENV{'CHAR_NONBLOCK'}) {
5185 0         0 CORE::eval q{ flock($fh, LOCK_EX | LOCK_NB) };
5186             if ($@) {
5187             carp "Can't immediately write-lock the file: $realfilename.e";
5188             }
5189 0         0 }
5190             else {
5191 0         0 CORE::eval q{ flock($fh, LOCK_EX) };
5192 0 0       0 }
5193 0         0 CORE::eval q{ truncate($fh, 0) };
  0         0  
5194 0 0       0 seek($fh, 0, 0) or croak "Can't seek file: $realfilename.e";
5195 0         0 print {$fh} $script;
5196             if ($^O eq 'MacOS') {
5197             CORE::eval q{
5198             CORE::require Mac::Files;
5199             Mac::Files::FSpRstFLock("$realfilename.e");
5200 0         0 };
5201             }
5202             close $fh;
5203             }
5204             }
5205 389     389   14279  
  389         1121  
  389         430780  
  0         0  
5206 0         0 {
5207             no strict;
5208 0         0 $result = scalar CORE::eval $script;
5209             }
5210             last ITER_DO;
5211             }
5212             }
5213 0 0       0 }
    0          
5214 0         0  
5215 0         0 if ($@) {
5216             $INC{$filename} = undef;
5217             return undef;
5218 0         0 }
5219             elsif (not $result) {
5220             return undef;
5221 0         0 }
5222 0         0 else {
5223             $INC{$filename} = $realfilename;
5224             return $result;
5225             }
5226             }
5227              
5228             #
5229             # require HP-15 file
5230             #
5231              
5232             # require
5233             # in Chapter 3: Functions
5234             # of ISBN 1-56592-149-6 Programming Perl, Second Edition.
5235             #
5236             # sub require {
5237             # my($filename) = @_;
5238             # return 1 if $INC{$filename};
5239             # my($realfilename, $result);
5240             # ITER: {
5241             # foreach $prefix (@INC) {
5242             # $realfilename = "$prefix/$filename";
5243             # if (-f $realfilename) {
5244             # $result = CORE::eval `cat $realfilename`;
5245             # last ITER;
5246             # }
5247             # }
5248             # die "Can't find $filename in \@INC";
5249             # }
5250             # die $@ if $@;
5251             # die "$filename did not return true value" unless $result;
5252             # $INC{$filename} = $realfilename;
5253             # return $result;
5254             # }
5255              
5256             # require
5257             # in Chapter 9: perlfunc: Perl builtin functions
5258             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
5259             #
5260             # sub require {
5261             # my($filename) = @_;
5262             # if (exists $INC{$filename}) {
5263             # return 1 if $INC{$filename};
5264             # die "Compilation failed in require";
5265             # }
5266             # my($realfilename, $result);
5267             # ITER: {
5268             # foreach $prefix (@INC) {
5269             # $realfilename = "$prefix/$filename";
5270             # if (-f $realfilename) {
5271             # $INC{$filename} = $realfilename;
5272             # $result = do $realfilename;
5273             # last ITER;
5274             # }
5275             # }
5276             # die "Can't find $filename in \@INC";
5277             # }
5278             # if ($@) {
5279             # $INC{$filename} = undef;
5280             # die $@;
5281             # }
5282             # elsif (!$result) {
5283             # delete $INC{$filename};
5284             # die "$filename did not return true value";
5285             # }
5286             # else {
5287             # return $result;
5288             # }
5289             # }
5290              
5291 0 0   0 0 0 sub Ehp15::require(;$) {
5292              
5293 0 0       0 local $_ = shift if @_;
5294 0 0       0  
5295 0         0 if (exists $INC{$_}) {
5296             return 1 if $INC{$_};
5297             croak "Compilation failed in require: $_";
5298             }
5299              
5300             # jcode.pl
5301             # ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/
5302              
5303             # jacode.pl
5304 0 0       0 # http://search.cpan.org/dist/jacode/
5305 0         0  
5306             if (/ \b (?: jcode\.pl | jacode(?>[0-9]*)\.pl ) \z /oxms) {
5307             return CORE::require($_);
5308 0         0 }
5309              
5310             my $realfilename;
5311             my $result;
5312 0         0 ITER_REQUIRE:
  0         0  
5313 0 0       0 {
5314 0         0 for my $prefix (@INC) {
5315             if ($^O eq 'MacOS') {
5316             $realfilename = "$prefix$_";
5317 0         0 }
5318             else {
5319             $realfilename = "$prefix/$_";
5320 0 0       0 }
5321 0         0  
5322             if (Ehp15::f($realfilename)) {
5323 0         0 $INC{$_} = $realfilename;
5324              
5325 0 0       0 my $script = '';
5326 0         0  
5327 0         0 if (Ehp15::e("$realfilename.e")) {
5328 0         0 my $e_mtime = (Ehp15::stat("$realfilename.e"))[9];
5329 0 0 0     0 my $mtime = (Ehp15::stat($realfilename))[9];
5330 0         0 my $module_mtime = (Ehp15::stat(__FILE__))[9];
5331             if (($e_mtime < $mtime) or ($mtime < $module_mtime)) {
5332             Ehp15::unlink "$realfilename.e";
5333             }
5334 0 0       0 }
5335 0         0  
5336 0 0       0 if (Ehp15::e("$realfilename.e")) {
5337 0 0       0 my $fh = gensym();
    0          
5338 0         0 _open_r($fh, "$realfilename.e") or croak "Can't open file: $realfilename.e";
5339             if ($^O eq 'MacOS') {
5340             CORE::eval q{
5341             CORE::require Mac::Files;
5342             Mac::Files::FSpSetFLock("$realfilename.e");
5343             };
5344 0         0 }
5345 0 0       0 elsif (exists $ENV{'CHAR_NONBLOCK'}) {
5346 0         0 CORE::eval q{ flock($fh, LOCK_SH | LOCK_NB) };
5347             if ($@) {
5348             carp "Can't immediately read-lock the file: $realfilename.e";
5349             }
5350 0         0 }
5351             else {
5352 0         0 CORE::eval q{ flock($fh, LOCK_SH) };
5353 0         0 }
5354 0 0       0 local $/ = undef; # slurp mode
5355 0         0 $script = <$fh>;
5356             if ($^O eq 'MacOS') {
5357             CORE::eval q{
5358             CORE::require Mac::Files;
5359             Mac::Files::FSpRstFLock("$realfilename.e");
5360 0 0       0 };
5361             }
5362             close($fh) or croak "Can't close file: $realfilename";
5363 0         0 }
5364 0 0       0 else {
5365 0 0       0 my $fh = gensym();
    0          
5366 0         0 _open_r($fh, $realfilename) or croak "Can't open file: $realfilename";
5367             if ($^O eq 'MacOS') {
5368             CORE::eval q{
5369             CORE::require Mac::Files;
5370             Mac::Files::FSpSetFLock($realfilename);
5371             };
5372 0         0 }
5373 0 0       0 elsif (exists $ENV{'CHAR_NONBLOCK'}) {
5374 0         0 CORE::eval q{ flock($fh, LOCK_SH | LOCK_NB) };
5375             if ($@) {
5376             carp "Can't immediately read-lock the file: $realfilename";
5377             }
5378 0         0 }
5379             else {
5380 0         0 CORE::eval q{ flock($fh, LOCK_SH) };
5381 0         0 }
5382 0 0       0 local $/ = undef; # slurp mode
5383 0         0 $script = <$fh>;
5384             if ($^O eq 'MacOS') {
5385             CORE::eval q{
5386             CORE::require Mac::Files;
5387             Mac::Files::FSpRstFLock($realfilename);
5388 0 0       0 };
5389             }
5390 0 0       0 close($fh) or croak "Can't close file: $realfilename";
5391 0         0  
5392 0         0 if ($script =~ /^ (?>\s*) use (?>\s+) HP15 (?>\s*) ([^\x80-\xA0\xE0-\xFE;]*) ; (?>\s*) \n? $/oxms) {
5393 0         0 CORE::require HP15;
5394 0 0       0 $script = HP15::escape_script($script);
5395 0 0       0 my $fh = gensym();
    0          
5396 0         0 open($fh, ">$realfilename.e") or croak "Can't write open file: $realfilename.e";
5397             if ($^O eq 'MacOS') {
5398             CORE::eval q{
5399             CORE::require Mac::Files;
5400             Mac::Files::FSpSetFLock("$realfilename.e");
5401             };
5402 0         0 }
5403 0 0       0 elsif (exists $ENV{'CHAR_NONBLOCK'}) {
5404 0         0 CORE::eval q{ flock($fh, LOCK_EX | LOCK_NB) };
5405             if ($@) {
5406             carp "Can't immediately write-lock the file: $realfilename.e";
5407             }
5408 0         0 }
5409             else {
5410 0         0 CORE::eval q{ flock($fh, LOCK_EX) };
5411 0 0       0 }
5412 0         0 CORE::eval q{ truncate($fh, 0) };
  0         0  
5413 0 0       0 seek($fh, 0, 0) or croak "Can't seek file: $realfilename.e";
5414 0         0 print {$fh} $script;
5415             if ($^O eq 'MacOS') {
5416             CORE::eval q{
5417             CORE::require Mac::Files;
5418             Mac::Files::FSpRstFLock("$realfilename.e");
5419 0 0       0 };
5420             }
5421             close($fh) or croak "Can't close file: $realfilename";
5422             }
5423             }
5424 389     389   4867  
  389         2265  
  389         420008  
  0         0  
5425 0         0 {
5426             no strict;
5427 0         0 $result = scalar CORE::eval $script;
5428             }
5429             last ITER_REQUIRE;
5430 0         0 }
5431             }
5432             croak "Can't find $_ in \@INC";
5433 0 0       0 }
    0          
5434 0         0  
5435 0         0 if ($@) {
5436             $INC{$_} = undef;
5437             croak $@;
5438 0         0 }
5439 0         0 elsif (not $result) {
5440             delete $INC{$_};
5441             croak "$_ did not return true value";
5442 0         0 }
5443             else {
5444             return $result;
5445             }
5446             }
5447              
5448             #
5449             # HP-15 telldir avoid warning
5450             #
5451 0     768 0 0 sub Ehp15::telldir(*) {
5452              
5453 768         2402 local $^W = 0;
5454              
5455             return CORE::telldir $_[0];
5456             }
5457              
5458             #
5459             # ${^PREMATCH}, $PREMATCH, $` the string preceding what was matched
5460 768 0   0 0 43704 #
5461 0 0 0     0 sub Ehp15::PREMATCH {
5462 0         0 if (defined($&)) {
5463             if (defined($1) and (CORE::substr($&,-CORE::length($1),CORE::length($1)) eq $1)) {
5464             return CORE::substr($&,0,CORE::length($&)-CORE::length($1));
5465 0         0 }
5466             else {
5467             croak 'Use of "$`", $PREMATCH, and ${^PREMATCH} need to /( capture all )/ in regexp';
5468             }
5469 0         0 }
5470             else {
5471 0         0 return '';
5472             }
5473             return $`;
5474             }
5475              
5476             #
5477             # ${^MATCH}, $MATCH, $& the string that matched
5478 0 0   0 0 0 #
5479 0 0       0 sub Ehp15::MATCH {
5480 0         0 if (defined($&)) {
5481             if (defined($1)) {
5482             return $1;
5483 0         0 }
5484             else {
5485             croak 'Use of "$&", $MATCH, and ${^MATCH} need to /( capture all )/ in regexp';
5486             }
5487 0         0 }
5488             else {
5489 0         0 return '';
5490             }
5491             return $&;
5492             }
5493              
5494             #
5495             # ${^POSTMATCH}, $POSTMATCH, $' the string following what was matched
5496 0     0 0 0 #
5497             sub Ehp15::POSTMATCH {
5498             return $';
5499             }
5500              
5501             #
5502             # HP-15 character to order (with parameter)
5503             #
5504 0 0   0 1 0 sub HP15::ord(;$) {
5505              
5506 0 0       0 local $_ = shift if @_;
5507 0         0  
5508 0         0 if (/\A ($q_char) /oxms) {
5509 0         0 my @ord = unpack 'C*', $1;
5510 0         0 my $ord = 0;
5511             while (my $o = shift @ord) {
5512 0         0 $ord = $ord * 0x100 + $o;
5513             }
5514             return $ord;
5515 0         0 }
5516             else {
5517             return CORE::ord $_;
5518             }
5519             }
5520              
5521             #
5522             # HP-15 character to order (without parameter)
5523             #
5524 0 0   0 0 0 sub HP15::ord_() {
5525 0         0  
5526 0         0 if (/\A ($q_char) /oxms) {
5527 0         0 my @ord = unpack 'C*', $1;
5528 0         0 my $ord = 0;
5529             while (my $o = shift @ord) {
5530 0         0 $ord = $ord * 0x100 + $o;
5531             }
5532             return $ord;
5533 0         0 }
5534             else {
5535             return CORE::ord $_;
5536             }
5537             }
5538              
5539             #
5540             # HP-15 reverse
5541             #
5542 0 0   0 0 0 sub HP15::reverse(@) {
5543 0         0  
5544             if (wantarray) {
5545             return CORE::reverse @_;
5546             }
5547             else {
5548              
5549             # One of us once cornered Larry in an elevator and asked him what
5550             # problem he was solving with this, but he looked as far off into
5551             # the distance as he could in an elevator and said, "It seemed like
5552 0         0 # a good idea at the time."
5553              
5554             return join '', CORE::reverse(join('',@_) =~ /\G ($q_char) /oxmsg);
5555             }
5556             }
5557              
5558             #
5559             # HP-15 getc (with parameter, without parameter)
5560             #
5561 0     0 0 0 sub HP15::getc(;*@) {
5562 0 0       0  
5563 0 0 0     0 my($package) = caller;
5564             my $fh = @_ ? qualify_to_ref(shift,$package) : \*STDIN;
5565 0         0 croak 'Too many arguments for HP15::getc' if @_ and not wantarray;
  0         0  
5566 0         0  
5567 0         0 my @length = sort { $a <=> $b } keys %range_tr;
5568 0         0 my $getc = '';
5569 0 0       0 for my $length ($length[0] .. $length[-1]) {
5570 0 0       0 $getc .= CORE::getc($fh);
5571 0 0       0 if (exists $range_tr{CORE::length($getc)}) {
5572             if ($getc =~ /\A ${Ehp15::dot_s} \z/oxms) {
5573             return wantarray ? ($getc,@_) : $getc;
5574             }
5575 0 0       0 }
5576             }
5577             return wantarray ? ($getc,@_) : $getc;
5578             }
5579              
5580             #
5581             # HP-15 length by character
5582             #
5583 0 0   0 1 0 sub HP15::length(;$) {
5584              
5585 0         0 local $_ = shift if @_;
5586 0         0  
5587             local @_ = /\G ($q_char) /oxmsg;
5588             return scalar @_;
5589             }
5590              
5591             #
5592             # HP-15 substr by character
5593             #
5594             BEGIN {
5595              
5596             # P.232 The lvalue Attribute
5597             # in Chapter 6: Subroutines
5598             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
5599              
5600             # P.336 The lvalue Attribute
5601             # in Chapter 7: Subroutines
5602             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5603              
5604             # P.144 8.4 Lvalue subroutines
5605             # in Chapter 8: perlsub: Perl subroutines
5606 389 50 0 389 1 231114 # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
  0 0   0   0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0 0       0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
  0         0  
5607              
5608             CORE::eval sprintf(<<'END', ($] >= 5.014000) ? ':lvalue' : '');
5609             # vv----------------------*******
5610             sub HP15::substr($$;$$) %s {
5611              
5612             my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
5613              
5614             # If the substring is beyond either end of the string, substr() returns the undefined
5615             # value and produces a warning. When used as an lvalue, specifying a substring that
5616             # is entirely outside the string raises an exception.
5617             # http://perldoc.perl.org/functions/substr.html
5618              
5619             # A return with no argument returns the scalar value undef in scalar context,
5620             # an empty list () in list context, and (naturally) nothing at all in void
5621             # context.
5622              
5623             my $offset = $_[1];
5624             if (($offset > scalar(@char)) or ($offset < (-1 * scalar(@char)))) {
5625             return;
5626             }
5627              
5628             # substr($string,$offset,$length,$replacement)
5629             if (@_ == 4) {
5630             my(undef,undef,$length,$replacement) = @_;
5631             my $substr = join '', splice(@char, $offset, $length, $replacement);
5632             $_[0] = join '', @char;
5633              
5634             # return $substr; this doesn't work, don't say "return"
5635             $substr;
5636             }
5637              
5638             # substr($string,$offset,$length)
5639             elsif (@_ == 3) {
5640             my(undef,undef,$length) = @_;
5641             my $octet_offset = 0;
5642             my $octet_length = 0;
5643             if ($offset == 0) {
5644             $octet_offset = 0;
5645             }
5646             elsif ($offset > 0) {
5647             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
5648             }
5649             else {
5650             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
5651             }
5652             if ($length == 0) {
5653             $octet_length = 0;
5654             }
5655             elsif ($length > 0) {
5656             $octet_length = CORE::length(join '', @char[$offset..$offset+$length-1]);
5657             }
5658             else {
5659             $octet_length = -1 * CORE::length(join '', @char[$#char+$length+1..$#char]);
5660             }
5661             CORE::substr($_[0], $octet_offset, $octet_length);
5662             }
5663              
5664             # substr($string,$offset)
5665             else {
5666             my $octet_offset = 0;
5667             if ($offset == 0) {
5668             $octet_offset = 0;
5669             }
5670             elsif ($offset > 0) {
5671             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
5672             }
5673             else {
5674             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
5675             }
5676             CORE::substr($_[0], $octet_offset);
5677             }
5678             }
5679             END
5680             }
5681              
5682             #
5683             # HP-15 index by character
5684             #
5685 0     0 1 0 sub HP15::index($$;$) {
5686 0 0       0  
5687 0         0 my $index;
5688             if (@_ == 3) {
5689             $index = Ehp15::index($_[0], $_[1], CORE::length(HP15::substr($_[0], 0, $_[2])));
5690 0         0 }
5691             else {
5692             $index = Ehp15::index($_[0], $_[1]);
5693 0 0       0 }
5694 0         0  
5695             if ($index == -1) {
5696             return -1;
5697 0         0 }
5698             else {
5699             return HP15::length(CORE::substr $_[0], 0, $index);
5700             }
5701             }
5702              
5703             #
5704             # HP-15 rindex by character
5705             #
5706 0     0 1 0 sub HP15::rindex($$;$) {
5707 0 0       0  
5708 0         0 my $rindex;
5709             if (@_ == 3) {
5710             $rindex = Ehp15::rindex($_[0], $_[1], CORE::length(HP15::substr($_[0], 0, $_[2])));
5711 0         0 }
5712             else {
5713             $rindex = Ehp15::rindex($_[0], $_[1]);
5714 0 0       0 }
5715 0         0  
5716             if ($rindex == -1) {
5717             return -1;
5718 0         0 }
5719             else {
5720             return HP15::length(CORE::substr $_[0], 0, $rindex);
5721             }
5722             }
5723              
5724 389     389   4638 # when 'm//', '/' means regexp match 'm//' and '?' means regexp match '??'
  389         2309  
  389         40650  
5725             # when 'div', '/' means division operator and '?' means conditional operator (condition ? then : else)
5726             use vars qw($slash); $slash = 'm//';
5727              
5728             # ord() to ord() or HP15::ord()
5729             my $function_ord = 'ord';
5730              
5731             # ord to ord or HP15::ord_
5732             my $function_ord_ = 'ord';
5733              
5734             # reverse to reverse or HP15::reverse
5735             my $function_reverse = 'reverse';
5736              
5737             # getc to getc or HP15::getc
5738             my $function_getc = 'getc';
5739              
5740             # P.1023 Appendix W.9 Multibyte Anchoring
5741             # of ISBN 1-56592-224-7 CJKV Information Processing
5742              
5743             my $anchor = '';
5744 389     389   3898 $anchor = q{${Ehp15::anchor}};
  389     0   2430  
  389         22690509  
5745              
5746             use vars qw($nest);
5747              
5748             # regexp of nested parens in qqXX
5749              
5750             # P.340 Matching Nested Constructs with Embedded Code
5751             # in Chapter 7: Perl
5752             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
5753              
5754             my $qq_paren = qr{(?{local $nest=0}) (?>(?:
5755             [^\x80-\xA0\xE0-\xFE\\()] |
5756             \( (?{$nest++}) |
5757             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
5758             [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
5759             \\ [^\x80-\xA0\xE0-\xFEc] |
5760             \\c[\x40-\x5F] |
5761             \\ [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
5762             [\x00-\xFF]
5763             }xms;
5764              
5765             my $qq_brace = qr{(?{local $nest=0}) (?>(?:
5766             [^\x80-\xA0\xE0-\xFE\\{}] |
5767             \{ (?{$nest++}) |
5768             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
5769             [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
5770             \\ [^\x80-\xA0\xE0-\xFEc] |
5771             \\c[\x40-\x5F] |
5772             \\ [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
5773             [\x00-\xFF]
5774             }xms;
5775              
5776             my $qq_bracket = qr{(?{local $nest=0}) (?>(?:
5777             [^\x80-\xA0\xE0-\xFE\\\[\]] |
5778             \[ (?{$nest++}) |
5779             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
5780             [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
5781             \\ [^\x80-\xA0\xE0-\xFEc] |
5782             \\c[\x40-\x5F] |
5783             \\ [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
5784             [\x00-\xFF]
5785             }xms;
5786              
5787             my $qq_angle = qr{(?{local $nest=0}) (?>(?:
5788             [^\x80-\xA0\xE0-\xFE\\<>] |
5789             \< (?{$nest++}) |
5790             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
5791             [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
5792             \\ [^\x80-\xA0\xE0-\xFEc] |
5793             \\c[\x40-\x5F] |
5794             \\ [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
5795             [\x00-\xFF]
5796             }xms;
5797              
5798             my $qq_scalar = qr{(?: \{ (?:$qq_brace)*? \} |
5799             (?: ::)? (?:
5800             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
5801             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
5802             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
5803             ))
5804             }xms;
5805              
5806             my $qq_variable = qr{(?: \{ (?:$qq_brace)*? \} |
5807             (?: ::)? (?:
5808             (?>[0-9]+) |
5809             [^\x80-\xA0\xE0-\xFEa-zA-Z_0-9\[\]] |
5810             ^[A-Z] |
5811             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
5812             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
5813             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
5814             ))
5815             }xms;
5816              
5817             my $qq_substr = qr{(?> Char::substr | HP15::substr | CORE::substr | substr ) (?>\s*) \( $qq_paren \)
5818             }xms;
5819              
5820             # regexp of nested parens in qXX
5821             my $q_paren = qr{(?{local $nest=0}) (?>(?:
5822             [^\x80-\xA0\xE0-\xFE()] |
5823             [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
5824             \( (?{$nest++}) |
5825             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
5826             [\x00-\xFF]
5827             }xms;
5828              
5829             my $q_brace = qr{(?{local $nest=0}) (?>(?:
5830             [^\x80-\xA0\xE0-\xFE\{\}] |
5831             [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
5832             \{ (?{$nest++}) |
5833             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
5834             [\x00-\xFF]
5835             }xms;
5836              
5837             my $q_bracket = qr{(?{local $nest=0}) (?>(?:
5838             [^\x80-\xA0\xE0-\xFE\[\]] |
5839             [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
5840             \[ (?{$nest++}) |
5841             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
5842             [\x00-\xFF]
5843             }xms;
5844              
5845             my $q_angle = qr{(?{local $nest=0}) (?>(?:
5846             [^\x80-\xA0\xE0-\xFE<>] |
5847             [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
5848             \< (?{$nest++}) |
5849             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
5850             [\x00-\xFF]
5851             }xms;
5852              
5853             my $matched = '';
5854             my $s_matched = '';
5855             $matched = q{$Ehp15::matched};
5856             $s_matched = q{ Ehp15::s_matched();};
5857              
5858             my $tr_variable = ''; # variable of tr///
5859             my $sub_variable = ''; # variable of s///
5860             my $bind_operator = ''; # =~ or !~
5861              
5862             my @heredoc = (); # here document
5863             my @heredoc_delimiter = ();
5864             my $here_script = ''; # here script
5865              
5866             #
5867             # escape HP-15 script
5868 0 50   384 0 0 #
5869             sub HP15::escape(;$) {
5870             local($_) = $_[0] if @_;
5871              
5872             # P.359 The Study Function
5873             # in Chapter 7: Perl
5874 384         1341 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
5875              
5876             study $_; # Yes, I studied study yesterday.
5877              
5878             # while all script
5879              
5880             # 6.14. Matching from Where the Last Pattern Left Off
5881             # in Chapter 6. Pattern Matching
5882             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
5883             # (and so on)
5884              
5885             # one member of Tag-team
5886             #
5887             # P.128 Start of match (or end of previous match): \G
5888             # P.130 Advanced Use of \G with Perl
5889             # in Chapter 3: Overview of Regular Expression Features and Flavors
5890             # P.255 Use leading anchors
5891             # P.256 Expose ^ and \G at the front expressions
5892             # in Chapter 6: Crafting an Efficient Expression
5893             # P.315 "Tag-team" matching with /gc
5894             # in Chapter 7: Perl
5895 384         872 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
5896 384         690  
5897 384         1519 my $e_script = '';
5898             while (not /\G \z/oxgc) { # member
5899             $e_script .= HP15::escape_token();
5900 186553         291747 }
5901              
5902             return $e_script;
5903             }
5904              
5905             #
5906             # escape HP-15 token of script
5907             #
5908             sub HP15::escape_token {
5909              
5910 384     186553 0 5742 # \n output here document
5911              
5912             my $ignore_modules = join('|', qw(
5913             utf8
5914             bytes
5915             charnames
5916             I18N::Japanese
5917             I18N::Collate
5918             I18N::JExt
5919             File::DosGlob
5920             Wild
5921             Wildcard
5922             Japanese
5923             ));
5924              
5925             # another member of Tag-team
5926             #
5927             # P.315 "Tag-team" matching with /gc
5928             # in Chapter 7: Perl
5929 186553 100 100     238952 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
    100 100        
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    100          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
    50          
    100          
    100          
    100          
    50          
    100          
    100          
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    100          
    100          
    50          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    100          
    50          
    50          
    100          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    100          
    100          
    50          
5930 186553         14297295  
5931 31404 100       38767 if (/\G ( \n ) /oxgc) { # another member (and so on)
5932 31404         59182 my $heredoc = '';
5933             if (scalar(@heredoc_delimiter) >= 1) {
5934 197         258 $slash = 'm//';
5935 197         383  
5936             $heredoc = join '', @heredoc;
5937             @heredoc = ();
5938 197         342  
5939 197         349 # skip here document
5940             for my $heredoc_delimiter (@heredoc_delimiter) {
5941 205         1311 /\G .*? \n $heredoc_delimiter \n/xmsgc;
5942             }
5943 197         367 @heredoc_delimiter = ();
5944              
5945 197         267 $here_script = '';
5946             }
5947             return "\n" . $heredoc;
5948             }
5949 31404         97810  
5950             # ignore space, comment
5951             elsif (/\G ((?>\s+)|\#.*) /oxgc) { return $1; }
5952              
5953             # if (, elsif (, unless (, while (, until (, given (, and when (
5954              
5955             # given, when
5956              
5957             # P.225 The given Statement
5958             # in Chapter 15: Smart Matching and given-when
5959             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
5960              
5961             # P.133 The given Statement
5962             # in Chapter 4: Statements and Declarations
5963             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5964 42620         130439  
5965 3773         5699 elsif (/\G ( (?: if | elsif | unless | while | until | given | when ) (?>\s*) \( ) /oxgc) {
5966             $slash = 'm//';
5967             return $1;
5968             }
5969              
5970             # scalar variable ($scalar = ...) =~ tr///;
5971             # scalar variable ($scalar = ...) =~ s///;
5972              
5973             # state
5974              
5975             # P.68 Persistent, Private Variables
5976             # in Chapter 4: Subroutines
5977             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
5978              
5979             # P.160 Persistent Lexically Scoped Variables: state
5980             # in Chapter 4: Statements and Declarations
5981             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5982              
5983             # (and so on)
5984 3773         11542  
5985             elsif (/\G ( \( (?>\s*) (?: local \b | my \b | our \b | state \b )? (?>\s*) \$ $qq_scalar ) /oxgc) {
5986 170 50       527 my $e_string = e_string($1);
    50          
5987 170         7226  
5988 0         0 if (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
5989 0         0 $tr_variable = $e_string . e_string($1);
5990 0         0 $bind_operator = $2;
5991             $slash = 'm//';
5992             return '';
5993 0         0 }
5994 0         0 elsif (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
5995 0         0 $sub_variable = $e_string . e_string($1);
5996 0         0 $bind_operator = $2;
5997             $slash = 'm//';
5998             return '';
5999 0         0 }
6000 170         373 else {
6001             $slash = 'div';
6002             return $e_string;
6003             }
6004             }
6005              
6006 170         667 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ehp15::PREMATCH()
6007 4         10 elsif (/\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
6008             $slash = 'div';
6009             return q{Ehp15::PREMATCH()};
6010             }
6011              
6012 4         15 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ehp15::MATCH()
6013 28         61 elsif (/\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
6014             $slash = 'div';
6015             return q{Ehp15::MATCH()};
6016             }
6017              
6018 28         77 # $', ${'} --> $', ${'}
6019 1         2 elsif (/\G ( \$' | \$\{'\} ) /oxmsgc) {
6020             $slash = 'div';
6021             return $1;
6022             }
6023              
6024 1         5 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ehp15::POSTMATCH()
6025 3         5 elsif (/\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
6026             $slash = 'div';
6027             return q{Ehp15::POSTMATCH()};
6028             }
6029              
6030             # scalar variable $scalar =~ tr///;
6031             # scalar variable $scalar =~ s///;
6032             # substr() =~ tr///;
6033 3         10 # substr() =~ s///;
6034             elsif (/\G ( \$ $qq_scalar | $qq_substr ) /oxgc) {
6035 2878 100       6486 my $scalar = e_string($1);
    100          
6036 2878         12173  
6037 9         17 if (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
6038 9         20 $tr_variable = $scalar;
6039 9         10 $bind_operator = $1;
6040             $slash = 'm//';
6041             return '';
6042 9         24 }
6043 253         418 elsif (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
6044 253         438 $sub_variable = $scalar;
6045 253         338 $bind_operator = $1;
6046             $slash = 'm//';
6047             return '';
6048 253         744 }
6049 2616         4747 else {
6050             $slash = 'div';
6051             return $scalar;
6052             }
6053             }
6054              
6055 2616         7042 # end of statement
6056             elsif (/\G ( [,;] ) /oxgc) {
6057             $slash = 'm//';
6058 12209         17936  
6059             # clear tr/// variable
6060             $tr_variable = '';
6061 12209         14365  
6062             # clear s/// variable
6063 12209         13384 $sub_variable = '';
6064              
6065 12209         13223 $bind_operator = '';
6066              
6067             return $1;
6068             }
6069              
6070 12209         41896 # bareword
6071             elsif (/\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
6072             return $1;
6073             }
6074              
6075 0         0 # $0 --> $0
6076 2         8 elsif (/\G ( \$ 0 ) /oxmsgc) {
6077             $slash = 'div';
6078             return $1;
6079 2         9 }
6080 0         0 elsif (/\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
6081             $slash = 'div';
6082             return $1;
6083             }
6084              
6085 0         0 # $$ --> $$
6086 1         2 elsif (/\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
6087             $slash = 'div';
6088             return $1;
6089             }
6090              
6091             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6092 1         7 # $1, $2, $3 --> $1, $2, $3 otherwise
6093 219         357 elsif (/\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
6094             $slash = 'div';
6095             return e_capture($1);
6096 219         564 }
6097 0         0 elsif (/\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
6098             $slash = 'div';
6099             return e_capture($1);
6100             }
6101              
6102 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
6103 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
6104             $slash = 'div';
6105             return e_capture($1.'->'.$2);
6106             }
6107              
6108 0         0 # $$foo{ ... } --> $ $foo->{ ... }
6109 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
6110             $slash = 'div';
6111             return e_capture($1.'->'.$2);
6112             }
6113              
6114 0         0 # $$foo
6115 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
6116             $slash = 'div';
6117             return e_capture($1);
6118             }
6119              
6120 0         0 # ${ foo }
6121 0         0 elsif (/\G \$ (?>\s*) \{ ( (?>\s*) (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* ) (?>\s*) ) \} /oxmsgc) {
6122             $slash = 'div';
6123             return '${' . $1 . '}';
6124             }
6125              
6126 0         0 # ${ ... }
6127 0         0 elsif (/\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
6128             $slash = 'div';
6129             return e_capture($1);
6130             }
6131              
6132             # variable or function
6133 0         0 # $ @ % & * $ #
6134 605         883 elsif (/\G ( (?: [\$\@\%\&\*] | \$\# | -> | \b sub \b) (?>\s*) (?: split | chop | index | rindex | lc | uc | fc | chr | ord | reverse | getc | tr | y | q | qq | qx | qw | m | s | qr | glob | lstat | opendir | stat | unlink | chdir ) ) \b /oxmsgc) {
6135             $slash = 'div';
6136             return $1;
6137             }
6138             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
6139 605         1988 # $ @ # \ ' " / ? ( ) [ ] < >
6140 103         206 elsif (/\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
6141             $slash = 'div';
6142             return $1;
6143             }
6144              
6145 103         360 # while ()
6146             elsif (/\G \b (while (?>\s*) \( (?>\s*) <[\$]?[A-Za-z_][A-Za-z_0-9]*> (?>\s*) \)) \b /oxgc) {
6147             return $1;
6148             }
6149              
6150             # while () --- glob
6151              
6152             # avoid "Error: Runtime exception" of perl version 5.005_03
6153 0         0  
6154             elsif (/\G \b while (?>\s*) \( (?>\s*) < ((?:[^\x80-\xA0\xE0-\xFE>\0\a\e\f\n\r\t]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])+?) > (?>\s*) \) \b /oxgc) {
6155             return 'while ($_ = Ehp15::glob("' . $1 . '"))';
6156             }
6157              
6158 0         0 # while (glob)
6159             elsif (/\G \b while (?>\s*) \( (?>\s*) glob (?>\s*) \) /oxgc) {
6160             return 'while ($_ = Ehp15::glob_)';
6161             }
6162              
6163 0         0 # while (glob(WILDCARD))
6164             elsif (/\G \b while (?>\s*) \( (?>\s*) glob \b /oxgc) {
6165             return 'while ($_ = Ehp15::glob';
6166             }
6167 0         0  
  482         1163  
6168             # doit if, doit unless, doit while, doit until, doit for, doit when
6169             elsif (/\G \b ( if | unless | while | until | for | when ) \b /oxgc) { $slash = 'm//'; return $1; }
6170 482         2061  
  19         35  
6171 19         61 # subroutines of package Ehp15
  0         0  
6172 0         0 elsif (/\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $slash = 'm//'; return $1; }
  13         17  
6173 13         35 elsif (/\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  0         0  
6174 0         0 elsif (/\G \b HP15::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  114         168  
6175 114         313 elsif (/\G \b Char::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval Char::escape'; }
  2         4  
6176 2         8 elsif (/\G \b HP15::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval HP15::escape'; }
  2         4  
6177 2         6 elsif (/\G \b bytes::substr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'substr'; }
  2         3  
6178 2         6 elsif (/\G \b chop \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ehp15::chop'; }
  0         0  
6179 0         0 elsif (/\G \b bytes::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'index'; }
  2         4  
6180 2         7 elsif (/\G \b Char::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::index'; }
  2         4  
6181 2         6 elsif (/\G \b HP15::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'HP15::index'; }
  2         3  
6182 2         7 elsif (/\G \b index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ehp15::index'; }
  0         0  
6183 0         0 elsif (/\G \b bytes::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'rindex'; }
  2         4  
6184 2         6 elsif (/\G \b Char::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::rindex'; }
  2         5  
6185 2         5 elsif (/\G \b HP15::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'HP15::rindex'; }
  1         3  
6186 1         3 elsif (/\G \b rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ehp15::rindex'; }
  0         0  
6187 0         0 elsif (/\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ehp15::lc'; }
  0         0  
6188 0         0 elsif (/\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ehp15::lcfirst'; }
  0         0  
6189 0         0 elsif (/\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ehp15::uc'; }
  3         5  
6190             elsif (/\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ehp15::ucfirst'; }
6191             elsif (/\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ehp15::fc'; }
6192              
6193             # stacked file test operators
6194              
6195             # P.179 File Test Operators
6196             # in Chapter 12: File Tests
6197             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
6198              
6199             # P.106 Named Unary and File Test Operators
6200             # in Chapter 3: Unary and Binary Operators
6201             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
6202              
6203             # (and so on)
6204 3         10  
  0         0  
6205 0         0 elsif (/\G (-[rwxoRWXOezfdlpSbcugkTB] (?>(?:\s+ -[rwxoRWXOezfdlpSbcugkTB])+))
  0         0  
6206 0         0 (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1)," . e_qq('', $2,$4,$3) . ")"; }
  0         0  
6207 0         0 elsif (/\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) qq (?>\s*) (\#) ((?:$qq_char)+?) (\#) /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1)," . e_qq('qq',$2,$4,$3) . ")"; }
  0         0  
6208 0         0 elsif (/\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) qq (?>\s*) (\() ((?:$qq_paren)+?) (\)) /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1)," . e_qq('qq',$2,$4,$3) . ")"; }
  0         0  
6209 0         0 elsif (/\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) qq (?>\s*) (\{) ((?:$qq_brace)+?) (\}) /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1)," . e_qq('qq',$2,$4,$3) . ")"; }
  0         0  
6210 0         0 elsif (/\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) qq (?>\s*) (\[) ((?:$qq_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1)," . e_qq('qq',$2,$4,$3) . ")"; }
  1         4  
6211             elsif (/\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1)," . e_qq('qq',$2,$4,$3) . ")"; }
6212             elsif (/\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) qq (?>\s*) (\S) ((?:$qq_char)+?) (\2) /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1)," . e_qq('qq',$2,$4,$3) . ")"; }
6213 1         5  
  5         10  
6214 5         23 elsif (/\G (-[rwxoRWXOezfdlpSbcugkTB] (?>(?:\s+ -[rwxoRWXOezfdlpSbcugkTB])+))
  0         0  
6215 0         0 (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1)," . e_q ('', $2,$4,$3) . ")"; }
  0         0  
6216 0         0 elsif (/\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) q (?>\s*) (\#) ((?:\\\#|\\\\|$q_char)+?) (\#) /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1)," . e_q ('q', $2,$4,$3) . ")"; }
  0         0  
6217 0         0 elsif (/\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) q (?>\s*) (\() ((?:\\\)|\\\\|$q_paren)+?) (\)) /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1)," . e_q ('q', $2,$4,$3) . ")"; }
  0         0  
6218 0         0 elsif (/\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) q (?>\s*) (\{) ((?:\\\}|\\\\|$q_brace)+?) (\}) /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1)," . e_q ('q', $2,$4,$3) . ")"; }
  0         0  
6219 0         0 elsif (/\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) q (?>\s*) (\[) ((?:\\\]|\\\\|$q_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1)," . e_q ('q', $2,$4,$3) . ")"; }
  1         3  
6220             elsif (/\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1)," . e_q ('q', $2,$4,$3) . ")"; }
6221             elsif (/\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) q (?>\s*) (\S) ((?:\\\2|\\\\|$q_char)+?) (\2) /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1)," . e_q ('q', $2,$4,$3) . ")"; }
6222 1         8  
  0         0  
6223 0         0 elsif (/\G (-[rwxoRWXOezfdlpSbcugkTB] (?>(?:\s+ -[rwxoRWXOezfdlpSbcugkTB])+)) (\$ (?> \w+ (?: ::\w+)* ) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ) )*) /oxgc)
  0         0  
6224 0         0 { $slash = 'm//'; return "Ehp15::filetest(qw($1),$2)"; }
  0         0  
6225 0         0 elsif (/\G (-[rwxoRWXOezfdlpSbcugkTB] (?>(?:\s+ -[rwxoRWXOezfdlpSbcugkTB])+)) \( ((?:$qq_paren)*?) \) /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1),$2)"; }
  0         0  
6226             elsif (/\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) (?= [a-z]+) /oxgc) { $slash = 'm//'; return "Ehp15::filetest qw($1),"; }
6227 0         0 elsif (/\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) ((?>\w+)) /oxgc) { $slash = 'm//'; return "Ehp15::filetest(qw($1),$2)"; }
  0         0  
6228 0         0  
  0         0  
6229 0         0 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $slash = 'm//'; return "Ehp15::$1(" . e_qq('', $2,$4,$3) . ")"; }
  0         0  
6230 0         0 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) qq (?>\s*) (\#) ((?:$qq_char)+?) (\#) /oxgc) { $slash = 'm//'; return "Ehp15::$1(" . e_qq('qq',$2,$4,$3) . ")"; }
  0         0  
6231 0         0 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) qq (?>\s*) (\() ((?:$qq_paren)+?) (\)) /oxgc) { $slash = 'm//'; return "Ehp15::$1(" . e_qq('qq',$2,$4,$3) . ")"; }
  0         0  
6232 0         0 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) qq (?>\s*) (\{) ((?:$qq_brace)+?) (\}) /oxgc) { $slash = 'm//'; return "Ehp15::$1(" . e_qq('qq',$2,$4,$3) . ")"; }
  0         0  
6233 0         0 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) qq (?>\s*) (\[) ((?:$qq_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return "Ehp15::$1(" . e_qq('qq',$2,$4,$3) . ")"; }
  2         4  
6234             elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $slash = 'm//'; return "Ehp15::$1(" . e_qq('qq',$2,$4,$3) . ")"; }
6235 2         12 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) qq (?>\s*) (\S) ((?:$qq_char)+?) (\2) /oxgc) { $slash = 'm//'; return "Ehp15::$1(" . e_qq('qq',$2,$4,$3) . ")"; }
  103         179  
6236 103         338  
  0         0  
6237 0         0 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $slash = 'm//'; return "Ehp15::$1(" . e_q ('', $2,$4,$3) . ")"; }
  0         0  
6238 0         0 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) q (?>\s*) (\#) ((?:\\\#|\\\\|$q_char)+?) (\#) /oxgc) { $slash = 'm//'; return "Ehp15::$1(" . e_q ('q', $2,$4,$3) . ")"; }
  0         0  
6239 0         0 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) q (?>\s*) (\() ((?:\\\)|\\\\|$q_paren)+?) (\)) /oxgc) { $slash = 'm//'; return "Ehp15::$1(" . e_q ('q', $2,$4,$3) . ")"; }
  0         0  
6240 0         0 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) q (?>\s*) (\{) ((?:\\\}|\\\\|$q_brace)+?) (\}) /oxgc) { $slash = 'm//'; return "Ehp15::$1(" . e_q ('q', $2,$4,$3) . ")"; }
  0         0  
6241 0         0 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) q (?>\s*) (\[) ((?:\\\]|\\\\|$q_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return "Ehp15::$1(" . e_q ('q', $2,$4,$3) . ")"; }
  2         8  
6242             elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $slash = 'm//'; return "Ehp15::$1(" . e_q ('q', $2,$4,$3) . ")"; }
6243             elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) q (?>\s*) (\S) ((?:\\\2|\\\\|$q_char)+?) (\2) /oxgc) { $slash = 'm//'; return "Ehp15::$1(" . e_q ('q', $2,$4,$3) . ")"; }
6244 2         36  
  6         14  
6245 6         28 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s*) (\$ (?> \w+ (?: ::\w+)* ) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ) )*) /oxgc)
  0         0  
6246 0         0 { $slash = 'm//'; return "Ehp15::$1($2)"; }
  0         0  
6247 0         0 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $slash = 'm//'; return "Ehp15::$1($2)"; }
  50         94  
6248 50         262 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?= (?>\s+) [a-z]+) /oxgc) { $slash = 'm//'; return "Ehp15::$1"; }
  2         5  
6249 2         10 elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) ((?>\w+)) /oxgc) { $slash = 'm//'; return "Ehp15::$1(::"."$2)"; }
  1         3  
6250 1         5 elsif (/\G -(t) (?>\s+) ((?>\w+)) /oxgc) { $slash = 'm//'; return "-t $2"; }
  3         9  
6251             elsif (/\G \b lstat (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ehp15::lstat'; }
6252             elsif (/\G \b stat (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ehp15::stat'; }
6253 3         11  
  0         0  
6254 0         0 # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
  0         0  
6255 0         0 elsif (/\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $slash = 'm//'; return '-s ' . e_qq('', $1,$3,$2); }
  0         0  
6256 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\#) ((?:$qq_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
6257 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\() ((?:$qq_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
6258 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\{) ((?:$qq_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
6259 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\[) ((?:$qq_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
6260             elsif (/\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
6261 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\S) ((?:$qq_char)+?) (\1) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
6262 0         0  
  0         0  
6263 0         0 elsif (/\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $slash = 'm//'; return '-s ' . e_q ('', $1,$3,$2); }
  0         0  
6264 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\#) ((?:\\\#|\\\\|$q_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
6265 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\() ((?:\\\)|\\\\|$q_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
6266 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\{) ((?:\\\}|\\\\|$q_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
6267 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\[) ((?:\\\]|\\\\|$q_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
6268             elsif (/\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
6269             elsif (/\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
6270 0         0  
  0         0  
6271 0         0 elsif (/\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)* ) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ) )*) /oxgc)
  0         0  
6272 0         0 { $slash = 'm//'; return "-s $1"; }
  0         0  
6273 0         0 elsif (/\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $slash = 'm//'; return "-s ($1)"; }
  0         0  
6274             elsif (/\G -s (?= (?>\s+) [a-z]+) /oxgc) { $slash = 'm//'; return '-s'; }
6275 0         0 elsif (/\G -s (?>\s+) ((?>\w+)) /oxgc) { $slash = 'm//'; return "-s $1"; }
  2         5  
6276 2         7  
  2         4  
6277 2         8 elsif (/\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'length'; }
  36         86  
6278 36         165 elsif (/\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'chr'; }
  2         5  
6279 2         8 elsif (/\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ehp15::chr'; }
  2         7  
6280 2         8 elsif (/\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return 'ord'; }
  8         26  
6281 8         33 elsif (/\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return $function_ord; }
  0         0  
6282 0         0 elsif (/\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Ehp15::glob'; }
  0         0  
6283 0         0 elsif (/\G \b lc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ehp15::lc_'; }
  0         0  
6284 0         0 elsif (/\G \b lcfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ehp15::lcfirst_'; }
  0         0  
6285 0         0 elsif (/\G \b uc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ehp15::uc_'; }
  0         0  
6286 0         0 elsif (/\G \b ucfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ehp15::ucfirst_'; }
  0         0  
6287 0         0 elsif (/\G \b fc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ehp15::fc_'; }
  0         0  
6288             elsif (/\G \b lstat \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ehp15::lstat_'; }
6289 0         0 elsif (/\G \b stat \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ehp15::stat_'; }
  0         0  
6290             elsif (/\G (-[rwxoRWXOezfdlpSbcugkTB] (?>(?:\s+ -[rwxoRWXOezfdlpSbcugkTB])+))
6291 0         0 \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return "Ehp15::filetest_(qw($1))"; }
  0         0  
6292             elsif (/\G -([rwxoRWXOezsfdlpSbcugkTBMAC])
6293 0         0 \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return "Ehp15::${1}_"; }
  0         0  
6294              
6295 0         0 elsif (/\G -s \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return '-s '; }
  0         0  
6296 0         0  
  0         0  
6297 0         0 elsif (/\G \b bytes::length \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'length'; }
  0         0  
6298 0         0 elsif (/\G \b bytes::chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'chr'; }
  0         0  
6299 0         0 elsif (/\G \b chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ehp15::chr_'; }
  2         6  
6300 2         10 elsif (/\G \b bytes::ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return 'ord'; }
  0         0  
6301 0         0 elsif (/\G \b ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return $function_ord_; }
  4         10  
6302 4         15 elsif (/\G \b glob \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ehp15::glob_'; }
  8         21  
6303 8         31 elsif (/\G \b reverse \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_reverse; }
  2         7  
6304 2         13 elsif (/\G \b getc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_getc; }
  0         0  
6305 0         0 elsif (/\G \b opendir ((?>\s*) \( (?>\s*)) (?=[A-Za-z_]) /oxgc) { $slash = 'm//'; return "Ehp15::opendir$1*"; }
  87         251  
6306             elsif (/\G \b opendir ((?>\s+)) (?=[A-Za-z_]) /oxgc) { $slash = 'm//'; return "Ehp15::opendir$1*"; }
6307             elsif (/\G \b unlink \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Ehp15::unlink'; }
6308              
6309 87         354 # chdir
6310             elsif (/\G \b (chdir) \b (?! (?>\s*) => ) /oxgc) {
6311 3         6 $slash = 'm//';
6312              
6313 3         5 my $e = 'Ehp15::chdir';
6314 3         11  
6315             while (/\G ( (?>\s+) | \( | \#.* ) /oxgc) {
6316             $e .= $1;
6317             }
6318 3 50       12  
  3 100       235  
    50          
    50          
    50          
    0          
6319             # end of chdir
6320             if (/\G (?= [,;\)\}\]] ) /oxgc) { return $e; }
6321 0         0  
6322             # chdir scalar value
6323             elsif (/\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { return $e . e_string($1); }
6324              
6325 1 0       3 # chdir qq//
  0         0  
6326             elsif (/\G \b (qq) \b /oxgc) {
6327 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return $e . e_chdir('qq',$1,$3,$2); } # qq# # --> qr # #
6328 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
6329 0         0 while (not /\G \z/oxgc) {
6330 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6331 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_chdir('qq',$1,$3,$2); } # qq ( ) --> qr ( )
6332 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_chdir('qq',$1,$3,$2); } # qq { } --> qr { }
6333 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_chdir('qq',$1,$3,$2); } # qq [ ] --> qr [ ]
6334 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_chdir('qq',$1,$3,$2); } # qq < > --> qr < >
6335             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_chdir('qq','{','}',$2); } # qq | | --> qr { }
6336 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_chdir('qq',$1,$3,$2); } # qq * * --> qr * *
6337             }
6338             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6339             }
6340             }
6341              
6342 0 0       0 # chdir q//
  0         0  
6343             elsif (/\G \b (q) \b /oxgc) {
6344 0         0 if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return $e . e_chdir_q('q',$1,$3,$2); } # q# # --> qr # #
6345 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
6346 0         0 while (not /\G \z/oxgc) {
6347 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6348 0         0 elsif (/\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { return $e . e_chdir_q('q',$1,$3,$2); } # q ( ) --> qr ( )
6349 0         0 elsif (/\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { return $e . e_chdir_q('q',$1,$3,$2); } # q { } --> qr { }
6350 0         0 elsif (/\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { return $e . e_chdir_q('q',$1,$3,$2); } # q [ ] --> qr [ ]
6351 0         0 elsif (/\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { return $e . e_chdir_q('q',$1,$3,$2); } # q < > --> qr < >
6352             elsif (/\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { return $e . e_chdir_q('q','{','}',$2); } # q | | --> qr { }
6353 0         0 elsif (/\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { return $e . e_chdir_q('q',$1,$3,$2); } # q * * --> qr * *
6354             }
6355             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6356             }
6357             }
6358              
6359 0         0 # chdir ''
6360 2         6 elsif (/\G (\') /oxgc) {
6361 2 50       6 my $q_string = '';
  13 50       55  
    100          
    50          
6362 0         0 while (not /\G \z/oxgc) {
6363 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
6364 2         6 elsif (/\G (\\\') /oxgc) { $q_string .= $1; }
6365             elsif (/\G \' /oxgc) { return $e . e_chdir_q('',"'","'",$q_string); }
6366 11         23 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
6367             }
6368             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6369             }
6370              
6371 0         0 # chdir ""
6372 0         0 elsif (/\G (\") /oxgc) {
6373 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
6374 0         0 while (not /\G \z/oxgc) {
6375 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
6376 0         0 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; }
6377             elsif (/\G \" /oxgc) { return $e . e_chdir('','"','"',$qq_string); }
6378 0         0 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
6379             }
6380             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6381             }
6382             }
6383              
6384 0         0 # split
6385             elsif (/\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
6386 404         891 $slash = 'm//';
6387 404         614  
6388 404         1467 my $e = '';
6389             while (/\G ( (?>\s+) | \( | \#.* ) /oxgc) {
6390             $e .= $1;
6391             }
6392 401 100       1636  
  404 100       17933  
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    100          
    50          
    50          
    50          
6393             # end of split
6394             if (/\G (?= [,;\)\}\]] ) /oxgc) { return 'Ehp15::split' . $e; }
6395 3         15  
6396             # split scalar value
6397             elsif (/\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { return 'Ehp15::split' . $e . e_string($1); }
6398 1         5  
6399 0         0 # split literal space
6400 0         0 elsif (/\G \b qq (\#) [ ] (\#) /oxgc) { return 'Ehp15::split' . $e . qq {qq$1 $2}; }
6401 0         0 elsif (/\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Ehp15::split' . $e . qq{$1qq$2 $3}; }
6402 0         0 elsif (/\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Ehp15::split' . $e . qq{$1qq$2 $3}; }
6403 0         0 elsif (/\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Ehp15::split' . $e . qq{$1qq$2 $3}; }
6404 0         0 elsif (/\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Ehp15::split' . $e . qq{$1qq$2 $3}; }
6405 0         0 elsif (/\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Ehp15::split' . $e . qq{$1qq$2 $3}; }
6406 0         0 elsif (/\G \b q (\#) [ ] (\#) /oxgc) { return 'Ehp15::split' . $e . qq {q$1 $2}; }
6407 0         0 elsif (/\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Ehp15::split' . $e . qq {$1q$2 $3}; }
6408 0         0 elsif (/\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Ehp15::split' . $e . qq {$1q$2 $3}; }
6409 0         0 elsif (/\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Ehp15::split' . $e . qq {$1q$2 $3}; }
6410 0         0 elsif (/\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Ehp15::split' . $e . qq {$1q$2 $3}; }
6411 13         69 elsif (/\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Ehp15::split' . $e . qq {$1q$2 $3}; }
6412             elsif (/\G ' [ ] ' /oxgc) { return 'Ehp15::split' . $e . qq {' '}; }
6413             elsif (/\G " [ ] " /oxgc) { return 'Ehp15::split' . $e . qq {" "}; }
6414              
6415 2 0       11 # split qq//
  0         0  
6416             elsif (/\G \b (qq) \b /oxgc) {
6417 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq# # --> qr # #
6418 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
6419 0         0 while (not /\G \z/oxgc) {
6420 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6421 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq ( ) --> qr ( )
6422 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq { } --> qr { }
6423 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq [ ] --> qr [ ]
6424 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq < > --> qr < >
6425             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr','{','}',$2,''); } # qq | | --> qr { }
6426 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq * * --> qr * *
6427             }
6428             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6429             }
6430             }
6431              
6432 0 50       0 # split qr//
  124         833  
6433             elsif (/\G \b (qr) \b /oxgc) {
6434 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # qr# #
6435 124 50       325 else {
  124 50       6537  
    50          
    50          
    50          
    100          
    50          
    50          
6436 0         0 while (not /\G \z/oxgc) {
6437 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6438 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr ( )
6439 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr { }
6440 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr [ ]
6441 56         221 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr < >
6442 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # qr ' '
6443             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # qr | | --> qr { }
6444 68         317 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr * *
6445             }
6446             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6447             }
6448             }
6449              
6450 0 0       0 # split q//
  0         0  
6451             elsif (/\G \b (q) \b /oxgc) {
6452 0         0 if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q# # --> qr # #
6453 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
6454 0         0 while (not /\G \z/oxgc) {
6455 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6456 0         0 elsif (/\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q ( ) --> qr ( )
6457 0         0 elsif (/\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q { } --> qr { }
6458 0         0 elsif (/\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q [ ] --> qr [ ]
6459 0         0 elsif (/\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q < > --> qr < >
6460             elsif (/\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr','{','}',$2,''); } # q | | --> qr { }
6461 0         0 elsif (/\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q * * --> qr * *
6462             }
6463             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6464             }
6465             }
6466              
6467 0 50       0 # split m//
  136         946  
6468             elsif (/\G \b (m) \b /oxgc) {
6469 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # m# # --> qr # #
6470 136 50       379 else {
  136 50       6487  
    50          
    50          
    50          
    100          
    50          
    50          
6471 0         0 while (not /\G \z/oxgc) {
6472 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6473 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m ( ) --> qr ( )
6474 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m { } --> qr { }
6475 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m [ ] --> qr [ ]
6476 56         286 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m < > --> qr < >
6477 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # m ' ' --> qr ' '
6478             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # m | | --> qr { }
6479 80         372 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m * * --> qr * *
6480             }
6481             die __FILE__, ": Search pattern not terminated\n";
6482             }
6483             }
6484              
6485 0         0 # split ''
6486 0         0 elsif (/\G (\') /oxgc) {
6487 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
6488 0         0 while (not /\G \z/oxgc) {
6489 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
6490 0         0 elsif (/\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
6491             elsif (/\G \' /oxgc) { return e_split_q($e.q{ qr},"'","'",$q_string,''); } # ' ' --> qr ' '
6492 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
6493             }
6494             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6495             }
6496              
6497 0         0 # split ""
6498 0         0 elsif (/\G (\") /oxgc) {
6499 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
6500 0         0 while (not /\G \z/oxgc) {
6501 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
6502 0         0 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
6503             elsif (/\G \" /oxgc) { return e_split($e.q{ qr},'"','"',$qq_string,''); } # " " --> qr " "
6504 0         0 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
6505             }
6506             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6507             }
6508              
6509 0         0 # split //
6510 125         253 elsif (/\G (\/) /oxgc) {
6511 125 50       398 my $regexp = '';
  558 50       2378  
    100          
    50          
6512 0         0 while (not /\G \z/oxgc) {
6513 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
6514 125         446 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
6515             elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_split($e.q{ qr}, '/','/',$regexp,$1); } # / / --> qr / /
6516 433         944 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
6517             }
6518             die __FILE__, ": Search pattern not terminated\n";
6519             }
6520             }
6521              
6522             # tr/// or y///
6523              
6524             # about [cdsrbB]* (/B modifier)
6525             #
6526             # P.559 appendix C
6527             # of ISBN 4-89052-384-7 Programming perl
6528             # (Japanese title is: Perl puroguramingu)
6529 0         0  
6530             elsif (/\G \b ( tr | y ) \b /oxgc) {
6531             my $ope = $1;
6532 11 50       30  
6533 11         263 # $1 $2 $3 $4 $5 $6
6534 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cdsrbB]*) /oxgc) { # tr# # #
6535             my @tr = ($tr_variable,$2);
6536             return e_tr(@tr,'',$4,$6);
6537 0         0 }
6538 11         111 else {
6539 11 50       34 my $e = '';
  11 50       754  
    50          
    50          
    50          
    50          
6540             while (not /\G \z/oxgc) {
6541 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6542 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
6543 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
6544 0         0 while (not /\G \z/oxgc) {
6545 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6546 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) ( )
6547 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) { }
6548 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) [ ]
6549             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) < >
6550 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) * *
6551             }
6552             die __FILE__, ": Transliteration replacement not terminated\n";
6553 0         0 }
6554 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
6555 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
6556 0         0 while (not /\G \z/oxgc) {
6557 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6558 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } ( )
6559 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } { }
6560 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } [ ]
6561             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } < >
6562 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } * *
6563             }
6564             die __FILE__, ": Transliteration replacement not terminated\n";
6565 0         0 }
6566 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
6567 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
6568 0         0 while (not /\G \z/oxgc) {
6569 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6570 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] ( )
6571 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] { }
6572 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] [ ]
6573             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] < >
6574 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] * *
6575             }
6576             die __FILE__, ": Transliteration replacement not terminated\n";
6577 0         0 }
6578 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
6579 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
6580 0         0 while (not /\G \z/oxgc) {
6581 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6582 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > ( )
6583 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > { }
6584 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > [ ]
6585             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > < >
6586 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > * *
6587             }
6588             die __FILE__, ": Transliteration replacement not terminated\n";
6589             }
6590 0         0 # $1 $2 $3 $4 $5 $6
6591 11         43 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { # tr * * *
6592             my @tr = ($tr_variable,$2);
6593             return e_tr(@tr,'',$4,$6);
6594 11         29 }
6595             }
6596             die __FILE__, ": Transliteration pattern not terminated\n";
6597             }
6598             }
6599              
6600 0         0 # qq//
6601             elsif (/\G \b (qq) \b /oxgc) {
6602             my $ope = $1;
6603 5897 100       15803  
6604 5897         12568 # if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_qq($ope,$1,$3,$2); } # qq# #
6605 40         54 if (/\G (\#) /oxgc) { # qq# #
6606 40 100       95 my $qq_string = '';
  1948 50       5325  
    100          
    50          
6607 80         165 while (not /\G \z/oxgc) {
6608 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
6609 40         101 elsif (/\G (\\\#) /oxgc) { $qq_string .= $1; }
6610             elsif (/\G (\#) /oxgc) { return e_qq($ope,'#','#',$qq_string); }
6611 1828         3367 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
6612             }
6613             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6614             }
6615 0         0  
6616 5857         8080 else {
6617 5857 50       14042 my $e = '';
  5857 50       34637  
    100          
    50          
    100          
    50          
6618             while (not /\G \z/oxgc) {
6619             if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6620              
6621 0         0 # elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq ( )
6622 0         0 elsif (/\G (\() /oxgc) { # qq ( )
6623 0         0 my $qq_string = '';
6624 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
6625 0         0 while (not /\G \z/oxgc) {
6626 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
6627             elsif (/\G (\\\)) /oxgc) { $qq_string .= $1; }
6628 0 0       0 elsif (/\G (\() /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
6629 0         0 elsif (/\G (\)) /oxgc) {
6630             if (--$nest == 0) { return $e . e_qq($ope,'(',')',$qq_string); }
6631 0         0 else { $qq_string .= $1; }
6632             }
6633 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
6634             }
6635             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6636             }
6637              
6638 0         0 # elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq { }
6639 5775         8290 elsif (/\G (\{) /oxgc) { # qq { }
6640 5775         8126 my $qq_string = '';
6641 5775 100       12085 local $nest = 1;
  245934 50       805400  
    100          
    100          
    50          
6642 720         1465 while (not /\G \z/oxgc) {
6643 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  1384         1999  
6644             elsif (/\G (\\\}) /oxgc) { $qq_string .= $1; }
6645 1384 100       3841 elsif (/\G (\{) /oxgc) { $qq_string .= $1; $nest++; }
  7159         11376  
6646 5775         11992 elsif (/\G (\}) /oxgc) {
6647             if (--$nest == 0) { return $e . e_qq($ope,'{','}',$qq_string); }
6648 1384         2822 else { $qq_string .= $1; }
6649             }
6650 236671         469908 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
6651             }
6652             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6653             }
6654              
6655 0         0 # elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq [ ]
6656 0         0 elsif (/\G (\[) /oxgc) { # qq [ ]
6657 0         0 my $qq_string = '';
6658 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
6659 0         0 while (not /\G \z/oxgc) {
6660 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
6661             elsif (/\G (\\\]) /oxgc) { $qq_string .= $1; }
6662 0 0       0 elsif (/\G (\[) /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
6663 0         0 elsif (/\G (\]) /oxgc) {
6664             if (--$nest == 0) { return $e . e_qq($ope,'[',']',$qq_string); }
6665 0         0 else { $qq_string .= $1; }
6666             }
6667 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
6668             }
6669             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6670             }
6671              
6672 0         0 # elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq < >
6673 62         116 elsif (/\G (\<) /oxgc) { # qq < >
6674 62         235 my $qq_string = '';
6675 62 100       178 local $nest = 1;
  2040 50       7296  
    100          
    100          
    50          
6676 22         55 while (not /\G \z/oxgc) {
6677 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  2         3  
6678             elsif (/\G (\\\>) /oxgc) { $qq_string .= $1; }
6679 2 100       5 elsif (/\G (\<) /oxgc) { $qq_string .= $1; $nest++; }
  64         158  
6680 62         180 elsif (/\G (\>) /oxgc) {
6681             if (--$nest == 0) { return $e . e_qq($ope,'<','>',$qq_string); }
6682 2         4 else { $qq_string .= $1; }
6683             }
6684 1952         3812 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
6685             }
6686             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6687             }
6688              
6689 0         0 # elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq * *
6690 20         31 elsif (/\G (\S) /oxgc) { # qq * *
6691 20         22 my $delimiter = $1;
6692 20 50       41 my $qq_string = '';
  840 50       2519  
    100          
    50          
6693 0         0 while (not /\G \z/oxgc) {
6694 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
6695 20         36 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $qq_string .= $1; }
6696             elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_qq($ope,$delimiter,$delimiter,$qq_string); }
6697 820         1748 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
6698             }
6699             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6700 0         0 }
6701             }
6702             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6703             }
6704             }
6705              
6706 0         0 # qr//
6707 184 50       476 elsif (/\G \b (qr) \b /oxgc) {
6708 184         808 my $ope = $1;
6709             if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { # qr# # #
6710             return e_qr($ope,$1,$3,$2,$4);
6711 0         0 }
6712 184         262 else {
6713 184 50       431 my $e = '';
  184 50       5157  
    100          
    50          
    50          
    100          
    50          
    50          
6714 0         0 while (not /\G \z/oxgc) {
6715 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6716 1         7 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr ( )
6717 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr { }
6718 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr [ ]
6719 76         206 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr < >
6720 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # qr ' '
6721             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # qr | | --> qr { }
6722 107         400 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr * *
6723             }
6724             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6725             }
6726             }
6727              
6728 0         0 # qw//
6729 34 50       113 elsif (/\G \b (qw) \b /oxgc) {
6730 34         126 my $ope = $1;
6731             if (/\G (\#) (.*?) (\#) /oxmsgc) { # qw# #
6732             return e_qw($ope,$1,$3,$2);
6733 0         0 }
6734 34         67 else {
6735 34 50       117 my $e = '';
  34 50       215  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
6736             while (not /\G \z/oxgc) {
6737 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6738 34         127  
6739             elsif (/\G (\() ([^(]*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
6740 0         0 elsif (/\G (\() ((?:$q_paren)*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
6741 0         0  
6742             elsif (/\G (\{) ([^{]*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
6743 0         0 elsif (/\G (\{) ((?:$q_brace)*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
6744 0         0  
6745             elsif (/\G (\[) ([^[]*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
6746 0         0 elsif (/\G (\[) ((?:$q_bracket)*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
6747 0         0  
6748             elsif (/\G (\<) ([^<]*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
6749 0         0 elsif (/\G (\<) ((?:$q_angle)*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
6750 0         0  
6751             elsif (/\G ([\x21-\x3F]) (.*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
6752 0         0 elsif (/\G (\S) ((?:$q_char)*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
6753             }
6754             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6755             }
6756             }
6757              
6758 0         0 # qx//
6759 3 50       16 elsif (/\G \b (qx) \b /oxgc) {
6760 3         77 my $ope = $1;
6761             if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
6762             return e_qq($ope,$1,$3,$2);
6763 0         0 }
6764 3         8 else {
6765 3 50       14 my $e = '';
  3 50       485  
    100          
    50          
    50          
    50          
    50          
6766 0         0 while (not /\G \z/oxgc) {
6767 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6768 2         9 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx ( )
6769 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx { }
6770 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx [ ]
6771 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx < >
6772             elsif (/\G (\') ((?:$qq_char)*?) (\') /oxgc) { return $e . e_q ($ope,$1,$3,$2); } # qx ' '
6773 1         5 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx * *
6774             }
6775             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6776             }
6777             }
6778              
6779 0         0 # q//
6780             elsif (/\G \b (q) \b /oxgc) {
6781             my $ope = $1;
6782              
6783             # if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_q($ope,$1,$3,$2); } # q# #
6784              
6785             # avoid "Error: Runtime exception" of perl version 5.005_03
6786 606 50       2107 # (and so on)
6787 606         2079  
6788 0         0 if (/\G (\#) /oxgc) { # q# #
6789 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
6790 0         0 while (not /\G \z/oxgc) {
6791 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
6792 0         0 elsif (/\G (\\\#) /oxgc) { $q_string .= $1; }
6793             elsif (/\G (\#) /oxgc) { return e_q($ope,'#','#',$q_string); }
6794 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
6795             }
6796             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6797             }
6798 0         0  
6799 606         1167 else {
6800 606 50       2042 my $e = '';
  606 100       3591  
    100          
    50          
    100          
    50          
6801             while (not /\G \z/oxgc) {
6802             if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6803              
6804 0         0 # elsif (/\G (\() ((?:\\\)|\\\\|$q_paren)*?) (\)) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q ( )
6805 1         3 elsif (/\G (\() /oxgc) { # q ( )
6806 1         3 my $q_string = '';
6807 1 50       5 local $nest = 1;
  7 50       49  
    50          
    50          
    100          
    50          
6808 0         0 while (not /\G \z/oxgc) {
6809 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
6810 0         0 elsif (/\G (\\\)) /oxgc) { $q_string .= $1; }
  0         0  
6811             elsif (/\G (\\\() /oxgc) { $q_string .= $1; }
6812 0 50       0 elsif (/\G (\() /oxgc) { $q_string .= $1; $nest++; }
  1         4  
6813 1         3 elsif (/\G (\)) /oxgc) {
6814             if (--$nest == 0) { return $e . e_q($ope,'(',')',$q_string); }
6815 0         0 else { $q_string .= $1; }
6816             }
6817 6         14 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
6818             }
6819             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6820             }
6821              
6822 0         0 # elsif (/\G (\{) ((?:\\\}|\\\\|$q_brace)*?) (\}) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q { }
6823 599         1098 elsif (/\G (\{) /oxgc) { # q { }
6824 599         1218 my $q_string = '';
6825 599 50       2044 local $nest = 1;
  8202 50       37409  
    50          
    100          
    100          
    50          
6826 0         0 while (not /\G \z/oxgc) {
6827 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
6828 0         0 elsif (/\G (\\\}) /oxgc) { $q_string .= $1; }
  114         187  
6829             elsif (/\G (\\\{) /oxgc) { $q_string .= $1; }
6830 114 100       382 elsif (/\G (\{) /oxgc) { $q_string .= $1; $nest++; }
  713         1602  
6831 599         2398 elsif (/\G (\}) /oxgc) {
6832             if (--$nest == 0) { return $e . e_q($ope,'{','}',$q_string); }
6833 114         234 else { $q_string .= $1; }
6834             }
6835 7375         16417 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
6836             }
6837             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6838             }
6839              
6840 0         0 # elsif (/\G (\[) ((?:\\\]|\\\\|$q_bracket)*?) (\]) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q [ ]
6841 0         0 elsif (/\G (\[) /oxgc) { # q [ ]
6842 0         0 my $q_string = '';
6843 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
    0          
6844 0         0 while (not /\G \z/oxgc) {
6845 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
6846 0         0 elsif (/\G (\\\]) /oxgc) { $q_string .= $1; }
  0         0  
6847             elsif (/\G (\\\[) /oxgc) { $q_string .= $1; }
6848 0 0       0 elsif (/\G (\[) /oxgc) { $q_string .= $1; $nest++; }
  0         0  
6849 0         0 elsif (/\G (\]) /oxgc) {
6850             if (--$nest == 0) { return $e . e_q($ope,'[',']',$q_string); }
6851 0         0 else { $q_string .= $1; }
6852             }
6853 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
6854             }
6855             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6856             }
6857              
6858 0         0 # elsif (/\G (\<) ((?:\\\>|\\\\|$q_angle)*?) (\>) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q < >
6859 5         10 elsif (/\G (\<) /oxgc) { # q < >
6860 5         11 my $q_string = '';
6861 5 50       19 local $nest = 1;
  82 50       410  
    50          
    50          
    100          
    50          
6862 0         0 while (not /\G \z/oxgc) {
6863 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
6864 0         0 elsif (/\G (\\\>) /oxgc) { $q_string .= $1; }
  0         0  
6865             elsif (/\G (\\\<) /oxgc) { $q_string .= $1; }
6866 0 50       0 elsif (/\G (\<) /oxgc) { $q_string .= $1; $nest++; }
  5         13  
6867 5         16 elsif (/\G (\>) /oxgc) {
6868             if (--$nest == 0) { return $e . e_q($ope,'<','>',$q_string); }
6869 0         0 else { $q_string .= $1; }
6870             }
6871 77         153 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
6872             }
6873             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6874             }
6875              
6876 0         0 # elsif (/\G (\S) ((?:\\\1|\\\\|$q_char)*?) (\1) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q * *
6877 1         3 elsif (/\G (\S) /oxgc) { # q * *
6878 1         3 my $delimiter = $1;
6879 1 50       4 my $q_string = '';
  14 50       82  
    100          
    50          
6880 0         0 while (not /\G \z/oxgc) {
6881 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
6882 1         3 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $q_string .= $1; }
6883             elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_q($ope,$delimiter,$delimiter,$q_string); }
6884 13         27 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
6885             }
6886             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6887 0         0 }
6888             }
6889             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
6890             }
6891             }
6892              
6893 0         0 # m//
6894 491 50       1955 elsif (/\G \b (m) \b /oxgc) {
6895 491         2884 my $ope = $1;
6896             if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { # m# #
6897             return e_qr($ope,$1,$3,$2,$4);
6898 0         0 }
6899 491         849 else {
6900 491 50       1455 my $e = '';
  491 50       31519  
    50          
    50          
    50          
    100          
    100          
    50          
    50          
6901 0         0 while (not /\G \z/oxgc) {
6902 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6903 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ( )
6904 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m { }
6905 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m [ ]
6906 92         269 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m < >
6907 87         311 elsif (/\G (\?) ((?:$qq_char)*?) (\?) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ? ?
6908 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # m ' '
6909             elsif (/\G ([*\-:\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # m | | --> m { }
6910 312         2689 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m * *
6911             }
6912             die __FILE__, ": Search pattern not terminated\n";
6913             }
6914             }
6915              
6916             # s///
6917              
6918             # about [cegimosxpradlunbB]* (/cg modifier)
6919             #
6920             # P.67 Pattern-Matching Operators
6921             # of ISBN 0-596-00241-6 Perl in a Nutshell, Second Edition.
6922 0         0  
6923             elsif (/\G \b (s) \b /oxgc) {
6924             my $ope = $1;
6925 290 100       840  
6926 290         4159 # $1 $2 $3 $4 $5 $6
6927             if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cegimosxpradlunbB]*) /oxgc) { # s# # #
6928             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
6929 1         5 }
6930 289         497 else {
6931 289 50       914 my $e = '';
  289 50       27474  
    50          
    50          
    50          
    100          
    100          
    50          
    50          
6932             while (not /\G \z/oxgc) {
6933 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6934 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
6935 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
6936             while (not /\G \z/oxgc) {
6937 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6938 0         0 # $1 $2 $3 $4
6939 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6940 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6941 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6942 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6943 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6944 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6945 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6946             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6947 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6948             }
6949             die __FILE__, ": Substitution replacement not terminated\n";
6950 0         0 }
6951 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
6952 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
6953             while (not /\G \z/oxgc) {
6954 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6955 0         0 # $1 $2 $3 $4
6956 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6957 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6958 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6959 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6960 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6961 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6962 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6963             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6964 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6965             }
6966             die __FILE__, ": Substitution replacement not terminated\n";
6967 0         0 }
6968 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
6969 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
6970             while (not /\G \z/oxgc) {
6971 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6972 0         0 # $1 $2 $3 $4
6973 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6974 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6975 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6976 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6977 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6978             elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6979 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6980             }
6981             die __FILE__, ": Substitution replacement not terminated\n";
6982 0         0 }
6983 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
6984 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
6985             while (not /\G \z/oxgc) {
6986 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
6987 0         0 # $1 $2 $3 $4
6988 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6989 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6990 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6991 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6992 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6993 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6994 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6995             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6996 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
6997             }
6998             die __FILE__, ": Substitution replacement not terminated\n";
6999             }
7000 0         0 # $1 $2 $3 $4 $5 $6
7001             elsif (/\G (\') ((?:$qq_char)*?) (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) {
7002             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
7003             }
7004 96         255 # $1 $2 $3 $4 $5 $6
7005             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
7006             return e_sub($sub_variable,'{',$2,'}','{',$4,'}',$6); # s | | | --> s { } { }
7007             }
7008 2         28 # $1 $2 $3 $4 $5 $6
7009             elsif (/\G (\$) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
7010             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
7011             }
7012 0         0 # $1 $2 $3 $4 $5 $6
7013             elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
7014             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
7015 191         895 }
7016             }
7017             die __FILE__, ": Substitution pattern not terminated\n";
7018             }
7019             }
7020 0         0  
7021 1         7 # do
7022 0         0 elsif (/\G \b do (?= (?>\s*) \{ ) /oxmsgc) { return 'do'; }
7023 0         0 elsif (/\G \b do (?= (?>\s+) (?: q | qq | qx ) \b) /oxmsgc) { return 'Ehp15::do'; }
7024 0         0 elsif (/\G \b do (?= (?>\s+) (?>\w+)) /oxmsgc) { return 'do'; }
7025             elsif (/\G \b do (?= (?>\s*) \$ (?> \w+ (?: ::\w+)* ) \( ) /oxmsgc) { return 'do'; }
7026             elsif (/\G \b do \b /oxmsgc) { return 'Ehp15::do'; }
7027 2         10  
7028 0         0 # require ignore module
7029 0         0 elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# require$1$2"; }
7030             elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x80-\xA0\xE0-\xFE#]) /oxmsgc) { return "# require$1\n$2"; }
7031             elsif (/\G \b require ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# require$1"; }
7032 0         0  
7033 0         0 # require version number
7034 0         0 elsif (/\G \b require (?>\s+) ((?>0[0-7_]*)) (?>\s*) ; /oxmsgc) { return "require $1;"; }
7035             elsif (/\G \b require (?>\s+) ((?>[1-9][0-9_]*(?:\.[0-9_]+)*)) (?>\s*) ; /oxmsgc) { return "require $1;"; }
7036             elsif (/\G \b require (?>\s+) ((?>v[0-9][0-9_]*(?:\.[0-9_]+)*)) (?>\s*) ; /oxmsgc) { return "require $1;"; }
7037 0         0  
7038             # require bare package name
7039             elsif (/\G \b require (?>\s+) ((?>[A-Za-z_]\w* (?: :: [A-Za-z_]\w*)*)) (?>\s*) ; /oxmsgc) { return "require $1;"; }
7040 18         124  
7041 0         0 # require else
7042             elsif (/\G \b require (?>\s*) ; /oxmsgc) { return 'Ehp15::require;'; }
7043             elsif (/\G \b require \b /oxmsgc) { return 'Ehp15::require'; }
7044 1         6  
7045 70         634 # use strict; --> use strict; no strict qw(refs);
7046 0         0 elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "use$1 no strict qw(refs);$2"; }
7047             elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [^\x80-\xA0\xE0-\xFE#]) /oxmsgc) { return "use$1 no strict qw(refs);\n$2"; }
7048             elsif (/\G \b use ((?>\s+) strict) \b /oxmsgc) { return "use$1; no strict qw(refs)"; }
7049              
7050 0 50 33     0 # use 5.12.0; --> use 5.12.0; no strict qw(refs);
      33        
7051 3         39 elsif (/\G \b use (?>\s+) ((?>([1-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
7052             if (($2 >= 6) or (($2 == 5) and ($3 ge '012'))) {
7053             return "use $1; no strict qw(refs);";
7054 0         0 }
7055             else {
7056             return "use $1;";
7057             }
7058 3 0 0     18 }
      0        
7059 0         0 elsif (/\G \b use (?>\s+) ((?>v([0-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
7060             if (($2 >= 6) or (($2 == 5) and ($3 >= 12))) {
7061             return "use $1; no strict qw(refs);";
7062 0         0 }
7063             else {
7064             return "use $1;";
7065             }
7066             }
7067 0         0  
7068 2         15 # ignore use module
7069 0         0 elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# use$1$2"; }
7070             elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x80-\xA0\xE0-\xFE#]) /oxmsgc) { return "# use$1\n$2"; }
7071             elsif (/\G \b use ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# use$1"; }
7072 0         0  
7073 0         0 # ignore no module
7074 0         0 elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# no$1$2"; }
7075             elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x80-\xA0\xE0-\xFE#]) /oxmsgc) { return "# no$1\n$2"; }
7076             elsif (/\G \b no ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# no$1"; }
7077 0         0  
7078 0         0 # use without import
7079 0         0 elsif (/\G \b use (?>\s+) ((?>0[0-7_]*)) (?>\s*) ; /oxmsgc) { return "use $1;"; }
7080 0         0 elsif (/\G \b use (?>\s+) ((?>[1-9][0-9_]*(?:\.[0-9_]+)*)) (?>\s*) ; /oxmsgc) { return "use $1;"; }
7081 0         0 elsif (/\G \b use (?>\s+) ((?>v[0-9][0-9_]*(?:\.[0-9_]+)*)) (?>\s*) ; /oxmsgc) { return "use $1;"; }
7082 0         0 elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s*) (\() (?>\s*) \) (?>\s*) ; /oxmsgc) { return e_use_noimport($1); }
7083 0         0 elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) qw (?>\s*) (\() (?>\s*) \) (?>\s*) ; /oxmsgc) { return e_use_noimport($1); }
7084 0         0 elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) qw (?>\s*) (\{) (?>\s*) \} (?>\s*) ; /oxmsgc) { return e_use_noimport($1); }
7085 0         0 elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) qw (?>\s*) (\[) (?>\s*) \] (?>\s*) ; /oxmsgc) { return e_use_noimport($1); }
7086 0         0 elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) qw (?>\s*) (\<) (?>\s*) \> (?>\s*) ; /oxmsgc) { return e_use_noimport($1); }
7087             elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) qw (?>\s*) ([\x21-\x3F]) (?>\s*) \2 (?>\s*) ; /oxmsgc) { return e_use_noimport($1); }
7088             elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) qw (?>\s*) (\S) (?>\s*) \2 (?>\s*) ; /oxmsgc) { return e_use_noimport($1); }
7089 0         0  
7090             # use with import no parameter
7091             elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s*) ; /oxmsgc) { return e_use_noparam($1); }
7092 0         0  
7093 0         0 # use with import parameters
7094 0         0 elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s*) ( (\() [^\x80-\xA0\xE0-\xFE)]* \)) (?>\s*) ; /oxmsgc) { return e_use($1,$2); }
7095 0         0 elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s*) ( (\') [^\x80-\xA0\xE0-\xFE']* \') (?>\s*) ; /oxmsgc) { return e_use($1,$2); }
7096 0         0 elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s*) ( (\") [^\x80-\xA0\xE0-\xFE"]* \") (?>\s*) ; /oxmsgc) { return e_use($1,$2); }
7097 0         0 elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) ((?: q | qq | qw ) (?>\s*) (\() [^\x80-\xA0\xE0-\xFE)]* \)) (?>\s*) ; /oxmsgc) { return e_use($1,$2); }
7098 0         0 elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) ((?: q | qq | qw ) (?>\s*) (\{) (?:$q_char)*? \}) (?>\s*) ; /oxmsgc) { return e_use($1,$2); }
7099 0         0 elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) ((?: q | qq | qw ) (?>\s*) (\[) (?:$q_char)*? \]) (?>\s*) ; /oxmsgc) { return e_use($1,$2); }
7100 0         0 elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) ((?: q | qq | qw ) (?>\s*) (\<) [^\x80-\xA0\xE0-\xFE>]* \>) (?>\s*) ; /oxmsgc) { return e_use($1,$2); }
7101             elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) ((?: q | qq | qw ) (?>\s*) ([\x21-\x3F]) .*? \3) (?>\s*) ; /oxmsgc) { return e_use($1,$2); }
7102             elsif (/\G \b use (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) ((?: q | qq | qw ) (?>\s*) (\S) (?:$q_char)*? \3) (?>\s*) ; /oxmsgc) { return e_use($1,$2); }
7103 0         0  
7104 0         0 # no without unimport
7105 0         0 elsif (/\G \b no (?>\s+) ((?>0[0-7_]*)) (?>\s*) ; /oxmsgc) { return "no $1;"; }
7106 0         0 elsif (/\G \b no (?>\s+) ((?>[1-9][0-9_]*(?:\.[0-9_]+)*)) (?>\s*) ; /oxmsgc) { return "no $1;"; }
7107 0         0 elsif (/\G \b no (?>\s+) ((?>v[0-9][0-9_]*(?:\.[0-9_]+)*)) (?>\s*) ; /oxmsgc) { return "no $1;"; }
7108 0         0 elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s*) (\() (?>\s*) \) (?>\s*) ; /oxmsgc) { return e_no_nounimport($1); }
7109 0         0 elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) qw (?>\s*) (\() (?>\s*) \) (?>\s*) ; /oxmsgc) { return e_no_nounimport($1); }
7110 0         0 elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) qw (?>\s*) (\{) (?>\s*) \} (?>\s*) ; /oxmsgc) { return e_no_nounimport($1); }
7111 0         0 elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) qw (?>\s*) (\[) (?>\s*) \] (?>\s*) ; /oxmsgc) { return e_no_nounimport($1); }
7112 0         0 elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) qw (?>\s*) (\<) (?>\s*) \> (?>\s*) ; /oxmsgc) { return e_no_nounimport($1); }
7113             elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) qw (?>\s*) ([\x21-\x3F]) (?>\s*) \2 (?>\s*) ; /oxmsgc) { return e_no_nounimport($1); }
7114             elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) qw (?>\s*) (\S) (?>\s*) \2 (?>\s*) ; /oxmsgc) { return e_no_nounimport($1); }
7115 0         0  
7116             # no with unimport no parameter
7117             elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s*) ; /oxmsgc) { return e_no_noparam($1); }
7118 0         0  
7119 0         0 # no with unimport parameters
7120 0         0 elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s*) ( (\() [^\x80-\xA0\xE0-\xFE)]* \)) (?>\s*) ; /oxmsgc) { return e_no($1,$2); }
7121 0         0 elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s*) ( (\') [^\x80-\xA0\xE0-\xFE']* \') (?>\s*) ; /oxmsgc) { return e_no($1,$2); }
7122 0         0 elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s*) ( (\") [^\x80-\xA0\xE0-\xFE"]* \") (?>\s*) ; /oxmsgc) { return e_no($1,$2); }
7123 0         0 elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) ((?: q | qq | qw ) (?>\s*) (\() [^\x80-\xA0\xE0-\xFE)]* \)) (?>\s*) ; /oxmsgc) { return e_no($1,$2); }
7124 0         0 elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) ((?: q | qq | qw ) (?>\s*) (\{) (?:$q_char)*? \}) (?>\s*) ; /oxmsgc) { return e_no($1,$2); }
7125 0         0 elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) ((?: q | qq | qw ) (?>\s*) (\[) (?:$q_char)*? \]) (?>\s*) ; /oxmsgc) { return e_no($1,$2); }
7126 0         0 elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) ((?: q | qq | qw ) (?>\s*) (\<) [^\x80-\xA0\xE0-\xFE>]* \>) (?>\s*) ; /oxmsgc) { return e_no($1,$2); }
7127             elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) ((?: q | qq | qw ) (?>\s*) ([\x21-\x3F]) .*? \3) (?>\s*) ; /oxmsgc) { return e_no($1,$2); }
7128             elsif (/\G \b no (?>\s+) ((?>[A-Z]\w*(?: ::\w+)*)) (?>\s+) ((?: q | qq | qw ) (?>\s*) (\S) (?:$q_char)*? \3) (?>\s*) ; /oxmsgc) { return e_no($1,$2); }
7129 0         0  
7130             # use else
7131             elsif (/\G \b use \b /oxmsgc) { return "use"; }
7132 0         0  
7133             # use else
7134             elsif (/\G \b no \b /oxmsgc) { return "no"; }
7135              
7136 2         11 # ''
7137 3177         7262 elsif (/\G (?
7138 3177 100       8955 my $q_string = '';
  15691 100       57857  
    100          
    50          
7139 8         24 while (not /\G \z/oxgc) {
7140 48         89 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
7141 3177         7460 elsif (/\G (\\\') /oxgc) { $q_string .= $1; }
7142             elsif (/\G \' /oxgc) { return e_q('', "'","'",$q_string); }
7143 12458         31057 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
7144             }
7145             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
7146             }
7147              
7148 0         0 # ""
7149 3404         8194 elsif (/\G (\") /oxgc) {
7150 3404 100       10418 my $qq_string = '';
  70201 100       223306  
    100          
    50          
7151 109         237 while (not /\G \z/oxgc) {
7152 14         28 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
7153 3404         8476 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; }
7154             elsif (/\G \" /oxgc) { return e_qq('', '"','"',$qq_string); }
7155 66674         128589 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
7156             }
7157             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
7158             }
7159              
7160 0         0 # ``
7161 37         113 elsif (/\G (\`) /oxgc) {
7162 37 50       138 my $qx_string = '';
  313 50       1947  
    100          
    50          
7163 0         0 while (not /\G \z/oxgc) {
7164 0         0 if (/\G (\\\\) /oxgc) { $qx_string .= $1; }
7165 37         126 elsif (/\G (\\\`) /oxgc) { $qx_string .= $1; }
7166             elsif (/\G \` /oxgc) { return e_qq('', '`','`',$qx_string); }
7167 276         644 elsif (/\G ($q_char) /oxgc) { $qx_string .= $1; }
7168             }
7169             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
7170             }
7171              
7172 0         0 # // --- not divide operator (num / num), not defined-or
7173 1231         2978 elsif (($slash eq 'm//') and /\G (\/) /oxgc) {
7174 1231 100       3220 my $regexp = '';
  12510 50       46511  
    100          
    50          
7175 11         218 while (not /\G \z/oxgc) {
7176 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
7177 1231         3496 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; }
7178             elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_qr('', '/','/',$regexp,$1); }
7179 11268         22402 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
7180             }
7181             die __FILE__, ": Search pattern not terminated\n";
7182             }
7183              
7184 0         0 # ?? --- not conditional operator (condition ? then : else)
7185 92         227 elsif (($slash eq 'm//') and /\G (\?) /oxgc) {
7186 92 50       226 my $regexp = '';
  266 50       1013  
    100          
    50          
7187 0         0 while (not /\G \z/oxgc) {
7188 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
7189 92         236 elsif (/\G (\\\?) /oxgc) { $regexp .= $1; }
7190             elsif (/\G \? ([cgimosxpadlunbB]*) /oxgc) { return e_qr('m','?','?',$regexp,$1); }
7191 174         436 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
7192             }
7193             die __FILE__, ": Search pattern not terminated\n";
7194             }
7195 0         0  
  0         0  
7196             # <<>> (a safer ARGV)
7197             elsif (/\G ( <<>> ) /oxgc) { $slash = 'm//'; return $1; }
7198 0         0  
  0         0  
7199             # << (bit shift) --- not here document
7200             elsif (/\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) { $slash = 'm//'; return $1; }
7201              
7202 0         0 # <<~'HEREDOC'
7203 6         13 elsif (/\G ( <<~ [\t ]* '([a-zA-Z_0-9]*)' ) /oxgc) {
7204 6         11 $slash = 'm//';
7205             my $here_quote = $1;
7206             my $delimiter = $2;
7207 6 50       8  
7208 6         13 # get here document
7209 6         21 if ($here_script eq '') {
7210             $here_script = CORE::substr $_, pos $_;
7211 6 50       29 $here_script =~ s/.*?\n//oxm;
7212 6         51 }
7213 6         13 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
7214 6         8 my $heredoc = $1;
7215 6         42 my $indent = $2;
7216 6         18 $heredoc =~ s{^$indent}{}msg; # no /ox
7217             push @heredoc, $heredoc . qq{\n$delimiter\n};
7218             push @heredoc_delimiter, qq{\\s*$delimiter};
7219 6         11 }
7220             else {
7221 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
7222             }
7223             return qq{<<'$delimiter'};
7224             }
7225              
7226             # <<~\HEREDOC
7227              
7228             # P.66 2.6.6. "Here" Documents
7229             # in Chapter 2: Bits and Pieces
7230             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
7231              
7232             # P.73 "Here" Documents
7233             # in Chapter 2: Bits and Pieces
7234             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7235 6         23  
7236 3         8 elsif (/\G ( <<~ \\([a-zA-Z_0-9]+) ) /oxgc) {
7237 3         6 $slash = 'm//';
7238             my $here_quote = $1;
7239             my $delimiter = $2;
7240 3 50       5  
7241 3         7 # get here document
7242 3         22 if ($here_script eq '') {
7243             $here_script = CORE::substr $_, pos $_;
7244 3 50       17 $here_script =~ s/.*?\n//oxm;
7245 3         33 }
7246 3         7 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
7247 3         5 my $heredoc = $1;
7248 3         33 my $indent = $2;
7249 3         11 $heredoc =~ s{^$indent}{}msg; # no /ox
7250             push @heredoc, $heredoc . qq{\n$delimiter\n};
7251             push @heredoc_delimiter, qq{\\s*$delimiter};
7252 3         7 }
7253             else {
7254 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
7255             }
7256             return qq{<<\\$delimiter};
7257             }
7258              
7259 3         13 # <<~"HEREDOC"
7260 6         14 elsif (/\G ( <<~ [\t ]* "([a-zA-Z_0-9]*)" ) /oxgc) {
7261 6         12 $slash = 'm//';
7262             my $here_quote = $1;
7263             my $delimiter = $2;
7264 6 50       12  
7265 6         12 # get here document
7266 6         25 if ($here_script eq '') {
7267             $here_script = CORE::substr $_, pos $_;
7268 6 50       29 $here_script =~ s/.*?\n//oxm;
7269 6         60 }
7270 6         13 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
7271 6         8 my $heredoc = $1;
7272 6         46 my $indent = $2;
7273 6         14 $heredoc =~ s{^$indent}{}msg; # no /ox
7274             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
7275             push @heredoc_delimiter, qq{\\s*$delimiter};
7276 6         15 }
7277             else {
7278 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
7279             }
7280             return qq{<<"$delimiter"};
7281             }
7282              
7283 6         31 # <<~HEREDOC
7284 3         7 elsif (/\G ( <<~ ([a-zA-Z_0-9]+) ) /oxgc) {
7285 3         7 $slash = 'm//';
7286             my $here_quote = $1;
7287             my $delimiter = $2;
7288 3 50       5  
7289 3         7 # get here document
7290 3         13 if ($here_script eq '') {
7291             $here_script = CORE::substr $_, pos $_;
7292 3 50       16 $here_script =~ s/.*?\n//oxm;
7293 3         34 }
7294 3         6 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
7295 3         4 my $heredoc = $1;
7296 3         34 my $indent = $2;
7297 3         10 $heredoc =~ s{^$indent}{}msg; # no /ox
7298             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
7299             push @heredoc_delimiter, qq{\\s*$delimiter};
7300 3         6 }
7301             else {
7302 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
7303             }
7304             return qq{<<$delimiter};
7305             }
7306              
7307 3         12 # <<~`HEREDOC`
7308 6         14 elsif (/\G ( <<~ [\t ]* `([a-zA-Z_0-9]*)` ) /oxgc) {
7309 6         11 $slash = 'm//';
7310             my $here_quote = $1;
7311             my $delimiter = $2;
7312 6 50       9  
7313 6         13 # get here document
7314 6         23 if ($here_script eq '') {
7315             $here_script = CORE::substr $_, pos $_;
7316 6 50       31 $here_script =~ s/.*?\n//oxm;
7317 6         60 }
7318 6         13 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
7319 6         13 my $heredoc = $1;
7320 6         49 my $indent = $2;
7321 6         16 $heredoc =~ s{^$indent}{}msg; # no /ox
7322             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
7323             push @heredoc_delimiter, qq{\\s*$delimiter};
7324 6         14 }
7325             else {
7326 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
7327             }
7328             return qq{<<`$delimiter`};
7329             }
7330              
7331 6         24 # <<'HEREDOC'
7332 86         196 elsif (/\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
7333 86         187 $slash = 'm//';
7334             my $here_quote = $1;
7335             my $delimiter = $2;
7336 86 100       177  
7337 86         201 # get here document
7338 83         441 if ($here_script eq '') {
7339             $here_script = CORE::substr $_, pos $_;
7340 83 50       434 $here_script =~ s/.*?\n//oxm;
7341 86         683 }
7342 86         302 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
7343             push @heredoc, $1 . qq{\n$delimiter\n};
7344             push @heredoc_delimiter, $delimiter;
7345 86         143 }
7346             else {
7347 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
7348             }
7349             return $here_quote;
7350             }
7351              
7352             # <<\HEREDOC
7353              
7354             # P.66 2.6.6. "Here" Documents
7355             # in Chapter 2: Bits and Pieces
7356             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
7357              
7358             # P.73 "Here" Documents
7359             # in Chapter 2: Bits and Pieces
7360             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7361 86         346  
7362 2         7 elsif (/\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
7363 2         6 $slash = 'm//';
7364             my $here_quote = $1;
7365             my $delimiter = $2;
7366 2 100       3  
7367 2         6 # get here document
7368 1         7 if ($here_script eq '') {
7369             $here_script = CORE::substr $_, pos $_;
7370 1 50       6 $here_script =~ s/.*?\n//oxm;
7371 2         27 }
7372 2         7 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
7373             push @heredoc, $1 . qq{\n$delimiter\n};
7374             push @heredoc_delimiter, $delimiter;
7375 2         4 }
7376             else {
7377 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
7378             }
7379             return $here_quote;
7380             }
7381              
7382 2         8 # <<"HEREDOC"
7383 39         100 elsif (/\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
7384 39         101 $slash = 'm//';
7385             my $here_quote = $1;
7386             my $delimiter = $2;
7387 39 100       72  
7388 39         100 # get here document
7389 38         247 if ($here_script eq '') {
7390             $here_script = CORE::substr $_, pos $_;
7391 38 50       210 $here_script =~ s/.*?\n//oxm;
7392 39         493 }
7393 39         127 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
7394             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
7395             push @heredoc_delimiter, $delimiter;
7396 39         94 }
7397             else {
7398 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
7399             }
7400             return $here_quote;
7401             }
7402              
7403 39         180 # <
7404 54         139 elsif (/\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
7405 54         127 $slash = 'm//';
7406             my $here_quote = $1;
7407             my $delimiter = $2;
7408 54 100       111  
7409 54         162 # get here document
7410 51         355 if ($here_script eq '') {
7411             $here_script = CORE::substr $_, pos $_;
7412 51 50       421 $here_script =~ s/.*?\n//oxm;
7413 54         716 }
7414 54         191 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
7415             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
7416             push @heredoc_delimiter, $delimiter;
7417 54         129 }
7418             else {
7419 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
7420             }
7421             return $here_quote;
7422             }
7423              
7424 54         220 # <<`HEREDOC`
7425 0         0 elsif (/\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
7426 0         0 $slash = 'm//';
7427             my $here_quote = $1;
7428             my $delimiter = $2;
7429 0 0       0  
7430 0         0 # get here document
7431 0         0 if ($here_script eq '') {
7432             $here_script = CORE::substr $_, pos $_;
7433 0 0       0 $here_script =~ s/.*?\n//oxm;
7434 0         0 }
7435 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
7436             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
7437             push @heredoc_delimiter, $delimiter;
7438 0         0 }
7439             else {
7440 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
7441             }
7442             return $here_quote;
7443             }
7444              
7445 0         0 # <<= <=> <= < operator
7446             elsif (/\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) {
7447             return $1;
7448             }
7449              
7450 13         75 #
7451             elsif (/\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) {
7452             return $1;
7453             }
7454              
7455             # --- glob
7456              
7457             # avoid "Error: Runtime exception" of perl version 5.005_03
7458 0         0  
7459             elsif (/\G < ((?:[^\x80-\xA0\xE0-\xFE>\0\a\e\f\n\r\t]|[\x80-\xA0\xE0-\xFE][\x00-\xFF])+?) > /oxgc) {
7460             return 'Ehp15::glob("' . $1 . '")';
7461             }
7462 0         0  
7463             # __DATA__
7464             elsif (/\G ^ ( __DATA__ \n .*) \z /oxmsgc) { return $1; }
7465 0         0  
7466             # __END__
7467             elsif (/\G ^ ( __END__ \n .*) \z /oxmsgc) { return $1; }
7468              
7469             # \cD Control-D
7470              
7471             # P.68 2.6.8. Other Literal Tokens
7472             # in Chapter 2: Bits and Pieces
7473             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
7474              
7475             # P.76 Other Literal Tokens
7476             # in Chapter 2: Bits and Pieces
7477 384         3068 # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7478              
7479             elsif (/\G ( \cD .*) \z /oxmsgc) { return $1; }
7480 0         0  
7481             # \cZ Control-Z
7482             elsif (/\G ( \cZ .*) \z /oxmsgc) { return $1; }
7483              
7484             # any operator before div
7485             elsif (/\G (
7486             -- | \+\+ |
7487 0         0 [\)\}\]]
  14161         30726  
7488              
7489             ) /oxgc) { $slash = 'div'; return $1; }
7490              
7491             # yada-yada or triple-dot operator
7492             elsif (/\G (
7493 14161         66903 \.\.\.
  7         15  
7494              
7495             ) /oxgc) { $slash = 'm//'; return q{die('Unimplemented')}; }
7496              
7497             # any operator before m//
7498              
7499             # //, //= (defined-or)
7500              
7501             # P.164 Logical Operators
7502             # in Chapter 10: More Control Structures
7503             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
7504              
7505             # P.119 C-Style Logical (Short-Circuit) Operators
7506             # in Chapter 3: Unary and Binary Operators
7507             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7508              
7509             # (and so on)
7510              
7511             # ~~
7512              
7513             # P.221 The Smart Match Operator
7514             # in Chapter 15: Smart Matching and given-when
7515             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
7516              
7517             # P.112 Smartmatch Operator
7518             # in Chapter 3: Unary and Binary Operators
7519             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7520              
7521             # (and so on)
7522              
7523             elsif (/\G ((?>
7524              
7525             !~~ | !~ | != | ! |
7526             %= | % |
7527             &&= | && | &= | &\.= | &\. | & |
7528             -= | -> | - |
7529             :(?>\s*)= |
7530             : |
7531             <<>> |
7532             <<= | <=> | <= | < |
7533             == | => | =~ | = |
7534             >>= | >> | >= | > |
7535             \*\*= | \*\* | \*= | \* |
7536             \+= | \+ |
7537             \.\. | \.= | \. |
7538             \/\/= | \/\/ |
7539             \/= | \/ |
7540             \? |
7541             \\ |
7542             \^= | \^\.= | \^\. | \^ |
7543             \b x= |
7544             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
7545             ~~ | ~\. | ~ |
7546             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
7547             \b(?: print )\b |
7548              
7549 7         30 [,;\(\{\[]
  23792         49855  
7550              
7551             )) /oxgc) { $slash = 'm//'; return $1; }
7552 23792         116047  
  37029         77180  
7553             # other any character
7554             elsif (/\G ($q_char) /oxgc) { $slash = 'div'; return $1; }
7555              
7556 37029         196284 # system error
7557             else {
7558             die __FILE__, ": Oops, this shouldn't happen!\n";
7559             }
7560             }
7561              
7562 0     3097 0 0 # escape HP-15 string
7563 3097         7344 sub e_string {
7564             my($string) = @_;
7565 3097         7299 my $e_string = '';
7566              
7567             local $slash = 'm//';
7568              
7569             # P.1024 Appendix W.10 Multibyte Processing
7570             # of ISBN 1-56592-224-7 CJKV Information Processing
7571 3097         4717 # (and so on)
7572              
7573             my @char = $string =~ / \G (?>[^\x80-\xA0\xE0-\xFE\\]|\\$q_char|$q_char) /oxmsg;
7574 3097 100 66     30200  
7575 3097 50       14208 # without { ... }
7576 3018         6709 if (not (grep(/\A \{ \z/xms, @char) and grep(/\A \} \z/xms, @char))) {
7577             if ($string !~ /<
7578             return $string;
7579             }
7580             }
7581 3018         7242  
7582 79 50       250 E_STRING_LOOP:
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    50          
7583             while ($string !~ /\G \z/oxgc) {
7584             if (0) {
7585             }
7586 606         97250  
7587 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> @{[Ehp15::PREMATCH()]}
7588 0         0 elsif ($string =~ /\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
7589             $e_string .= q{Ehp15::PREMATCH()};
7590             $slash = 'div';
7591             }
7592              
7593 0         0 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> @{[Ehp15::MATCH()]}
7594 0         0 elsif ($string =~ /\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
7595             $e_string .= q{Ehp15::MATCH()};
7596             $slash = 'div';
7597             }
7598              
7599 0         0 # $', ${'} --> $', ${'}
7600 0         0 elsif ($string =~ /\G ( \$' | \$\{'\} ) /oxmsgc) {
7601             $e_string .= $1;
7602             $slash = 'div';
7603             }
7604              
7605 0         0 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> @{[Ehp15::POSTMATCH()]}
7606 0         0 elsif ($string =~ /\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
7607             $e_string .= q{Ehp15::POSTMATCH()};
7608             $slash = 'div';
7609             }
7610              
7611 0         0 # bareword
7612 0         0 elsif ($string =~ /\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
7613             $e_string .= $1;
7614             $slash = 'div';
7615             }
7616              
7617 0         0 # $0 --> $0
7618 0         0 elsif ($string =~ /\G ( \$ 0 ) /oxmsgc) {
7619             $e_string .= $1;
7620             $slash = 'div';
7621 0         0 }
7622 0         0 elsif ($string =~ /\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
7623             $e_string .= $1;
7624             $slash = 'div';
7625             }
7626              
7627 0         0 # $$ --> $$
7628 0         0 elsif ($string =~ /\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
7629             $e_string .= $1;
7630             $slash = 'div';
7631             }
7632              
7633             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
7634 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
7635 0         0 elsif ($string =~ /\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
7636             $e_string .= e_capture($1);
7637             $slash = 'div';
7638 0         0 }
7639 0         0 elsif ($string =~ /\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
7640             $e_string .= e_capture($1);
7641             $slash = 'div';
7642             }
7643              
7644 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
7645 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
7646             $e_string .= e_capture($1.'->'.$2);
7647             $slash = 'div';
7648             }
7649              
7650 0         0 # $$foo{ ... } --> $ $foo->{ ... }
7651 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
7652             $e_string .= e_capture($1.'->'.$2);
7653             $slash = 'div';
7654             }
7655              
7656 0         0 # $$foo
7657 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
7658             $e_string .= e_capture($1);
7659             $slash = 'div';
7660             }
7661              
7662 0         0 # ${ foo }
7663 0         0 elsif ($string =~ /\G \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} /oxmsgc) {
7664             $e_string .= '${' . $1 . '}';
7665             $slash = 'div';
7666             }
7667              
7668 0         0 # ${ ... }
7669 3         11 elsif ($string =~ /\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
7670             $e_string .= e_capture($1);
7671             $slash = 'div';
7672             }
7673              
7674             # variable or function
7675 3         14 # $ @ % & * $ #
7676 0         0 elsif ($string =~ /\G ( (?: [\$\@\%\&\*] | \$\# | -> | \b sub \b) (?>\s*) (?: split | chop | index | rindex | lc | uc | fc | chr | ord | reverse | getc | tr | y | q | qq | qx | qw | m | s | qr | glob | lstat | opendir | stat | unlink | chdir ) ) \b /oxmsgc) {
7677             $e_string .= $1;
7678             $slash = 'div';
7679             }
7680             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
7681 0         0 # $ @ # \ ' " / ? ( ) [ ] < >
7682 0         0 elsif ($string =~ /\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
7683             $e_string .= $1;
7684             $slash = 'div';
7685             }
7686 0         0  
  0         0  
7687 0         0 # subroutines of package Ehp15
  0         0  
7688 0         0 elsif ($string =~ /\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $e_string .= $1; $slash = 'm//'; }
  0         0  
7689 0         0 elsif ($string =~ /\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
7690 0         0 elsif ($string =~ /\G \b HP15::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
7691 0         0 elsif ($string =~ /\G \b Char::eval \b /oxgc) { $e_string .= 'eval Char::escape'; $slash = 'm//'; }
  0         0  
7692 0         0 elsif ($string =~ /\G \b HP15::eval \b /oxgc) { $e_string .= 'eval HP15::escape'; $slash = 'm//'; }
  0         0  
7693 0         0 elsif ($string =~ /\G \b bytes::substr \b /oxgc) { $e_string .= 'substr'; $slash = 'm//'; }
  0         0  
7694 0         0 elsif ($string =~ /\G \b chop \b /oxgc) { $e_string .= 'Ehp15::chop'; $slash = 'm//'; }
  0         0  
7695 0         0 elsif ($string =~ /\G \b bytes::index \b /oxgc) { $e_string .= 'index'; $slash = 'm//'; }
  0         0  
7696 0         0 elsif ($string =~ /\G \b Char::index \b /oxgc) { $e_string .= 'Char::index'; $slash = 'm//'; }
  0         0  
7697 0         0 elsif ($string =~ /\G \b HP15::index \b /oxgc) { $e_string .= 'HP15::index'; $slash = 'm//'; }
  0         0  
7698 0         0 elsif ($string =~ /\G \b index \b /oxgc) { $e_string .= 'Ehp15::index'; $slash = 'm//'; }
  0         0  
7699 0         0 elsif ($string =~ /\G \b bytes::rindex \b /oxgc) { $e_string .= 'rindex'; $slash = 'm//'; }
  0         0  
7700 0         0 elsif ($string =~ /\G \b Char::rindex \b /oxgc) { $e_string .= 'Char::rindex'; $slash = 'm//'; }
  0         0  
7701 0         0 elsif ($string =~ /\G \b HP15::rindex \b /oxgc) { $e_string .= 'HP15::rindex'; $slash = 'm//'; }
  0         0  
7702 0         0 elsif ($string =~ /\G \b rindex \b /oxgc) { $e_string .= 'Ehp15::rindex'; $slash = 'm//'; }
  0         0  
7703 0         0 elsif ($string =~ /\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ehp15::lc'; $slash = 'm//'; }
  0         0  
7704 0         0 elsif ($string =~ /\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ehp15::lcfirst'; $slash = 'm//'; }
  0         0  
7705 0         0 elsif ($string =~ /\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ehp15::uc'; $slash = 'm//'; }
  0         0  
7706             elsif ($string =~ /\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ehp15::ucfirst'; $slash = 'm//'; }
7707 0         0 elsif ($string =~ /\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ehp15::fc'; $slash = 'm//'; }
  0         0  
7708 0         0 elsif ($string =~ /\G (-[rwxoRWXOezfdlpSbcugkTB] (?>(?:\s+ -[rwxoRWXOezfdlpSbcugkTB])+))
  0         0  
7709 0         0 (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $e_string .= "Ehp15::filetest(qw($1)," . e_qq('', $2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7710 0         0 elsif ($string =~ /\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) qq (?>\s*) (\#) ((?:$qq_char)+?) (\#) /oxgc) { $e_string .= "Ehp15::filetest(qw($1)," . e_qq('qq',$2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7711 0         0 elsif ($string =~ /\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) qq (?>\s*) (\() ((?:$qq_paren)+?) (\)) /oxgc) { $e_string .= "Ehp15::filetest(qw($1)," . e_qq('qq',$2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7712 0         0 elsif ($string =~ /\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) qq (?>\s*) (\{) ((?:$qq_brace)+?) (\}) /oxgc) { $e_string .= "Ehp15::filetest(qw($1)," . e_qq('qq',$2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7713 0         0 elsif ($string =~ /\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) qq (?>\s*) (\[) ((?:$qq_bracket)+?) (\]) /oxgc) { $e_string .= "Ehp15::filetest(qw($1)," . e_qq('qq',$2,$4,$3) . ")"; $slash = 'm//'; }
  1         8  
7714             elsif ($string =~ /\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $e_string .= "Ehp15::filetest(qw($1)," . e_qq('qq',$2,$4,$3) . ")"; $slash = 'm//'; }
7715             elsif ($string =~ /\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) qq (?>\s*) (\S) ((?:$qq_char)+?) (\2) /oxgc) { $e_string .= "Ehp15::filetest(qw($1)," . e_qq('qq',$2,$4,$3) . ")"; $slash = 'm//'; }
7716 1         5  
  1         7  
7717 1         4 elsif ($string =~ /\G (-[rwxoRWXOezfdlpSbcugkTB] (?>(?:\s+ -[rwxoRWXOezfdlpSbcugkTB])+))
  0         0  
7718 0         0 (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $e_string .= "Ehp15::filetest(qw($1)," . e_q ('', $2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7719 0         0 elsif ($string =~ /\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) q (?>\s*) (\#) ((?:\\\#|\\\\|$q_char)+?) (\#) /oxgc) { $e_string .= "Ehp15::filetest(qw($1)," . e_q ('q', $2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7720 0         0 elsif ($string =~ /\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) q (?>\s*) (\() ((?:\\\)|\\\\|$q_paren)+?) (\)) /oxgc) { $e_string .= "Ehp15::filetest(qw($1)," . e_q ('q', $2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7721 0         0 elsif ($string =~ /\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) q (?>\s*) (\{) ((?:\\\}|\\\\|$q_brace)+?) (\}) /oxgc) { $e_string .= "Ehp15::filetest(qw($1)," . e_q ('q', $2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7722 0         0 elsif ($string =~ /\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) q (?>\s*) (\[) ((?:\\\]|\\\\|$q_bracket)+?) (\]) /oxgc) { $e_string .= "Ehp15::filetest(qw($1)," . e_q ('q', $2,$4,$3) . ")"; $slash = 'm//'; }
  1         8  
7723             elsif ($string =~ /\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $e_string .= "Ehp15::filetest(qw($1)," . e_q ('q', $2,$4,$3) . ")"; $slash = 'm//'; }
7724             elsif ($string =~ /\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) q (?>\s*) (\S) ((?:\\\2|\\\\|$q_char)+?) (\2) /oxgc) { $e_string .= "Ehp15::filetest(qw($1)," . e_q ('q', $2,$4,$3) . ")"; $slash = 'm//'; }
7725 1         4  
  0         0  
7726 0         0 elsif ($string =~ /\G (-[rwxoRWXOezfdlpSbcugkTB] (?>(?:\s+ -[rwxoRWXOezfdlpSbcugkTB])+)) (\$ (?> \w+ (?: ::\w+)*) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ) )*) /oxgc)
  0         0  
7727 0         0 { $e_string .= "Ehp15::filetest(qw($1),$2)"; $slash = 'm//'; }
  0         0  
7728 0         0 elsif ($string =~ /\G (-[rwxoRWXOezfdlpSbcugkTB] (?>(?:\s+ -[rwxoRWXOezfdlpSbcugkTB])+)) \( ((?:$qq_paren)*?) \) /oxgc) { $e_string .= "Ehp15::filetest(qw($1),$2)"; $slash = 'm//'; }
  0         0  
7729             elsif ($string =~ /\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) (?= [a-z]+) /oxgc) { $e_string .= "Ehp15::filetest qw($1),"; $slash = 'm//'; }
7730 0         0 elsif ($string =~ /\G ((?:-[rwxoRWXOezfdlpSbcugkTB](?>\s+)){2,}) ((?>\w+)) /oxgc) { $e_string .= "Ehp15::filetest(qw($1),$2)"; $slash = 'm//'; }
  0         0  
7731 0         0  
  0         0  
7732 0         0 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $e_string .= "Ehp15::$1(" . e_qq('', $2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7733 0         0 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) qq (?>\s*) (\#) ((?:$qq_char)+?) (\#) /oxgc) { $e_string .= "Ehp15::$1(" . e_qq('qq',$2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7734 0         0 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) qq (?>\s*) (\() ((?:$qq_paren)+?) (\)) /oxgc) { $e_string .= "Ehp15::$1(" . e_qq('qq',$2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7735 0         0 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) qq (?>\s*) (\{) ((?:$qq_brace)+?) (\}) /oxgc) { $e_string .= "Ehp15::$1(" . e_qq('qq',$2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7736 0         0 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) qq (?>\s*) (\[) ((?:$qq_bracket)+?) (\]) /oxgc) { $e_string .= "Ehp15::$1(" . e_qq('qq',$2,$4,$3) . ")"; $slash = 'm//'; }
  2         12  
7737             elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $e_string .= "Ehp15::$1(" . e_qq('qq',$2,$4,$3) . ")"; $slash = 'm//'; }
7738 2         9 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) qq (?>\s*) (\S) ((?:$qq_char)+?) (\2) /oxgc) { $e_string .= "Ehp15::$1(" . e_qq('qq',$2,$4,$3) . ")"; $slash = 'm//'; }
  1         8  
7739 1         4  
  0         0  
7740 0         0 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $e_string .= "Ehp15::$1(" . e_q ('', $2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7741 0         0 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) q (?>\s*) (\#) ((?:\\\#|\\\\|$q_char)+?) (\#) /oxgc) { $e_string .= "Ehp15::$1(" . e_q ('q', $2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7742 0         0 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) q (?>\s*) (\() ((?:\\\)|\\\\|$q_paren)+?) (\)) /oxgc) { $e_string .= "Ehp15::$1(" . e_q ('q', $2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7743 0         0 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) q (?>\s*) (\{) ((?:\\\}|\\\\|$q_brace)+?) (\}) /oxgc) { $e_string .= "Ehp15::$1(" . e_q ('q', $2,$4,$3) . ")"; $slash = 'm//'; }
  0         0  
7744 0         0 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) q (?>\s*) (\[) ((?:\\\]|\\\\|$q_bracket)+?) (\]) /oxgc) { $e_string .= "Ehp15::$1(" . e_q ('q', $2,$4,$3) . ")"; $slash = 'm//'; }
  2         41  
7745             elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $e_string .= "Ehp15::$1(" . e_q ('q', $2,$4,$3) . ")"; $slash = 'm//'; }
7746             elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) q (?>\s*) (\S) ((?:\\\2|\\\\|$q_char)+?) (\2) /oxgc) { $e_string .= "Ehp15::$1(" . e_q ('q', $2,$4,$3) . ")"; $slash = 'm//'; }
7747 2         7  
  0         0  
7748 0         0 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s*) (\$ (?> \w+ (?: ::\w+)*) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ) )*) /oxgc)
  0         0  
7749 0         0 { $e_string .= "Ehp15::$1($2)"; $slash = 'm//'; }
  0         0  
7750 0         0 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $e_string .= "Ehp15::$1($2)"; $slash = 'm//'; }
  0         0  
7751 0         0 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?= (?>\s+) [a-z]+) /oxgc) { $e_string .= "Ehp15::$1"; $slash = 'm//'; }
  0         0  
7752 0         0 elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) (?>\s+) ((?>\w+)) /oxgc) { $e_string .= "Ehp15::$1(::"."$2)"; $slash = 'm//'; }
  0         0  
7753 0         0 elsif ($string =~ /\G -(t) (?>\s+) ((?>\w+)) /oxgc) { $e_string .= "-t $2"; $slash = 'm//'; }
  0         0  
7754             elsif ($string =~ /\G \b lstat (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ehp15::lstat'; $slash = 'm//'; }
7755             elsif ($string =~ /\G \b stat (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ehp15::stat'; $slash = 'm//'; }
7756 0         0  
  0         0  
7757 0         0 # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
  0         0  
7758 0         0 elsif ($string =~ /\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $e_string .= '-s ' . e_qq('', $1,$3,$2); $slash = 'm//'; }
  0         0  
7759 0         0 elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\#) ((?:$qq_char)+?) (\#) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
  0         0  
7760 0         0 elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\() ((?:$qq_paren)+?) (\)) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
  0         0  
7761 0         0 elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\{) ((?:$qq_brace)+?) (\}) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
  0         0  
7762 0         0 elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\[) ((?:$qq_bracket)+?) (\]) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
  0         0  
7763             elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
7764 0         0 elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\S) ((?:$qq_char)+?) (\1) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
  0         0  
7765 0         0  
  0         0  
7766 0         0 elsif ($string =~ /\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $e_string .= '-s ' . e_q ('', $1,$3,$2); $slash = 'm//'; }
  0         0  
7767 0         0 elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\#) ((?:\\\#|\\\\|$q_char)+?) (\#) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
  0         0  
7768 0         0 elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\() ((?:\\\)|\\\\|$q_paren)+?) (\)) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
  0         0  
7769 0         0 elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\{) ((?:\\\}|\\\\|$q_brace)+?) (\}) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
  0         0  
7770 0         0 elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\[) ((?:\\\]|\\\\|$q_bracket)+?) (\]) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
  0         0  
7771             elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
7772             elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
7773 0         0  
  0         0  
7774 0         0 elsif ($string =~ /\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)*) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ))*) /oxgc)
  0         0  
7775 0         0 { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
7776 0         0 elsif ($string =~ /\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $e_string .= "-s ($1)"; $slash = 'm//'; }
  0         0  
7777             elsif ($string =~ /\G -s (?= (?>\s+) [a-z]+) /oxgc) { $e_string .= '-s'; $slash = 'm//'; }
7778 0         0 elsif ($string =~ /\G -s (?>\s+) ((?>\w+)) /oxgc) { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
7779 0         0  
  0         0  
7780 0         0 elsif ($string =~ /\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
7781 0         0 elsif ($string =~ /\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
7782 0         0 elsif ($string =~ /\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ehp15::chr'; $slash = 'm//'; }
  0         0  
7783 0         0 elsif ($string =~ /\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
7784 0         0 elsif ($string =~ /\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= $function_ord; $slash = 'div'; }
  0         0  
7785 0         0 elsif ($string =~ /\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Ehp15::glob'; $slash = 'm//'; }
  0         0  
7786 0         0 elsif ($string =~ /\G \b lc \b /oxgc) { $e_string .= 'Ehp15::lc_'; $slash = 'm//'; }
  0         0  
7787 0         0 elsif ($string =~ /\G \b lcfirst \b /oxgc) { $e_string .= 'Ehp15::lcfirst_'; $slash = 'm//'; }
  0         0  
7788 0         0 elsif ($string =~ /\G \b uc \b /oxgc) { $e_string .= 'Ehp15::uc_'; $slash = 'm//'; }
  0         0  
7789 0         0 elsif ($string =~ /\G \b ucfirst \b /oxgc) { $e_string .= 'Ehp15::ucfirst_'; $slash = 'm//'; }
  0         0  
7790 0         0 elsif ($string =~ /\G \b fc \b /oxgc) { $e_string .= 'Ehp15::fc_'; $slash = 'm//'; }
  0         0  
7791             elsif ($string =~ /\G \b lstat \b /oxgc) { $e_string .= 'Ehp15::lstat_'; $slash = 'm//'; }
7792 0         0 elsif ($string =~ /\G \b stat \b /oxgc) { $e_string .= 'Ehp15::stat_'; $slash = 'm//'; }
  0         0  
7793 0         0 elsif ($string =~ /\G (-[rwxoRWXOezfdlpSbcugkTB] (?>(?:\s+ -[rwxoRWXOezfdlpSbcugkTB])+))
  0         0  
7794 0         0 \b /oxgc) { $e_string .= "Ehp15::filetest_(qw($1))"; $slash = 'm//'; }
  0         0  
7795             elsif ($string =~ /\G -([rwxoRWXOezsfdlpSbcugkTBMAC]) \b /oxgc) { $e_string .= "Ehp15::${1}_"; $slash = 'm//'; }
7796 0         0 elsif ($string =~ /\G -s \b /oxgc) { $e_string .= '-s '; $slash = 'm//'; }
  0         0  
7797 0         0  
  0         0  
7798 0         0 elsif ($string =~ /\G \b bytes::length \b /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
7799 0         0 elsif ($string =~ /\G \b bytes::chr \b /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
7800 0         0 elsif ($string =~ /\G \b chr \b /oxgc) { $e_string .= 'Ehp15::chr_'; $slash = 'm//'; }
  0         0  
7801 0         0 elsif ($string =~ /\G \b bytes::ord \b /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
7802 0         0 elsif ($string =~ /\G \b ord \b /oxgc) { $e_string .= $function_ord_; $slash = 'div'; }
  0         0  
7803 0         0 elsif ($string =~ /\G \b glob \b /oxgc) { $e_string .= 'Ehp15::glob_'; $slash = 'm//'; }
  0         0  
7804 0         0 elsif ($string =~ /\G \b reverse \b /oxgc) { $e_string .= $function_reverse; $slash = 'm//'; }
  0         0  
7805 0         0 elsif ($string =~ /\G \b getc \b /oxgc) { $e_string .= $function_getc; $slash = 'm//'; }
  0         0  
7806 0         0 elsif ($string =~ /\G \b opendir ((?>\s*) \( (?>\s*)) (?=[A-Za-z_]) /oxgc) { $e_string .= "Ehp15::opendir$1*"; $slash = 'm//'; }
  0         0  
7807             elsif ($string =~ /\G \b opendir ((?>\s+)) (?=[A-Za-z_]) /oxgc) { $e_string .= "Ehp15::opendir$1*"; $slash = 'm//'; }
7808             elsif ($string =~ /\G \b unlink \b /oxgc) { $e_string .= 'Ehp15::unlink'; $slash = 'm//'; }
7809              
7810 0         0 # chdir
7811             elsif ($string =~ /\G \b (chdir) \b (?! (?>\s*) => ) /oxgc) {
7812 0         0 $slash = 'm//';
7813              
7814 0         0 $e_string .= 'Ehp15::chdir';
7815 0         0  
7816             while ($string =~ /\G ( (?>\s+) | \( | \#.* ) /oxgc) {
7817             $e_string .= $1;
7818             }
7819 0 0       0  
  0 0       0  
    0          
    0          
    0          
    0          
7820             # end of chdir
7821             if ($string =~ /\G (?= [,;\)\}\]] ) /oxgc) { return $e_string; }
7822 0         0  
  0         0  
7823             # chdir scalar value
7824             elsif ($string =~ /\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { $e_string .= e_string($1); next E_STRING_LOOP; }
7825              
7826 0 0       0 # chdir qq//
  0         0  
  0         0  
7827             elsif ($string =~ /\G \b (qq) \b /oxgc) {
7828 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { $e_string .= e_chdir('qq',$1,$3,$2); next E_STRING_LOOP; } # qq# # --> qr # #
7829 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
7830 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
7831 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $1; }
  0         0  
7832 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= e_chdir('qq',$1,$3,$2); next E_STRING_LOOP; } # qq ( ) --> qr ( )
  0         0  
7833 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= e_chdir('qq',$1,$3,$2); next E_STRING_LOOP; } # qq { } --> qr { }
  0         0  
7834 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= e_chdir('qq',$1,$3,$2); next E_STRING_LOOP; } # qq [ ] --> qr [ ]
  0         0  
7835 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= e_chdir('qq',$1,$3,$2); next E_STRING_LOOP; } # qq < > --> qr < >
  0         0  
7836             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= e_chdir('qq','{','}',$2); next E_STRING_LOOP; } # qq | | --> qr { }
7837 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= e_chdir('qq',$1,$3,$2); next E_STRING_LOOP; } # qq * * --> qr * *
7838             }
7839             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
7840             }
7841             }
7842              
7843 0 0       0 # chdir q//
  0         0  
  0         0  
7844             elsif ($string =~ /\G \b (q) \b /oxgc) {
7845 0         0 if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { $e_string .= e_chdir_q('q',$1,$3,$2); next E_STRING_LOOP; } # q# # --> qr # #
7846 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
7847 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
7848 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $1; }
  0         0  
7849 0         0 elsif ($string =~ /\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { $e_string .= e_chdir_q('q',$1,$3,$2); next E_STRING_LOOP; } # q ( ) --> qr ( )
  0         0  
7850 0         0 elsif ($string =~ /\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { $e_string .= e_chdir_q('q',$1,$3,$2); next E_STRING_LOOP; } # q { } --> qr { }
  0         0  
7851 0         0 elsif ($string =~ /\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { $e_string .= e_chdir_q('q',$1,$3,$2); next E_STRING_LOOP; } # q [ ] --> qr [ ]
  0         0  
7852 0         0 elsif ($string =~ /\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { $e_string .= e_chdir_q('q',$1,$3,$2); next E_STRING_LOOP; } # q < > --> qr < >
  0         0  
7853             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { $e_string .= e_chdir_q('q','{','}',$2); next E_STRING_LOOP; } # q | | --> qr { }
7854 0         0 elsif ($string =~ /\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { $e_string .= e_chdir_q('q',$1,$3,$2); next E_STRING_LOOP; } # q * * --> qr * *
7855             }
7856             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
7857             }
7858             }
7859              
7860 0         0 # chdir ''
7861 0         0 elsif ($string =~ /\G (\') /oxgc) {
7862 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
7863 0         0 while ($string !~ /\G \z/oxgc) {
7864 0         0 if ($string =~ /\G (\\\\) /oxgc) { $q_string .= $1; }
  0         0  
7865 0         0 elsif ($string =~ /\G (\\\') /oxgc) { $q_string .= $1; }
7866             elsif ($string =~ /\G \' /oxgc) { $e_string .= e_chdir_q('',"'","'",$q_string); next E_STRING_LOOP; }
7867 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $q_string .= $1; }
7868             }
7869             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
7870             }
7871              
7872 0         0 # chdir ""
7873 0         0 elsif ($string =~ /\G (\") /oxgc) {
7874 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
7875 0         0 while ($string !~ /\G \z/oxgc) {
7876 0         0 if ($string =~ /\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
7877 0         0 elsif ($string =~ /\G (\\\") /oxgc) { $qq_string .= $1; }
7878             elsif ($string =~ /\G \" /oxgc) { $e_string .= e_chdir('','"','"',$qq_string); next E_STRING_LOOP; }
7879 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $qq_string .= $1; }
7880             }
7881             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
7882             }
7883             }
7884              
7885 0         0 # split
7886             elsif ($string =~ /\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
7887 0         0 $slash = 'm//';
7888 0         0  
7889 0         0 my $e = '';
7890             while ($string =~ /\G ( (?>\s+) | \( | \#.* ) /oxgc) {
7891             $e .= $1;
7892             }
7893 0 0       0  
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
7894             # end of split
7895             if ($string =~ /\G (?= [,;\)\}\]] ) /oxgc) { return 'Ehp15::split' . $e; }
7896 0         0  
  0         0  
7897             # split scalar value
7898             elsif ($string =~ /\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { $e_string .= 'Ehp15::split' . $e . e_string($1); next E_STRING_LOOP; }
7899 0         0  
  0         0  
7900 0         0 # split literal space
  0         0  
7901 0         0 elsif ($string =~ /\G \b qq (\#) [ ] (\#) /oxgc) { $e_string .= 'Ehp15::split' . $e . qq {qq$1 $2}; next E_STRING_LOOP; }
  0         0  
7902 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Ehp15::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
7903 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Ehp15::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
7904 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Ehp15::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
7905 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Ehp15::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
7906 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { $e_string .= 'Ehp15::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
7907 0         0 elsif ($string =~ /\G \b q (\#) [ ] (\#) /oxgc) { $e_string .= 'Ehp15::split' . $e . qq {q$1 $2}; next E_STRING_LOOP; }
  0         0  
7908 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Ehp15::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
7909 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Ehp15::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
7910 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Ehp15::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
7911 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Ehp15::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
7912 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { $e_string .= 'Ehp15::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
7913             elsif ($string =~ /\G ' [ ] ' /oxgc) { $e_string .= 'Ehp15::split' . $e . qq {' '}; next E_STRING_LOOP; }
7914             elsif ($string =~ /\G " [ ] " /oxgc) { $e_string .= 'Ehp15::split' . $e . qq {" "}; next E_STRING_LOOP; }
7915              
7916 0 0       0 # split qq//
  0         0  
  0         0  
7917             elsif ($string =~ /\G \b (qq) \b /oxgc) {
7918 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq# # --> qr # #
7919 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
7920 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
7921 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
7922 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq ( ) --> qr ( )
  0         0  
7923 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq { } --> qr { }
  0         0  
7924 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq [ ] --> qr [ ]
  0         0  
7925 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq < > --> qr < >
  0         0  
7926             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= e_split($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # qq | | --> qr { }
7927 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq * * --> qr * *
7928             }
7929             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
7930             }
7931             }
7932              
7933 0 0       0 # split qr//
  0         0  
  0         0  
7934             elsif ($string =~ /\G \b (qr) \b /oxgc) {
7935 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1,$3,$2,$4); next E_STRING_LOOP; } # qr# #
7936 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
7937 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
7938 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
7939 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # qr ( )
  0         0  
7940 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # qr { }
  0         0  
7941 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # qr [ ]
  0         0  
7942 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # qr < >
  0         0  
7943 0         0 elsif ($string =~ /\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split_q($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # qr ' '
  0         0  
7944             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # qr | | --> qr { }
7945 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # qr * *
7946             }
7947             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
7948             }
7949             }
7950              
7951 0 0       0 # split q//
  0         0  
  0         0  
7952             elsif ($string =~ /\G \b (q) \b /oxgc) {
7953 0         0 if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q# # --> qr # #
7954 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
7955 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
7956 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
7957 0         0 elsif ($string =~ /\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q ( ) --> qr ( )
  0         0  
7958 0         0 elsif ($string =~ /\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q { } --> qr { }
  0         0  
7959 0         0 elsif ($string =~ /\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q [ ] --> qr [ ]
  0         0  
7960 0         0 elsif ($string =~ /\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q < > --> qr < >
  0         0  
7961             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { $e_string .= e_split_q($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # q | | --> qr { }
7962 0         0 elsif ($string =~ /\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q * * --> qr * *
7963             }
7964             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
7965             }
7966             }
7967              
7968 0 0       0 # split m//
  0         0  
  0         0  
7969             elsif ($string =~ /\G \b (m) \b /oxgc) {
7970 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1,$3,$2,$4); next E_STRING_LOOP; } # m# # --> qr # #
7971 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
7972 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
7973 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
7974 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # m ( ) --> qr ( )
  0         0  
7975 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # m { } --> qr { }
  0         0  
7976 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # m [ ] --> qr [ ]
  0         0  
7977 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # m < > --> qr < >
  0         0  
7978 0         0 elsif ($string =~ /\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split_q($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # m ' ' --> qr ' '
  0         0  
7979             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # m | | --> qr { }
7980 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1, $3, $2,$4); next E_STRING_LOOP; } # m * * --> qr * *
7981             }
7982             die __FILE__, ": Search pattern not terminated\n";
7983             }
7984             }
7985              
7986 0         0 # split ''
7987 0         0 elsif ($string =~ /\G (\') /oxgc) {
7988 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
7989 0         0 while ($string !~ /\G \z/oxgc) {
7990 0         0 if ($string =~ /\G (\\\\) /oxgc) { $q_string .= $1; }
  0         0  
7991 0         0 elsif ($string =~ /\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
7992             elsif ($string =~ /\G \' /oxgc) { $e_string .= e_split_q($e.q{ qr},"'","'",$q_string,''); next E_STRING_LOOP; } # ' ' --> qr ' '
7993 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $q_string .= $1; }
7994             }
7995             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
7996             }
7997              
7998 0         0 # split ""
7999 0         0 elsif ($string =~ /\G (\") /oxgc) {
8000 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
8001 0         0 while ($string !~ /\G \z/oxgc) {
8002 0         0 if ($string =~ /\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
8003 0         0 elsif ($string =~ /\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
8004             elsif ($string =~ /\G \" /oxgc) { $e_string .= e_split($e.q{ qr},'"','"',$qq_string,''); next E_STRING_LOOP; } # " " --> qr " "
8005 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $qq_string .= $1; }
8006             }
8007             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
8008             }
8009              
8010 0         0 # split //
8011 0         0 elsif ($string =~ /\G (\/) /oxgc) {
8012 0 0       0 my $regexp = '';
  0 0       0  
    0          
    0          
8013 0         0 while ($string !~ /\G \z/oxgc) {
8014 0         0 if ($string =~ /\G (\\\\) /oxgc) { $regexp .= $1; }
  0         0  
8015 0         0 elsif ($string =~ /\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
8016             elsif ($string =~ /\G \/ ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split($e.q{ qr}, '/','/',$regexp,$1); next E_STRING_LOOP; } # / / --> qr / /
8017 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $regexp .= $1; }
8018             }
8019             die __FILE__, ": Search pattern not terminated\n";
8020             }
8021             }
8022              
8023 0         0 # qq//
8024 0 0       0 elsif ($string =~ /\G \b (qq) \b /oxgc) {
8025 0         0 my $ope = $1;
8026             if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qq# #
8027             $e_string .= e_qq($ope,$1,$3,$2);
8028 0         0 }
8029 0         0 else {
8030 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
8031 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
8032 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
8033 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq ( )
  0         0  
8034 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq { }
  0         0  
8035 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq [ ]
  0         0  
8036             elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq < >
8037 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq * *
8038             }
8039             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
8040             }
8041             }
8042              
8043 0         0 # qx//
8044 0 0       0 elsif ($string =~ /\G \b (qx) \b /oxgc) {
8045 0         0 my $ope = $1;
8046             if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
8047             $e_string .= e_qq($ope,$1,$3,$2);
8048 0         0 }
8049 0         0 else {
8050 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
    0          
8051 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
8052 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
8053 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ( )
  0         0  
8054 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx { }
  0         0  
8055 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx [ ]
  0         0  
8056 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx < >
  0         0  
8057             elsif ($string =~ /\G (\') ((?:$qq_char)*?) (\') /oxgc) { $e_string .= $e . e_q ($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ' '
8058 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx * *
8059             }
8060             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
8061             }
8062             }
8063              
8064 0         0 # q//
8065 0 0       0 elsif ($string =~ /\G \b (q) \b /oxgc) {
8066 0         0 my $ope = $1;
8067             if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { # q# #
8068             $e_string .= e_q($ope,$1,$3,$2);
8069 0         0 }
8070 0         0 else {
8071 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
8072 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
8073 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
8074 0         0 elsif ($string =~ /\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q ( )
  0         0  
8075 0         0 elsif ($string =~ /\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q { }
  0         0  
8076 0         0 elsif ($string =~ /\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q [ ]
  0         0  
8077             elsif ($string =~ /\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q < >
8078 0         0 elsif ($string =~ /\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q * *
8079             }
8080             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
8081             }
8082             }
8083 0         0  
8084             # ''
8085             elsif ($string =~ /\G (?
8086 44         193  
8087             # ""
8088             elsif ($string =~ /\G (\") ((?:$qq_char)*?) (\") /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
8089 6         59  
8090             # ``
8091             elsif ($string =~ /\G (\`) ((?:$qq_char)*?) (\`) /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
8092 0         0  
8093             # <<>> (a safer ARGV)
8094             elsif ($string =~ /\G ( <<>> ) /oxgc) { $e_string .= $1; }
8095 0         0  
8096             # <<= <=> <= < operator
8097             elsif ($string =~ /\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) { $e_string .= $1; }
8098 0         0  
8099             #
8100             elsif ($string =~ /\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) { $e_string .= $1; }
8101              
8102 0         0 # --- glob
8103             elsif ($string =~ /\G < ((?:$q_char)+?) > /oxgc) {
8104             $e_string .= 'Ehp15::glob("' . $1 . '")';
8105             }
8106              
8107 0         0 # << (bit shift) --- not here document
8108 0         0 elsif ($string =~ /\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) {
8109             $slash = 'm//';
8110             $e_string .= $1;
8111             }
8112              
8113 0         0 # <<~'HEREDOC'
8114 0         0 elsif ($string =~ /\G ( <<~ [\t ]* '([a-zA-Z_0-9]*)' ) /oxgc) {
8115 0         0 $slash = 'm//';
8116             my $here_quote = $1;
8117             my $delimiter = $2;
8118 0 0       0  
8119 0         0 # get here document
8120 0         0 if ($here_script eq '') {
8121             $here_script = CORE::substr $_, pos $_;
8122 0 0       0 $here_script =~ s/.*?\n//oxm;
8123 0         0 }
8124 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
8125 0         0 my $heredoc = $1;
8126 0         0 my $indent = $2;
8127 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
8128             push @heredoc, $heredoc . qq{\n$delimiter\n};
8129             push @heredoc_delimiter, qq{\\s*$delimiter};
8130 0         0 }
8131             else {
8132 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
8133             }
8134             $e_string .= qq{<<'$delimiter'};
8135             }
8136              
8137 0         0 # <<~\HEREDOC
8138 0         0 elsif ($string =~ /\G ( <<~ \\([a-zA-Z_0-9]+) ) /oxgc) {
8139 0         0 $slash = 'm//';
8140             my $here_quote = $1;
8141             my $delimiter = $2;
8142 0 0       0  
8143 0         0 # get here document
8144 0         0 if ($here_script eq '') {
8145             $here_script = CORE::substr $_, pos $_;
8146 0 0       0 $here_script =~ s/.*?\n//oxm;
8147 0         0 }
8148 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
8149 0         0 my $heredoc = $1;
8150 0         0 my $indent = $2;
8151 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
8152             push @heredoc, $heredoc . qq{\n$delimiter\n};
8153             push @heredoc_delimiter, qq{\\s*$delimiter};
8154 0         0 }
8155             else {
8156 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
8157             }
8158             $e_string .= qq{<<\\$delimiter};
8159             }
8160              
8161 0         0 # <<~"HEREDOC"
8162 0         0 elsif ($string =~ /\G ( <<~ [\t ]* "([a-zA-Z_0-9]*)" ) /oxgc) {
8163 0         0 $slash = 'm//';
8164             my $here_quote = $1;
8165             my $delimiter = $2;
8166 0 0       0  
8167 0         0 # get here document
8168 0         0 if ($here_script eq '') {
8169             $here_script = CORE::substr $_, pos $_;
8170 0 0       0 $here_script =~ s/.*?\n//oxm;
8171 0         0 }
8172 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
8173 0         0 my $heredoc = $1;
8174 0         0 my $indent = $2;
8175 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
8176             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
8177             push @heredoc_delimiter, qq{\\s*$delimiter};
8178 0         0 }
8179             else {
8180 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
8181             }
8182             $e_string .= qq{<<"$delimiter"};
8183             }
8184              
8185 0         0 # <<~HEREDOC
8186 0         0 elsif ($string =~ /\G ( <<~ ([a-zA-Z_0-9]+) ) /oxgc) {
8187 0         0 $slash = 'm//';
8188             my $here_quote = $1;
8189             my $delimiter = $2;
8190 0 0       0  
8191 0         0 # get here document
8192 0         0 if ($here_script eq '') {
8193             $here_script = CORE::substr $_, pos $_;
8194 0 0       0 $here_script =~ s/.*?\n//oxm;
8195 0         0 }
8196 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
8197 0         0 my $heredoc = $1;
8198 0         0 my $indent = $2;
8199 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
8200             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
8201             push @heredoc_delimiter, qq{\\s*$delimiter};
8202 0         0 }
8203             else {
8204 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
8205             }
8206             $e_string .= qq{<<$delimiter};
8207             }
8208              
8209 0         0 # <<~`HEREDOC`
8210 0         0 elsif ($string =~ /\G ( <<~ [\t ]* `([a-zA-Z_0-9]*)` ) /oxgc) {
8211 0         0 $slash = 'm//';
8212             my $here_quote = $1;
8213             my $delimiter = $2;
8214 0 0       0  
8215 0         0 # get here document
8216 0         0 if ($here_script eq '') {
8217             $here_script = CORE::substr $_, pos $_;
8218 0 0       0 $here_script =~ s/.*?\n//oxm;
8219 0         0 }
8220 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
8221 0         0 my $heredoc = $1;
8222 0         0 my $indent = $2;
8223 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
8224             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
8225             push @heredoc_delimiter, qq{\\s*$delimiter};
8226 0         0 }
8227             else {
8228 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
8229             }
8230             $e_string .= qq{<<`$delimiter`};
8231             }
8232              
8233 0         0 # <<'HEREDOC'
8234 0         0 elsif ($string =~ /\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
8235 0         0 $slash = 'm//';
8236             my $here_quote = $1;
8237             my $delimiter = $2;
8238 0 0       0  
8239 0         0 # get here document
8240 0         0 if ($here_script eq '') {
8241             $here_script = CORE::substr $_, pos $_;
8242 0 0       0 $here_script =~ s/.*?\n//oxm;
8243 0         0 }
8244 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
8245             push @heredoc, $1 . qq{\n$delimiter\n};
8246             push @heredoc_delimiter, $delimiter;
8247 0         0 }
8248             else {
8249 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
8250             }
8251             $e_string .= $here_quote;
8252             }
8253              
8254 0         0 # <<\HEREDOC
8255 0         0 elsif ($string =~ /\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
8256 0         0 $slash = 'm//';
8257             my $here_quote = $1;
8258             my $delimiter = $2;
8259 0 0       0  
8260 0         0 # get here document
8261 0         0 if ($here_script eq '') {
8262             $here_script = CORE::substr $_, pos $_;
8263 0 0       0 $here_script =~ s/.*?\n//oxm;
8264 0         0 }
8265 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
8266             push @heredoc, $1 . qq{\n$delimiter\n};
8267             push @heredoc_delimiter, $delimiter;
8268 0         0 }
8269             else {
8270 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
8271             }
8272             $e_string .= $here_quote;
8273             }
8274              
8275 0         0 # <<"HEREDOC"
8276 0         0 elsif ($string =~ /\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
8277 0         0 $slash = 'm//';
8278             my $here_quote = $1;
8279             my $delimiter = $2;
8280 0 0       0  
8281 0         0 # get here document
8282 0         0 if ($here_script eq '') {
8283             $here_script = CORE::substr $_, pos $_;
8284 0 0       0 $here_script =~ s/.*?\n//oxm;
8285 0         0 }
8286 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
8287             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
8288             push @heredoc_delimiter, $delimiter;
8289 0         0 }
8290             else {
8291 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
8292             }
8293             $e_string .= $here_quote;
8294             }
8295              
8296 0         0 # <
8297 0         0 elsif ($string =~ /\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
8298 0         0 $slash = 'm//';
8299             my $here_quote = $1;
8300             my $delimiter = $2;
8301 0 0       0  
8302 0         0 # get here document
8303 0         0 if ($here_script eq '') {
8304             $here_script = CORE::substr $_, pos $_;
8305 0 0       0 $here_script =~ s/.*?\n//oxm;
8306 0         0 }
8307 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
8308             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
8309             push @heredoc_delimiter, $delimiter;
8310 0         0 }
8311             else {
8312 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
8313             }
8314             $e_string .= $here_quote;
8315             }
8316              
8317 0         0 # <<`HEREDOC`
8318 0         0 elsif ($string =~ /\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
8319 0         0 $slash = 'm//';
8320             my $here_quote = $1;
8321             my $delimiter = $2;
8322 0 0       0  
8323 0         0 # get here document
8324 0         0 if ($here_script eq '') {
8325             $here_script = CORE::substr $_, pos $_;
8326 0 0       0 $here_script =~ s/.*?\n//oxm;
8327 0         0 }
8328 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
8329             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
8330             push @heredoc_delimiter, $delimiter;
8331 0         0 }
8332             else {
8333 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
8334             }
8335             $e_string .= $here_quote;
8336             }
8337              
8338             # any operator before div
8339             elsif ($string =~ /\G (
8340             -- | \+\+ |
8341 0         0 [\)\}\]]
  80         182  
8342              
8343             ) /oxgc) { $slash = 'div'; $e_string .= $1; }
8344              
8345             # yada-yada or triple-dot operator
8346             elsif ($string =~ /\G (
8347 80         346 \.\.\.
  0         0  
8348              
8349             ) /oxgc) { $slash = 'm//'; $e_string .= q{die('Unimplemented')}; }
8350              
8351             # any operator before m//
8352             elsif ($string =~ /\G ((?>
8353              
8354             !~~ | !~ | != | ! |
8355             %= | % |
8356             &&= | && | &= | &\.= | &\. | & |
8357             -= | -> | - |
8358             :(?>\s*)= |
8359             : |
8360             <<>> |
8361             <<= | <=> | <= | < |
8362             == | => | =~ | = |
8363             >>= | >> | >= | > |
8364             \*\*= | \*\* | \*= | \* |
8365             \+= | \+ |
8366             \.\. | \.= | \. |
8367             \/\/= | \/\/ |
8368             \/= | \/ |
8369             \? |
8370             \\ |
8371             \^= | \^\.= | \^\. | \^ |
8372             \b x= |
8373             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
8374             ~~ | ~\. | ~ |
8375             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
8376             \b(?: print )\b |
8377              
8378 0         0 [,;\(\{\[]
  112         262  
8379              
8380             )) /oxgc) { $slash = 'm//'; $e_string .= $1; }
8381 112         949  
8382             # other any character
8383             elsif ($string =~ /\G ($q_char) /oxgc) { $e_string .= $1; }
8384              
8385 353         1477 # system error
8386             else {
8387             die __FILE__, ": Oops, this shouldn't happen!\n";
8388             }
8389 0         0 }
8390              
8391             return $e_string;
8392             }
8393              
8394             #
8395             # character class
8396 79     5342 0 380 #
8397             sub character_class {
8398 5342 100       10746 my($char,$modifier) = @_;
8399 5342 100       8593  
8400 115         239 if ($char eq '.') {
8401             if ($modifier =~ /s/) {
8402             return '${Ehp15::dot_s}';
8403 23         61 }
8404             else {
8405             return '${Ehp15::dot}';
8406             }
8407 92         210 }
8408             else {
8409             return Ehp15::classic_character_class($char);
8410             }
8411             }
8412              
8413             #
8414             # escape capture ($1, $2, $3, ...)
8415             #
8416 5227     637 0 9052 sub e_capture {
8417 637         2826  
8418             return join '', '${Ehp15::capture(', $_[0], ')}';
8419             return join '', '${', $_[0], '}';
8420             }
8421              
8422             #
8423             # escape transliteration (tr/// or y///)
8424 0     11 0 0 #
8425 11         71 sub e_tr {
8426 11   100     21 my($variable,$charclass,$e,$charclass2,$modifier) = @_;
8427             my $e_tr = '';
8428 11         28 $modifier ||= '';
8429              
8430             $slash = 'div';
8431 11         16  
8432             # quote character class 1
8433             $charclass = q_tr($charclass);
8434 11         22  
8435             # quote character class 2
8436             $charclass2 = q_tr($charclass2);
8437 11 50       29  
8438 11 0       29 # /b /B modifier
8439 0         0 if ($modifier =~ tr/bB//d) {
8440             if ($variable eq '') {
8441             $e_tr = qq{tr$charclass$e$charclass2$modifier};
8442 0         0 }
8443             else {
8444             $e_tr = qq{$variable${bind_operator}tr$charclass$e$charclass2$modifier};
8445             }
8446 0 100       0 }
8447 11         19 else {
8448             if ($variable eq '') {
8449             $e_tr = qq{Ehp15::tr(\$_,' =~ ',$charclass,$e$charclass2,'$modifier')};
8450 2         6 }
8451             else {
8452             $e_tr = qq{Ehp15::tr($variable,'$bind_operator',$charclass,$e$charclass2,'$modifier')};
8453             }
8454             }
8455 9         27  
8456 11         14 # clear tr/// variable
8457             $tr_variable = '';
8458 11         13 $bind_operator = '';
8459              
8460             return $e_tr;
8461             }
8462              
8463             #
8464             # quote for escape transliteration (tr/// or y///)
8465 11     22 0 61 #
8466             sub q_tr {
8467             my($charclass) = @_;
8468 22 50       39  
    0          
    0          
    0          
    0          
    0          
8469 22         45 # quote character class
8470             if ($charclass !~ /'/oxms) {
8471             return e_q('', "'", "'", $charclass); # --> q' '
8472 22         34 }
8473             elsif ($charclass !~ /\//oxms) {
8474             return e_q('q', '/', '/', $charclass); # --> q/ /
8475 0         0 }
8476             elsif ($charclass !~ /\#/oxms) {
8477             return e_q('q', '#', '#', $charclass); # --> q# #
8478 0         0 }
8479             elsif ($charclass !~ /[\<\>]/oxms) {
8480             return e_q('q', '<', '>', $charclass); # --> q< >
8481 0         0 }
8482             elsif ($charclass !~ /[\(\)]/oxms) {
8483             return e_q('q', '(', ')', $charclass); # --> q( )
8484 0         0 }
8485             elsif ($charclass !~ /[\{\}]/oxms) {
8486             return e_q('q', '{', '}', $charclass); # --> q{ }
8487 0         0 }
8488 0 0       0 else {
8489 0         0 for my $char (qw( ! " $ % & * + . : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
8490             if ($charclass !~ /\Q$char\E/xms) {
8491             return e_q('q', $char, $char, $charclass);
8492             }
8493             }
8494 0         0 }
8495              
8496             return e_q('q', '{', '}', $charclass);
8497             }
8498              
8499             #
8500             # escape q string (q//, '')
8501 0     3967 0 0 #
8502             sub e_q {
8503 3967         10588 my($ope,$delimiter,$end_delimiter,$string) = @_;
8504              
8505 3967         5658 $slash = 'div';
8506 3967         25831  
8507             my @char = $string =~ / \G (?>$q_char) /oxmsg;
8508             for (my $i=0; $i <= $#char; $i++) {
8509 3967 100 100     10888  
    100 100        
8510 21219         144960 # escape last octet of multiple-octet
8511             if ($char[$i] =~ /\A ([\x80-\xFF].*) (\Q$delimiter\E|\Q$end_delimiter\E) \z/xms) {
8512             $char[$i] = $1 . '\\' . $2;
8513 1         6 }
8514             elsif (defined($char[$i+1]) and ($char[$i+1] eq '\\') and ($char[$i] =~ /\A ([\x80-\xFF].*) (\\) \z/xms)) {
8515             $char[$i] = $1 . '\\' . $2;
8516 22 100 100     93 }
8517 3967         15282 }
8518             if (defined($char[-1]) and ($char[-1] =~ /\A ([\x80-\xFF].*) (\\) \z/xms)) {
8519             $char[-1] = $1 . '\\' . $2;
8520 204         1818 }
8521 3967         22351  
8522             return join '', $ope, $delimiter, @char, $end_delimiter;
8523             return join '', $ope, $delimiter, $string, $end_delimiter;
8524             }
8525              
8526             #
8527             # escape qq string (qq//, "", qx//, ``)
8528 0     9552 0 0 #
8529             sub e_qq {
8530 9552         23411 my($ope,$delimiter,$end_delimiter,$string) = @_;
8531              
8532 9552         23507 $slash = 'div';
8533 9552         13308  
8534             my $left_e = 0;
8535             my $right_e = 0;
8536 9552         11106  
8537             # split regexp
8538             my @char = $string =~ /\G((?>
8539             [^\x80-\xA0\xE0-\xFE\\\$]|[\x80-\xA0\xE0-\xFE][\x00-\xFF] |
8540             \\x\{ (?>[0-9A-Fa-f]+) \} |
8541             \\o\{ (?>[0-7]+) \} |
8542             \\N\{ (?>[^\x80-\xA0\xE0-\xFE0-9\}][^\x80-\xA0\xE0-\xFE\}]*) \} |
8543             \\ $q_char |
8544             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
8545             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
8546             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
8547             \$ (?>\s* [0-9]+) |
8548             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
8549             \$ \$ (?![\w\{]) |
8550             \$ (?>\s*) \$ (?>\s*) $qq_variable |
8551             $q_char
8552 9552         373523 ))/oxmsg;
8553              
8554             for (my $i=0; $i <= $#char; $i++) {
8555 9552 50 66     35844  
    50 33        
    100          
    100          
    50          
8556 307986         1007805 # "\L\u" --> "\u\L"
8557             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
8558             @char[$i,$i+1] = @char[$i+1,$i];
8559             }
8560              
8561 0         0 # "\U\l" --> "\l\U"
8562             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
8563             @char[$i,$i+1] = @char[$i+1,$i];
8564             }
8565              
8566 0         0 # octal escape sequence
8567             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
8568             $char[$i] = Ehp15::octchr($1);
8569             }
8570              
8571 1         5 # hexadecimal escape sequence
8572             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
8573             $char[$i] = Ehp15::hexchr($1);
8574             }
8575              
8576 1         5 # \N{CHARNAME} --> N{CHARNAME}
8577             elsif ($char[$i] =~ /\A \\ ( N\{ ([^\x80-\xA0\xE0-\xFE0-9\}][^\x80-\xA0\xE0-\xFE\}]*) \} ) \z/oxms) {
8578             $char[$i] = $1;
8579 0 100       0 }
    100          
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
8580              
8581             if (0) {
8582             }
8583              
8584             # escape last octet of multiple-octet
8585 307986         2966321 # my $metachar = qr/[\@\\\|]/oxms; # '|' is for qx//, ``, open(), and system()
8586 0         0 # variable $delimiter and $end_delimiter can be ''
8587             elsif ($char[$i] =~ /\A ([\x80-\xFF].*) ([\@\\\|$delimiter$end_delimiter]) \z/xms) {
8588             $char[$i] = $1 . '\\' . $2;
8589             }
8590              
8591             # \F
8592             #
8593             # P.69 Table 2-6. Translation escapes
8594             # in Chapter 2: Bits and Pieces
8595             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
8596             # (and so on)
8597              
8598 1342 50       5563 # \u \l \U \L \F \Q \E
8599 647         1594 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
8600             if ($right_e < $left_e) {
8601             $char[$i] = '\\' . $char[$i];
8602             }
8603             }
8604             elsif ($char[$i] eq '\u') {
8605              
8606             # "STRING @{[ LIST EXPR ]} MORE STRING"
8607              
8608             # P.257 Other Tricks You Can Do with Hard References
8609             # in Chapter 8: References
8610             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
8611              
8612             # P.353 Other Tricks You Can Do with Hard References
8613             # in Chapter 8: References
8614             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
8615              
8616 0         0 # (and so on)
8617 0         0  
8618             $char[$i] = '@{[Ehp15::ucfirst qq<';
8619             $left_e++;
8620 0         0 }
8621 0         0 elsif ($char[$i] eq '\l') {
8622             $char[$i] = '@{[Ehp15::lcfirst qq<';
8623             $left_e++;
8624 0         0 }
8625 0         0 elsif ($char[$i] eq '\U') {
8626             $char[$i] = '@{[Ehp15::uc qq<';
8627             $left_e++;
8628 0         0 }
8629 6         8 elsif ($char[$i] eq '\L') {
8630             $char[$i] = '@{[Ehp15::lc qq<';
8631             $left_e++;
8632 6         13 }
8633 9         19 elsif ($char[$i] eq '\F') {
8634             $char[$i] = '@{[Ehp15::fc qq<';
8635             $left_e++;
8636 9         22 }
8637 0         0 elsif ($char[$i] eq '\Q') {
8638             $char[$i] = '@{[CORE::quotemeta qq<';
8639             $left_e++;
8640 0 50       0 }
8641 12         24 elsif ($char[$i] eq '\E') {
8642 12         15 if ($right_e < $left_e) {
8643             $char[$i] = '>]}';
8644             $right_e++;
8645 12         25 }
8646             else {
8647             $char[$i] = '';
8648             }
8649 0         0 }
8650 0 0       0 elsif ($char[$i] eq '\Q') {
8651 0         0 while (1) {
8652             if (++$i > $#char) {
8653 0 0       0 last;
8654 0         0 }
8655             if ($char[$i] eq '\E') {
8656             last;
8657             }
8658             }
8659             }
8660             elsif ($char[$i] eq '\E') {
8661             }
8662              
8663             # $0 --> $0
8664             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
8665             }
8666             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
8667             }
8668              
8669             # $$ --> $$
8670             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
8671             }
8672              
8673             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
8674 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
8675             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
8676             $char[$i] = e_capture($1);
8677 415         1186 }
8678             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
8679             $char[$i] = e_capture($1);
8680             }
8681              
8682 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
8683             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
8684             $char[$i] = e_capture($1.'->'.$2);
8685             }
8686              
8687 0         0 # $$foo{ ... } --> $ $foo->{ ... }
8688             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
8689             $char[$i] = e_capture($1.'->'.$2);
8690             }
8691              
8692 0         0 # $$foo
8693             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
8694             $char[$i] = e_capture($1);
8695             }
8696              
8697 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ehp15::PREMATCH()
8698             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
8699             $char[$i] = '@{[Ehp15::PREMATCH()]}';
8700             }
8701              
8702 44         135 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ehp15::MATCH()
8703             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
8704             $char[$i] = '@{[Ehp15::MATCH()]}';
8705             }
8706              
8707 45         138 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ehp15::POSTMATCH()
8708             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
8709             $char[$i] = '@{[Ehp15::POSTMATCH()]}';
8710             }
8711              
8712             # ${ foo } --> ${ foo }
8713             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
8714             }
8715              
8716 33         102 # ${ ... }
8717             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
8718             $char[$i] = e_capture($1);
8719             }
8720             }
8721 0 100       0  
8722 9552         19902 # return string
8723             if ($left_e > $right_e) {
8724 3         20 return join '', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter;
8725             }
8726             return join '', $ope, $delimiter, @char, $end_delimiter;
8727             }
8728              
8729             #
8730             # escape qw string (qw//)
8731 9549     34 0 89690 #
8732             sub e_qw {
8733 34         170 my($ope,$delimiter,$end_delimiter,$string) = @_;
8734              
8735             $slash = 'div';
8736 34         75  
  34         336  
8737 621 50       981 # choice again delimiter
    0          
    0          
    0          
    0          
8738 34         173 my %octet = map {$_ => 1} ($string =~ /\G ([\x00-\xFF]) /oxmsg);
8739             if (not $octet{$end_delimiter}) {
8740             return join '', $ope, $delimiter, $string, $end_delimiter;
8741 34         228 }
8742             elsif (not $octet{')'}) {
8743             return join '', $ope, '(', $string, ')';
8744 0         0 }
8745             elsif (not $octet{'}'}) {
8746             return join '', $ope, '{', $string, '}';
8747 0         0 }
8748             elsif (not $octet{']'}) {
8749             return join '', $ope, '[', $string, ']';
8750 0         0 }
8751             elsif (not $octet{'>'}) {
8752             return join '', $ope, '<', $string, '>';
8753 0         0 }
8754 0 0       0 else {
8755 0         0 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
8756             if (not $octet{$char}) {
8757             return join '', $ope, $char, $string, $char;
8758             }
8759             }
8760             }
8761 0         0  
8762 0         0 # qw/AAA BBB C'CC/ --> ('AAA', 'BBB', 'C\'CC')
8763 0         0 my @string = CORE::split(/\s+/, $string);
8764 0         0 for my $string (@string) {
8765 0 0       0 my @octet = $string =~ /\G ([\x00-\xFF]) /oxmsg;
8766 0         0 for my $octet (@octet) {
8767             if ($octet =~ /\A (['\\]) \z/oxms) {
8768             $octet = '\\' . $1;
8769 0         0 }
8770             }
8771 0         0 $string = join '', @octet;
  0         0  
8772             }
8773             return join '', '(', (join ', ', map { "'$_'" } @string), ')';
8774             }
8775              
8776             #
8777             # escape here document (<<"HEREDOC", <
8778 0     108 0 0 #
8779             sub e_heredoc {
8780 108         277 my($string) = @_;
8781              
8782 108         195 $slash = 'm//';
8783              
8784 108         362 my $metachar = qr/[\@\\|]/oxms; # '|' is for <<`HEREDOC`
8785 108         184  
8786             my $left_e = 0;
8787             my $right_e = 0;
8788 108         159  
8789             # split regexp
8790             my @char = $string =~ /\G((?>
8791             [^\x80-\xA0\xE0-\xFE\\\$]|[\x80-\xA0\xE0-\xFE][\x00-\xFF] |
8792             \\x\{ (?>[0-9A-Fa-f]+) \} |
8793             \\o\{ (?>[0-7]+) \} |
8794             \\N\{ (?>[^\x80-\xA0\xE0-\xFE0-9\}][^\x80-\xA0\xE0-\xFE\}]*) \} |
8795             \\ $q_char |
8796             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
8797             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
8798             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
8799             \$ (?>\s* [0-9]+) |
8800             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
8801             \$ \$ (?![\w\{]) |
8802             \$ (?>\s*) \$ (?>\s*) $qq_variable |
8803             $q_char
8804 108         11217 ))/oxmsg;
8805              
8806             for (my $i=0; $i <= $#char; $i++) {
8807 108 50 66     530  
    50 33        
    100          
    100          
    50          
8808 3225         10465 # "\L\u" --> "\u\L"
8809             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
8810             @char[$i,$i+1] = @char[$i+1,$i];
8811             }
8812              
8813 0         0 # "\U\l" --> "\l\U"
8814             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
8815             @char[$i,$i+1] = @char[$i+1,$i];
8816             }
8817              
8818 0         0 # octal escape sequence
8819             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
8820             $char[$i] = Ehp15::octchr($1);
8821             }
8822              
8823 1         5 # hexadecimal escape sequence
8824             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
8825             $char[$i] = Ehp15::hexchr($1);
8826             }
8827              
8828 1         3 # \N{CHARNAME} --> N{CHARNAME}
8829             elsif ($char[$i] =~ /\A \\ ( N\{ ([^\x80-\xA0\xE0-\xFE0-9\}][^\x80-\xA0\xE0-\xFE\}]*) \} ) \z/oxms) {
8830             $char[$i] = $1;
8831 0 100       0 }
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
8832              
8833             if (0) {
8834             }
8835 3225         27733  
8836 0         0 # escape character
8837             elsif ($char[$i] =~ /\A ([\x80-\xFF].*) ($metachar) \z/oxms) {
8838             $char[$i] = $1 . '\\' . $2;
8839             }
8840              
8841 57 50       287 # \u \l \U \L \F \Q \E
8842 72         127 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
8843             if ($right_e < $left_e) {
8844             $char[$i] = '\\' . $char[$i];
8845             }
8846 0         0 }
8847 0         0 elsif ($char[$i] eq '\u') {
8848             $char[$i] = '@{[Ehp15::ucfirst qq<';
8849             $left_e++;
8850 0         0 }
8851 0         0 elsif ($char[$i] eq '\l') {
8852             $char[$i] = '@{[Ehp15::lcfirst qq<';
8853             $left_e++;
8854 0         0 }
8855 0         0 elsif ($char[$i] eq '\U') {
8856             $char[$i] = '@{[Ehp15::uc qq<';
8857             $left_e++;
8858 0         0 }
8859 6         9 elsif ($char[$i] eq '\L') {
8860             $char[$i] = '@{[Ehp15::lc qq<';
8861             $left_e++;
8862 6         11 }
8863 0         0 elsif ($char[$i] eq '\F') {
8864             $char[$i] = '@{[Ehp15::fc qq<';
8865             $left_e++;
8866 0         0 }
8867 0         0 elsif ($char[$i] eq '\Q') {
8868             $char[$i] = '@{[CORE::quotemeta qq<';
8869             $left_e++;
8870 0 50       0 }
8871 3         5 elsif ($char[$i] eq '\E') {
8872 3         5 if ($right_e < $left_e) {
8873             $char[$i] = '>]}';
8874             $right_e++;
8875 3         5 }
8876             else {
8877             $char[$i] = '';
8878             }
8879 0         0 }
8880 0 0       0 elsif ($char[$i] eq '\Q') {
8881 0         0 while (1) {
8882             if (++$i > $#char) {
8883 0 0       0 last;
8884 0         0 }
8885             if ($char[$i] eq '\E') {
8886             last;
8887             }
8888             }
8889             }
8890             elsif ($char[$i] eq '\E') {
8891             }
8892              
8893             # $0 --> $0
8894             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
8895             }
8896             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
8897             }
8898              
8899             # $$ --> $$
8900             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
8901             }
8902              
8903             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
8904 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
8905             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
8906             $char[$i] = e_capture($1);
8907 0         0 }
8908             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
8909             $char[$i] = e_capture($1);
8910             }
8911              
8912 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
8913             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
8914             $char[$i] = e_capture($1.'->'.$2);
8915             }
8916              
8917 0         0 # $$foo{ ... } --> $ $foo->{ ... }
8918             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
8919             $char[$i] = e_capture($1.'->'.$2);
8920             }
8921              
8922 0         0 # $$foo
8923             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
8924             $char[$i] = e_capture($1);
8925             }
8926              
8927 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ehp15::PREMATCH()
8928             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
8929             $char[$i] = '@{[Ehp15::PREMATCH()]}';
8930             }
8931              
8932 8         47 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ehp15::MATCH()
8933             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
8934             $char[$i] = '@{[Ehp15::MATCH()]}';
8935             }
8936              
8937 8         58 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ehp15::POSTMATCH()
8938             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
8939             $char[$i] = '@{[Ehp15::POSTMATCH()]}';
8940             }
8941              
8942             # ${ foo } --> ${ foo }
8943             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
8944             }
8945              
8946 6         35 # ${ ... }
8947             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
8948             $char[$i] = e_capture($1);
8949             }
8950             }
8951 0 100       0  
8952 108         338 # return string
8953             if ($left_e > $right_e) {
8954 3         34 return join '', @char, '>]}' x ($left_e - $right_e);
8955             }
8956             return join '', @char;
8957             }
8958              
8959             #
8960             # escape regexp (m//, qr//)
8961 105     1835 0 803 #
8962 1835   100     7850 sub e_qr {
8963             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
8964 1835         6463 $modifier ||= '';
8965 1835 50       3793  
8966 1835         5569 $modifier =~ tr/p//d;
8967 0         0 if ($modifier =~ /([adlu])/oxms) {
8968 0 0       0 my $line = 0;
8969 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
8970 0         0 if ($filename ne __FILE__) {
8971             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
8972             last;
8973 0         0 }
8974             }
8975             die qq{Unsupported modifier "$1" used at line $line.\n};
8976 0         0 }
8977              
8978             $slash = 'div';
8979 1835 100       3032  
    100          
8980 1835         5243 # literal null string pattern
8981 8         11 if ($string eq '') {
8982 8         12 $modifier =~ tr/bB//d;
8983             $modifier =~ tr/i//d;
8984             return join '', $ope, $delimiter, $end_delimiter, $modifier;
8985             }
8986              
8987             # /b /B modifier
8988             elsif ($modifier =~ tr/bB//d) {
8989 8 50       64  
8990 240         561 # choice again delimiter
8991 0         0 if ($delimiter =~ / [\@:] /oxms) {
  0         0  
8992 0 0       0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
    0          
    0          
    0          
8993 0         0 my %octet = map {$_ => 1} @char;
8994 0         0 if (not $octet{')'}) {
8995             $delimiter = '(';
8996             $end_delimiter = ')';
8997 0         0 }
8998 0         0 elsif (not $octet{'}'}) {
8999             $delimiter = '{';
9000             $end_delimiter = '}';
9001 0         0 }
9002 0         0 elsif (not $octet{']'}) {
9003             $delimiter = '[';
9004             $end_delimiter = ']';
9005 0         0 }
9006 0         0 elsif (not $octet{'>'}) {
9007             $delimiter = '<';
9008             $end_delimiter = '>';
9009 0         0 }
9010 0 0       0 else {
9011 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
9012 0         0 if (not $octet{$char}) {
9013 0         0 $delimiter = $char;
9014             $end_delimiter = $char;
9015             last;
9016             }
9017             }
9018             }
9019 0 100 100     0 }
9020 240         1137  
9021             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
9022             return join '', $ope, $delimiter, $string, $matched, $end_delimiter, $modifier;
9023 90         499 }
9024             else {
9025             return join '', $ope, $delimiter, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
9026             }
9027 150 100       927 }
9028 1587         3990  
9029             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
9030             my $metachar = qr/[\@\\|[\]{^]/oxms;
9031 1587         5529  
9032             # split regexp
9033             my @char = $string =~ /\G((?>
9034             [^\x80-\xA0\xE0-\xFE\\\$\@\[\(]|[\x80-\xA0\xE0-\xFE][\x00-\xFF] |
9035             \\x (?>[0-9A-Fa-f]{1,2}) |
9036             \\ (?>[0-7]{2,3}) |
9037             \\c [\x40-\x5F] |
9038             \\x\{ (?>[0-9A-Fa-f]+) \} |
9039             \\o\{ (?>[0-7]+) \} |
9040             \\[bBNpP]\{ (?>[^\x80-\xA0\xE0-\xFE0-9\}][^\x80-\xA0\xE0-\xFE\}]*) \} |
9041             \\ $q_char |
9042             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
9043             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
9044             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
9045             [\$\@] $qq_variable |
9046             \$ (?>\s* [0-9]+) |
9047             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
9048             \$ \$ (?![\w\{]) |
9049             \$ (?>\s*) \$ (?>\s*) $qq_variable |
9050             \[\^ |
9051             \[\: (?>[a-z]+) :\] |
9052             \[\:\^ (?>[a-z]+) :\] |
9053             \(\? |
9054             $q_char
9055             ))/oxmsg;
9056 1587 50       139526  
9057 1587         7036 # choice again delimiter
  0         0  
9058 0 0       0 if ($delimiter =~ / [\@:] /oxms) {
    0          
    0          
    0          
9059 0         0 my %octet = map {$_ => 1} @char;
9060 0         0 if (not $octet{')'}) {
9061             $delimiter = '(';
9062             $end_delimiter = ')';
9063 0         0 }
9064 0         0 elsif (not $octet{'}'}) {
9065             $delimiter = '{';
9066             $end_delimiter = '}';
9067 0         0 }
9068 0         0 elsif (not $octet{']'}) {
9069             $delimiter = '[';
9070             $end_delimiter = ']';
9071 0         0 }
9072 0         0 elsif (not $octet{'>'}) {
9073             $delimiter = '<';
9074             $end_delimiter = '>';
9075 0         0 }
9076 0 0       0 else {
9077 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
9078 0         0 if (not $octet{$char}) {
9079 0         0 $delimiter = $char;
9080             $end_delimiter = $char;
9081             last;
9082             }
9083             }
9084             }
9085 0         0 }
9086 1587         2538  
9087 1587         2253 my $left_e = 0;
9088             my $right_e = 0;
9089             for (my $i=0; $i <= $#char; $i++) {
9090 1587 50 66     4049  
    50 66        
    100          
    100          
    100          
    100          
9091 5422         30197 # "\L\u" --> "\u\L"
9092             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
9093             @char[$i,$i+1] = @char[$i+1,$i];
9094             }
9095              
9096 0         0 # "\U\l" --> "\l\U"
9097             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
9098             @char[$i,$i+1] = @char[$i+1,$i];
9099             }
9100              
9101 0         0 # octal escape sequence
9102             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
9103             $char[$i] = Ehp15::octchr($1);
9104             }
9105              
9106 1         4 # hexadecimal escape sequence
9107             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
9108             $char[$i] = Ehp15::hexchr($1);
9109             }
9110              
9111             # \b{...} --> b\{...}
9112             # \B{...} --> B\{...}
9113             # \N{CHARNAME} --> N\{CHARNAME}
9114             # \p{PROPERTY} --> p\{PROPERTY}
9115 1         5 # \P{PROPERTY} --> P\{PROPERTY}
9116             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x80-\xA0\xE0-\xFE0-9\}][^\x80-\xA0\xE0-\xFE\}]*) \} ) \z/oxms) {
9117             $char[$i] = $1 . '\\' . $2;
9118             }
9119              
9120 6         22 # \p, \P, \X --> p, P, X
9121             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
9122             $char[$i] = $1;
9123 4 100 100     10 }
    100 100        
    100 100        
    100          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
9124              
9125             if (0) {
9126             }
9127 5422         36658  
9128 0         0 # escape last octet of multiple-octet
9129             elsif ($char[$i] =~ /\A \\? ([\x80-\xFF].*) ($metachar|\Q$delimiter\E|\Q$end_delimiter\E) \z/xms) {
9130             $char[$i] = $1 . '\\' . $2;
9131             }
9132              
9133 77 50 33     351 # join separated multiple-octet
    50 33        
    50 33        
      33        
      66        
      33        
9134 6         142 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
9135             if ( ($i+3 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+3]) == 3) and (CORE::eval(sprintf '"%s%s%s%s"', @char[$i..$i+3]) =~ /\A $q_char \z/oxms)) {
9136             $char[$i] .= join '', splice @char, $i+1, 3;
9137 0         0 }
9138             elsif (($i+2 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+2]) == 2) and (CORE::eval(sprintf '"%s%s%s"', @char[$i..$i+2]) =~ /\A $q_char \z/oxms)) {
9139             $char[$i] .= join '', splice @char, $i+1, 2;
9140 0         0 }
9141             elsif (($i+1 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, $char[$i+1 ]) == 1) and (CORE::eval(sprintf '"%s%s"', @char[$i..$i+1]) =~ /\A $q_char \z/oxms)) {
9142             $char[$i] .= join '', splice @char, $i+1, 1;
9143             }
9144             }
9145              
9146 0         0 # open character class [...]
9147             elsif ($char[$i] eq '[') {
9148             my $left = $i;
9149              
9150             # [] make die "Unmatched [] in regexp ...\n"
9151 586 100       867 # (and so on)
9152 586         1370  
9153             if ($char[$i+1] eq ']') {
9154             $i++;
9155 3         7 }
9156 586 50       775  
9157 2583         3730 while (1) {
9158             if (++$i > $#char) {
9159 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
9160 2583         3933 }
9161             if ($char[$i] eq ']') {
9162             my $right = $i;
9163 586 100       721  
9164 586         3009 # [...]
  90         233  
9165             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
9166             splice @char, $left, $right-$left+1, sprintf(q{@{[Ehp15::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
9167 270         406 }
9168             else {
9169             splice @char, $left, $right-$left+1, Ehp15::charlist_qr(@char[$left+1..$right-1], $modifier);
9170 496         1802 }
9171 586         1026  
9172             $i = $left;
9173             last;
9174             }
9175             }
9176             }
9177              
9178 586         1763 # open character class [^...]
9179             elsif ($char[$i] eq '[^') {
9180             my $left = $i;
9181              
9182             # [^] make die "Unmatched [] in regexp ...\n"
9183 328 100       459 # (and so on)
9184 328         693  
9185             if ($char[$i+1] eq ']') {
9186             $i++;
9187 5         10 }
9188 328 50       363  
9189 1447         2033 while (1) {
9190             if (++$i > $#char) {
9191 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
9192 1447         2085 }
9193             if ($char[$i] eq ']') {
9194             my $right = $i;
9195 328 100       370  
9196 328         1645 # [^...]
  90         201  
9197             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
9198             splice @char, $left, $right-$left+1, sprintf(q{@{[Ehp15::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
9199 270         402 }
9200             else {
9201             splice @char, $left, $right-$left+1, Ehp15::charlist_not_qr(@char[$left+1..$right-1], $modifier);
9202 238         817 }
9203 328         574  
9204             $i = $left;
9205             last;
9206             }
9207             }
9208             }
9209              
9210 328         882 # rewrite character class or escape character
9211             elsif (my $char = character_class($char[$i],$modifier)) {
9212             $char[$i] = $char;
9213             }
9214              
9215 215 50       771 # /i modifier
9216 238         468 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ehp15::uc($char[$i]) ne Ehp15::fc($char[$i]))) {
9217             if (CORE::length(Ehp15::fc($char[$i])) == 1) {
9218             $char[$i] = '[' . Ehp15::uc($char[$i]) . Ehp15::fc($char[$i]) . ']';
9219 238         457 }
9220             else {
9221             $char[$i] = '(?:' . Ehp15::uc($char[$i]) . '|' . Ehp15::fc($char[$i]) . ')';
9222             }
9223             }
9224              
9225 0 50       0 # \u \l \U \L \F \Q \E
9226 1         5 elsif ($char[$i] =~ /\A [<>] \z/oxms) {
9227             if ($right_e < $left_e) {
9228             $char[$i] = '\\' . $char[$i];
9229             }
9230 0         0 }
9231 0         0 elsif ($char[$i] eq '\u') {
9232             $char[$i] = '@{[Ehp15::ucfirst qq<';
9233             $left_e++;
9234 0         0 }
9235 0         0 elsif ($char[$i] eq '\l') {
9236             $char[$i] = '@{[Ehp15::lcfirst qq<';
9237             $left_e++;
9238 0         0 }
9239 1         2 elsif ($char[$i] eq '\U') {
9240             $char[$i] = '@{[Ehp15::uc qq<';
9241             $left_e++;
9242 1         3 }
9243 1         2 elsif ($char[$i] eq '\L') {
9244             $char[$i] = '@{[Ehp15::lc qq<';
9245             $left_e++;
9246 1         3 }
9247 9         17 elsif ($char[$i] eq '\F') {
9248             $char[$i] = '@{[Ehp15::fc qq<';
9249             $left_e++;
9250 9         25 }
9251 22         47 elsif ($char[$i] eq '\Q') {
9252             $char[$i] = '@{[CORE::quotemeta qq<';
9253             $left_e++;
9254 22 50       52 }
9255 33         81 elsif ($char[$i] eq '\E') {
9256 33         49 if ($right_e < $left_e) {
9257             $char[$i] = '>]}';
9258             $right_e++;
9259 33         79 }
9260             else {
9261             $char[$i] = '';
9262             }
9263 0         0 }
9264 0 0       0 elsif ($char[$i] eq '\Q') {
9265 0         0 while (1) {
9266             if (++$i > $#char) {
9267 0 0       0 last;
9268 0         0 }
9269             if ($char[$i] eq '\E') {
9270             last;
9271             }
9272             }
9273             }
9274             elsif ($char[$i] eq '\E') {
9275             }
9276              
9277 0 0       0 # $0 --> $0
9278 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
9279             if ($ignorecase) {
9280             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
9281             }
9282 0 0       0 }
9283 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
9284             if ($ignorecase) {
9285             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
9286             }
9287             }
9288              
9289             # $$ --> $$
9290             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
9291             }
9292              
9293             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
9294 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
9295 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
9296 0         0 $char[$i] = e_capture($1);
9297             if ($ignorecase) {
9298             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
9299             }
9300 0         0 }
9301 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
9302 0         0 $char[$i] = e_capture($1);
9303             if ($ignorecase) {
9304             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
9305             }
9306             }
9307              
9308 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
9309 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
9310 0         0 $char[$i] = e_capture($1.'->'.$2);
9311             if ($ignorecase) {
9312             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
9313             }
9314             }
9315              
9316 0         0 # $$foo{ ... } --> $ $foo->{ ... }
9317 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
9318 0         0 $char[$i] = e_capture($1.'->'.$2);
9319             if ($ignorecase) {
9320             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
9321             }
9322             }
9323              
9324 0         0 # $$foo
9325 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
9326 0         0 $char[$i] = e_capture($1);
9327             if ($ignorecase) {
9328             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
9329             }
9330             }
9331              
9332 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ehp15::PREMATCH()
9333 8         23 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
9334             if ($ignorecase) {
9335             $char[$i] = '@{[Ehp15::ignorecase(Ehp15::PREMATCH())]}';
9336 0         0 }
9337             else {
9338             $char[$i] = '@{[Ehp15::PREMATCH()]}';
9339             }
9340             }
9341              
9342 8 50       26 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ehp15::MATCH()
9343 8         17 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
9344             if ($ignorecase) {
9345             $char[$i] = '@{[Ehp15::ignorecase(Ehp15::MATCH())]}';
9346 0         0 }
9347             else {
9348             $char[$i] = '@{[Ehp15::MATCH()]}';
9349             }
9350             }
9351              
9352 8 50       26 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ehp15::POSTMATCH()
9353 6         15 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
9354             if ($ignorecase) {
9355             $char[$i] = '@{[Ehp15::ignorecase(Ehp15::POSTMATCH())]}';
9356 0         0 }
9357             else {
9358             $char[$i] = '@{[Ehp15::POSTMATCH()]}';
9359             }
9360             }
9361              
9362 6 0       20 # ${ foo }
9363 0         0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
9364             if ($ignorecase) {
9365             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
9366             }
9367             }
9368              
9369 0         0 # ${ ... }
9370 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
9371 0         0 $char[$i] = e_capture($1);
9372             if ($ignorecase) {
9373             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
9374             }
9375             }
9376              
9377 0         0 # $scalar or @array
9378 31 100       139 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
9379 31         173 $char[$i] = e_string($char[$i]);
9380             if ($ignorecase) {
9381             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
9382             }
9383             }
9384              
9385 4 100 66     15 # quote character before ? + * {
    50          
9386             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
9387             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
9388 188         1492 }
9389 0 0       0 elsif (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
9390 0         0 my $char = $char[$i-1];
9391             if ($char[$i] eq '{') {
9392             die __FILE__, qq{: "MULTIBYTE{n}" should be "(MULTIBYTE){n}" in m?? (and shift \$1,\$2,\$3,...) ($char){n}\n};
9393 0         0 }
9394             else {
9395             die __FILE__, qq{: "MULTIBYTE$char[$i]" should be "(MULTIBYTE)$char[$i]" in m?? (and shift \$1,\$2,\$3,...) ($char)$char[$i]\n};
9396             }
9397 0         0 }
9398             else {
9399             $char[$i-1] = '(?:' . $char[$i-1] . ')';
9400             }
9401             }
9402             }
9403 187         852  
9404 1587 50       2997 # make regexp string
9405 1587 0 0     4691 $modifier =~ tr/i//d;
9406 0         0 if ($left_e > $right_e) {
9407             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
9408             return join '', $ope, $delimiter, $anchor, @char, '>]}' x ($left_e - $right_e), $matched, $end_delimiter, $modifier;
9409 0         0 }
9410             else {
9411             return join '', $ope, $delimiter, $anchor, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
9412 0 100 100     0 }
9413 1587         9148 }
9414             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
9415             return join '', $ope, $delimiter, $anchor, @char, $matched, $end_delimiter, $modifier;
9416 94         708 }
9417             else {
9418             return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
9419             }
9420             }
9421              
9422             #
9423             # double quote stuff
9424 1493     540 0 13006 #
9425             sub qq_stuff {
9426             my($delimiter,$end_delimiter,$stuff) = @_;
9427 540 100       952  
9428 540         1232 # scalar variable or array variable
9429             if ($stuff =~ /\A [\$\@] /oxms) {
9430             return $stuff;
9431             }
9432 300         1057  
  240         648  
9433 280         743 # quote by delimiter
9434 240 50       584 my %octet = map {$_ => 1} ($stuff =~ /\G ([\x00-\xFF]) /oxmsg);
9435 240 50       480 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
9436 240 50       365 next if $char eq $delimiter;
9437 240         413 next if $char eq $end_delimiter;
9438             if (not $octet{$char}) {
9439             return join '', 'qq', $char, $stuff, $char;
9440 240         918 }
9441             }
9442             return join '', 'qq', '<', $stuff, '>';
9443             }
9444              
9445             #
9446             # escape regexp (m'', qr'', and m''b, qr''b)
9447 0     163 0 0 #
9448 163   100     741 sub e_qr_q {
9449             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
9450 163         461 $modifier ||= '';
9451 163 50       248  
9452 163         426 $modifier =~ tr/p//d;
9453 0         0 if ($modifier =~ /([adlu])/oxms) {
9454 0 0       0 my $line = 0;
9455 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
9456 0         0 if ($filename ne __FILE__) {
9457             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
9458             last;
9459 0         0 }
9460             }
9461             die qq{Unsupported modifier "$1" used at line $line.\n};
9462 0         0 }
9463              
9464             $slash = 'div';
9465 163 100       222  
    100          
9466 163         353 # literal null string pattern
9467 8         11 if ($string eq '') {
9468 8         9 $modifier =~ tr/bB//d;
9469             $modifier =~ tr/i//d;
9470             return join '', $ope, $delimiter, $end_delimiter, $modifier;
9471             }
9472              
9473 8         40 # with /b /B modifier
9474             elsif ($modifier =~ tr/bB//d) {
9475             return e_qr_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
9476             }
9477              
9478 89         228 # without /b /B modifier
9479             else {
9480             return e_qr_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
9481             }
9482             }
9483              
9484             #
9485             # escape regexp (m'', qr'')
9486 66     66 0 157 #
9487             sub e_qr_qt {
9488 66 100       159 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
9489              
9490             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
9491 66         203  
9492             # split regexp
9493             my @char = $string =~ /\G((?>
9494             [^\x80-\xA0\xE0-\xFE\\\[\$\@\/] |
9495             [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
9496             \[\^ |
9497             \[\: (?>[a-z]+) \:\] |
9498             \[\:\^ (?>[a-z]+) \:\] |
9499             [\$\@\/] |
9500             \\ (?:$q_char) |
9501             (?:$q_char)
9502             ))/oxmsg;
9503 66         719  
9504 66 100 100     217 # unescape character
    50 100        
    50 66        
    50          
    50          
    100          
    50          
9505             for (my $i=0; $i <= $#char; $i++) {
9506             if (0) {
9507             }
9508 79         809  
9509 0         0 # escape last octet of multiple-octet
9510             elsif ($char[$i] =~ /\A ([\x80-\xFF].*) ([\\|\[\{\^]|\Q$delimiter\E|\Q$end_delimiter\E) \z/xms) {
9511             $char[$i] = $1 . '\\' . $2;
9512             }
9513              
9514 2         14 # open character class [...]
9515 0 0       0 elsif ($char[$i] eq '[') {
9516 0         0 my $left = $i;
9517             if ($char[$i+1] eq ']') {
9518 0         0 $i++;
9519 0 0       0 }
9520 0         0 while (1) {
9521             if (++$i > $#char) {
9522 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
9523 0         0 }
9524             if ($char[$i] eq ']') {
9525             my $right = $i;
9526 0         0  
9527             # [...]
9528 0         0 splice @char, $left, $right-$left+1, Ehp15::charlist_qr(@char[$left+1..$right-1], $modifier);
9529 0         0  
9530             $i = $left;
9531             last;
9532             }
9533             }
9534             }
9535              
9536 0         0 # open character class [^...]
9537 0 0       0 elsif ($char[$i] eq '[^') {
9538 0         0 my $left = $i;
9539             if ($char[$i+1] eq ']') {
9540 0         0 $i++;
9541 0 0       0 }
9542 0         0 while (1) {
9543             if (++$i > $#char) {
9544 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
9545 0         0 }
9546             if ($char[$i] eq ']') {
9547             my $right = $i;
9548 0         0  
9549             # [^...]
9550 0         0 splice @char, $left, $right-$left+1, Ehp15::charlist_not_qr(@char[$left+1..$right-1], $modifier);
9551 0         0  
9552             $i = $left;
9553             last;
9554             }
9555             }
9556             }
9557              
9558 0         0 # escape $ @ / and \
9559             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
9560             $char[$i] = '\\' . $char[$i];
9561             }
9562              
9563 0         0 # rewrite character class or escape character
9564             elsif (my $char = character_class($char[$i],$modifier)) {
9565             $char[$i] = $char;
9566             }
9567              
9568 0 50       0 # /i modifier
9569 16         40 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ehp15::uc($char[$i]) ne Ehp15::fc($char[$i]))) {
9570             if (CORE::length(Ehp15::fc($char[$i])) == 1) {
9571             $char[$i] = '[' . Ehp15::uc($char[$i]) . Ehp15::fc($char[$i]) . ']';
9572 16         35 }
9573             else {
9574             $char[$i] = '(?:' . Ehp15::uc($char[$i]) . '|' . Ehp15::fc($char[$i]) . ')';
9575             }
9576             }
9577              
9578 0 0       0 # quote character before ? + * {
9579             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
9580             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
9581 0         0 }
9582             else {
9583             $char[$i-1] = '(?:' . $char[$i-1] . ')';
9584             }
9585             }
9586 0         0 }
9587 66         120  
9588             $delimiter = '/';
9589 66         90 $end_delimiter = '/';
9590 66         88  
9591             $modifier =~ tr/i//d;
9592             return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
9593             }
9594              
9595             #
9596             # escape regexp (m''b, qr''b)
9597 66     89 0 401 #
9598             sub e_qr_qb {
9599             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
9600 89         213  
9601             # split regexp
9602             my @char = $string =~ /\G ((?>[^\\]|\\\\|[\x00-\xFF])) /oxmsg;
9603 89         365  
9604 89 50       219 # unescape character
    50          
9605             for (my $i=0; $i <= $#char; $i++) {
9606             if (0) {
9607             }
9608 199         609  
9609             # remain \\
9610             elsif ($char[$i] eq '\\\\') {
9611             }
9612              
9613 0         0 # escape $ @ / and \
9614             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
9615             $char[$i] = '\\' . $char[$i];
9616             }
9617 0         0 }
9618 89         136  
9619 89         122 $delimiter = '/';
9620             $end_delimiter = '/';
9621             return join '', $ope, $delimiter, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
9622             }
9623              
9624             #
9625             # escape regexp (s/here//)
9626 89     194 0 525 #
9627 194   100     559 sub e_s1 {
9628             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
9629 194         751 $modifier ||= '';
9630 194 50       306  
9631 194         656 $modifier =~ tr/p//d;
9632 0         0 if ($modifier =~ /([adlu])/oxms) {
9633 0 0       0 my $line = 0;
9634 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
9635 0         0 if ($filename ne __FILE__) {
9636             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
9637             last;
9638 0         0 }
9639             }
9640             die qq{Unsupported modifier "$1" used at line $line.\n};
9641 0         0 }
9642              
9643             $slash = 'div';
9644 194 100       384  
    100          
9645 194         732 # literal null string pattern
9646 8         8 if ($string eq '') {
9647 8         9 $modifier =~ tr/bB//d;
9648             $modifier =~ tr/i//d;
9649             return join '', $ope, $delimiter, $end_delimiter, $modifier;
9650             }
9651              
9652             # /b /B modifier
9653             elsif ($modifier =~ tr/bB//d) {
9654 8 50       50  
9655 44         102 # choice again delimiter
9656 0         0 if ($delimiter =~ / [\@:] /oxms) {
  0         0  
9657 0 0       0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
    0          
    0          
    0          
9658 0         0 my %octet = map {$_ => 1} @char;
9659 0         0 if (not $octet{')'}) {
9660             $delimiter = '(';
9661             $end_delimiter = ')';
9662 0         0 }
9663 0         0 elsif (not $octet{'}'}) {
9664             $delimiter = '{';
9665             $end_delimiter = '}';
9666 0         0 }
9667 0         0 elsif (not $octet{']'}) {
9668             $delimiter = '[';
9669             $end_delimiter = ']';
9670 0         0 }
9671 0         0 elsif (not $octet{'>'}) {
9672             $delimiter = '<';
9673             $end_delimiter = '>';
9674 0         0 }
9675 0 0       0 else {
9676 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
9677 0         0 if (not $octet{$char}) {
9678 0         0 $delimiter = $char;
9679             $end_delimiter = $char;
9680             last;
9681             }
9682             }
9683             }
9684 0         0 }
9685 44         106  
9686 44         55 my $prematch = '';
9687             $prematch = q{(\G[\x00-\xFF]*?)};
9688             return join '', $ope, $delimiter, $prematch, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
9689 44 100       382 }
9690 142         494  
9691             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
9692             my $metachar = qr/[\@\\|[\]{^]/oxms;
9693 142         637  
9694             # split regexp
9695             my @char = $string =~ /\G((?>
9696             [^\x80-\xA0\xE0-\xFE\\\$\@\[\(]|[\x80-\xA0\xE0-\xFE][\x00-\xFF] |
9697             \\ (?>[1-9][0-9]*) |
9698             \\g (?>\s*) (?>[1-9][0-9]*) |
9699             \\g (?>\s*) \{ (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
9700             \\g (?>\s*) \{ (?>\s*) - (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
9701             \\x (?>[0-9A-Fa-f]{1,2}) |
9702             \\ (?>[0-7]{2,3}) |
9703             \\c [\x40-\x5F] |
9704             \\x\{ (?>[0-9A-Fa-f]+) \} |
9705             \\o\{ (?>[0-7]+) \} |
9706             \\[bBNpP]\{ (?>[^\x80-\xA0\xE0-\xFE0-9\}][^\x80-\xA0\xE0-\xFE\}]*) \} |
9707             \\ $q_char |
9708             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
9709             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
9710             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
9711             [\$\@] $qq_variable |
9712             \$ (?>\s* [0-9]+) |
9713             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
9714             \$ \$ (?![\w\{]) |
9715             \$ (?>\s*) \$ (?>\s*) $qq_variable |
9716             \[\^ |
9717             \[\: (?>[a-z]+) :\] |
9718             \[\:\^ (?>[a-z]+) :\] |
9719             \(\? |
9720             $q_char
9721             ))/oxmsg;
9722 142 50       36889  
9723 142         1129 # choice again delimiter
  0         0  
9724 0 0       0 if ($delimiter =~ / [\@:] /oxms) {
    0          
    0          
    0          
9725 0         0 my %octet = map {$_ => 1} @char;
9726 0         0 if (not $octet{')'}) {
9727             $delimiter = '(';
9728             $end_delimiter = ')';
9729 0         0 }
9730 0         0 elsif (not $octet{'}'}) {
9731             $delimiter = '{';
9732             $end_delimiter = '}';
9733 0         0 }
9734 0         0 elsif (not $octet{']'}) {
9735             $delimiter = '[';
9736             $end_delimiter = ']';
9737 0         0 }
9738 0         0 elsif (not $octet{'>'}) {
9739             $delimiter = '<';
9740             $end_delimiter = '>';
9741 0         0 }
9742 0 0       0 else {
9743 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
9744 0         0 if (not $octet{$char}) {
9745 0         0 $delimiter = $char;
9746             $end_delimiter = $char;
9747             last;
9748             }
9749             }
9750             }
9751             }
9752 0         0  
  142         416  
9753             # count '('
9754 476         868 my $parens = grep { $_ eq '(' } @char;
9755 142         220  
9756 142         287 my $left_e = 0;
9757             my $right_e = 0;
9758             for (my $i=0; $i <= $#char; $i++) {
9759 142 50 33     445  
    50 33        
    100          
    100          
    50          
    50          
9760 397         2577 # "\L\u" --> "\u\L"
9761             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
9762             @char[$i,$i+1] = @char[$i+1,$i];
9763             }
9764              
9765 0         0 # "\U\l" --> "\l\U"
9766             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
9767             @char[$i,$i+1] = @char[$i+1,$i];
9768             }
9769              
9770 0         0 # octal escape sequence
9771             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
9772             $char[$i] = Ehp15::octchr($1);
9773             }
9774              
9775 1         4 # hexadecimal escape sequence
9776             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
9777             $char[$i] = Ehp15::hexchr($1);
9778             }
9779              
9780             # \b{...} --> b\{...}
9781             # \B{...} --> B\{...}
9782             # \N{CHARNAME} --> N\{CHARNAME}
9783             # \p{PROPERTY} --> p\{PROPERTY}
9784 1         3 # \P{PROPERTY} --> P\{PROPERTY}
9785             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x80-\xA0\xE0-\xFE0-9\}][^\x80-\xA0\xE0-\xFE\}]*) \} ) \z/oxms) {
9786             $char[$i] = $1 . '\\' . $2;
9787             }
9788              
9789 0         0 # \p, \P, \X --> p, P, X
9790             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
9791             $char[$i] = $1;
9792 0 100 100     0 }
    50 100        
    100 100        
    50          
    100          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
9793              
9794             if (0) {
9795             }
9796 397         10669  
9797 0         0 # escape last octet of multiple-octet
9798             elsif ($char[$i] =~ /\A \\? ([\x80-\xFF].*) ($metachar|\Q$delimiter\E|\Q$end_delimiter\E) \z/xms) {
9799             $char[$i] = $1 . '\\' . $2;
9800             }
9801              
9802 23 0 0     122 # join separated multiple-octet
    0 0        
    0 0        
      0        
      0        
      0        
9803 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
9804             if ( ($i+3 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+3]) == 3) and (CORE::eval(sprintf '"%s%s%s%s"', @char[$i..$i+3]) =~ /\A $q_char \z/oxms)) {
9805             $char[$i] .= join '', splice @char, $i+1, 3;
9806 0         0 }
9807             elsif (($i+2 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+2]) == 2) and (CORE::eval(sprintf '"%s%s%s"', @char[$i..$i+2]) =~ /\A $q_char \z/oxms)) {
9808             $char[$i] .= join '', splice @char, $i+1, 2;
9809 0         0 }
9810             elsif (($i+1 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, $char[$i+1 ]) == 1) and (CORE::eval(sprintf '"%s%s"', @char[$i..$i+1]) =~ /\A $q_char \z/oxms)) {
9811             $char[$i] .= join '', splice @char, $i+1, 1;
9812             }
9813             }
9814              
9815 0         0 # open character class [...]
9816 20 50       42 elsif ($char[$i] eq '[') {
9817 20         63 my $left = $i;
9818             if ($char[$i+1] eq ']') {
9819 0         0 $i++;
9820 20 50       32 }
9821 79         191 while (1) {
9822             if (++$i > $#char) {
9823 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
9824 79         216 }
9825             if ($char[$i] eq ']') {
9826             my $right = $i;
9827 20 50       45  
9828 20         144 # [...]
  0         0  
9829             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
9830             splice @char, $left, $right-$left+1, sprintf(q{@{[Ehp15::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
9831 0         0 }
9832             else {
9833             splice @char, $left, $right-$left+1, Ehp15::charlist_qr(@char[$left+1..$right-1], $modifier);
9834 20         132 }
9835 20         38  
9836             $i = $left;
9837             last;
9838             }
9839             }
9840             }
9841              
9842 20         65 # open character class [^...]
9843 0 0       0 elsif ($char[$i] eq '[^') {
9844 0         0 my $left = $i;
9845             if ($char[$i+1] eq ']') {
9846 0         0 $i++;
9847 0 0       0 }
9848 0         0 while (1) {
9849             if (++$i > $#char) {
9850 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
9851 0         0 }
9852             if ($char[$i] eq ']') {
9853             my $right = $i;
9854 0 0       0  
9855 0         0 # [^...]
  0         0  
9856             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
9857             splice @char, $left, $right-$left+1, sprintf(q{@{[Ehp15::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
9858 0         0 }
9859             else {
9860             splice @char, $left, $right-$left+1, Ehp15::charlist_not_qr(@char[$left+1..$right-1], $modifier);
9861 0         0 }
9862 0         0  
9863             $i = $left;
9864             last;
9865             }
9866             }
9867             }
9868              
9869 0         0 # rewrite character class or escape character
9870             elsif (my $char = character_class($char[$i],$modifier)) {
9871             $char[$i] = $char;
9872             }
9873              
9874 11 50       27 # /i modifier
9875 11         28 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ehp15::uc($char[$i]) ne Ehp15::fc($char[$i]))) {
9876             if (CORE::length(Ehp15::fc($char[$i])) == 1) {
9877             $char[$i] = '[' . Ehp15::uc($char[$i]) . Ehp15::fc($char[$i]) . ']';
9878 11         28 }
9879             else {
9880             $char[$i] = '(?:' . Ehp15::uc($char[$i]) . '|' . Ehp15::fc($char[$i]) . ')';
9881             }
9882             }
9883              
9884 0 50       0 # \u \l \U \L \F \Q \E
9885 8         26 elsif ($char[$i] =~ /\A [<>] \z/oxms) {
9886             if ($right_e < $left_e) {
9887             $char[$i] = '\\' . $char[$i];
9888             }
9889 0         0 }
9890 0         0 elsif ($char[$i] eq '\u') {
9891             $char[$i] = '@{[Ehp15::ucfirst qq<';
9892             $left_e++;
9893 0         0 }
9894 0         0 elsif ($char[$i] eq '\l') {
9895             $char[$i] = '@{[Ehp15::lcfirst qq<';
9896             $left_e++;
9897 0         0 }
9898 0         0 elsif ($char[$i] eq '\U') {
9899             $char[$i] = '@{[Ehp15::uc qq<';
9900             $left_e++;
9901 0         0 }
9902 0         0 elsif ($char[$i] eq '\L') {
9903             $char[$i] = '@{[Ehp15::lc qq<';
9904             $left_e++;
9905 0         0 }
9906 0         0 elsif ($char[$i] eq '\F') {
9907             $char[$i] = '@{[Ehp15::fc qq<';
9908             $left_e++;
9909 0         0 }
9910 7         13 elsif ($char[$i] eq '\Q') {
9911             $char[$i] = '@{[CORE::quotemeta qq<';
9912             $left_e++;
9913 7 50       18 }
9914 7         19 elsif ($char[$i] eq '\E') {
9915 7         12 if ($right_e < $left_e) {
9916             $char[$i] = '>]}';
9917             $right_e++;
9918 7         18 }
9919             else {
9920             $char[$i] = '';
9921             }
9922 0         0 }
9923 0 0       0 elsif ($char[$i] eq '\Q') {
9924 0         0 while (1) {
9925             if (++$i > $#char) {
9926 0 0       0 last;
9927 0         0 }
9928             if ($char[$i] eq '\E') {
9929             last;
9930             }
9931             }
9932             }
9933             elsif ($char[$i] eq '\E') {
9934             }
9935              
9936             # \0 --> \0
9937             elsif ($char[$i] =~ /\A \\ (?>\s*) 0 \z/oxms) {
9938             }
9939              
9940             # \g{N}, \g{-N}
9941              
9942             # P.108 Using Simple Patterns
9943             # in Chapter 7: In the World of Regular Expressions
9944             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
9945              
9946             # P.221 Capturing
9947             # in Chapter 5: Pattern Matching
9948             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
9949              
9950             # \g{-1}, \g{-2}, \g{-3} --> \g{-1}, \g{-2}, \g{-3}
9951             elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) - (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
9952             }
9953              
9954 0 0       0 # \g{1}, \g{2}, \g{3} --> \g{2}, \g{3}, \g{4} (only when multibyte anchoring is enable)
9955 0         0 elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
9956             if ($1 <= $parens) {
9957             $char[$i] = '\\g{' . ($1 + 1) . '}';
9958             }
9959             }
9960              
9961 0 0       0 # \g1, \g2, \g3 --> \g2, \g3, \g4 (only when multibyte anchoring is enable)
9962 0         0 elsif ($char[$i] =~ /\A \\g (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
9963             if ($1 <= $parens) {
9964             $char[$i] = '\\g' . ($1 + 1);
9965             }
9966             }
9967              
9968 0 0       0 # \1, \2, \3 --> \2, \3, \4 (only when multibyte anchoring is enable)
9969 0         0 elsif ($char[$i] =~ /\A \\ (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
9970             if ($1 <= $parens) {
9971             $char[$i] = '\\' . ($1 + 1);
9972             }
9973             }
9974              
9975 0 0       0 # $0 --> $0
9976 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
9977             if ($ignorecase) {
9978             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
9979             }
9980 0 0       0 }
9981 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
9982             if ($ignorecase) {
9983             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
9984             }
9985             }
9986              
9987             # $$ --> $$
9988             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
9989             }
9990              
9991             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
9992 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
9993 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
9994 0         0 $char[$i] = e_capture($1);
9995             if ($ignorecase) {
9996             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
9997             }
9998 0         0 }
9999 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
10000 0         0 $char[$i] = e_capture($1);
10001             if ($ignorecase) {
10002             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10003             }
10004             }
10005              
10006 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
10007 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
10008 0         0 $char[$i] = e_capture($1.'->'.$2);
10009             if ($ignorecase) {
10010             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10011             }
10012             }
10013              
10014 0         0 # $$foo{ ... } --> $ $foo->{ ... }
10015 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
10016 0         0 $char[$i] = e_capture($1.'->'.$2);
10017             if ($ignorecase) {
10018             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10019             }
10020             }
10021              
10022 0         0 # $$foo
10023 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
10024 0         0 $char[$i] = e_capture($1);
10025             if ($ignorecase) {
10026             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10027             }
10028             }
10029              
10030 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ehp15::PREMATCH()
10031 4         17 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
10032             if ($ignorecase) {
10033             $char[$i] = '@{[Ehp15::ignorecase(Ehp15::PREMATCH())]}';
10034 0         0 }
10035             else {
10036             $char[$i] = '@{[Ehp15::PREMATCH()]}';
10037             }
10038             }
10039              
10040 4 50       17 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ehp15::MATCH()
10041 4         16 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
10042             if ($ignorecase) {
10043             $char[$i] = '@{[Ehp15::ignorecase(Ehp15::MATCH())]}';
10044 0         0 }
10045             else {
10046             $char[$i] = '@{[Ehp15::MATCH()]}';
10047             }
10048             }
10049              
10050 4 50       15 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ehp15::POSTMATCH()
10051 3         15 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
10052             if ($ignorecase) {
10053             $char[$i] = '@{[Ehp15::ignorecase(Ehp15::POSTMATCH())]}';
10054 0         0 }
10055             else {
10056             $char[$i] = '@{[Ehp15::POSTMATCH()]}';
10057             }
10058             }
10059              
10060 3 0       12 # ${ foo }
10061 0         0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
10062             if ($ignorecase) {
10063             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10064             }
10065             }
10066              
10067 0         0 # ${ ... }
10068 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
10069 0         0 $char[$i] = e_capture($1);
10070             if ($ignorecase) {
10071             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10072             }
10073             }
10074              
10075 0         0 # $scalar or @array
10076 13 50       48 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
10077 13         61 $char[$i] = e_string($char[$i]);
10078             if ($ignorecase) {
10079             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10080             }
10081             }
10082              
10083 0 50       0 # quote character before ? + * {
10084             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
10085             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
10086 23         135 }
10087             else {
10088             $char[$i-1] = '(?:' . $char[$i-1] . ')';
10089             }
10090             }
10091             }
10092 23         120  
10093 142         455 # make regexp string
10094 142         351 my $prematch = '';
10095 142 50       240 $prematch = "($anchor)";
10096 142         347 $modifier =~ tr/i//d;
10097             if ($left_e > $right_e) {
10098 0         0 return join '', $ope, $delimiter, $prematch, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
10099             }
10100             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
10101             }
10102              
10103             #
10104             # escape regexp (s'here'' or s'here''b)
10105 142     96 0 1639 #
10106 96   100     203 sub e_s1_q {
10107             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
10108 96         248 $modifier ||= '';
10109 96 50       127  
10110 96         275 $modifier =~ tr/p//d;
10111 0         0 if ($modifier =~ /([adlu])/oxms) {
10112 0 0       0 my $line = 0;
10113 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
10114 0         0 if ($filename ne __FILE__) {
10115             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
10116             last;
10117 0         0 }
10118             }
10119             die qq{Unsupported modifier "$1" used at line $line.\n};
10120 0         0 }
10121              
10122             $slash = 'div';
10123 96 100       140  
    100          
10124 96         195 # literal null string pattern
10125 8         11 if ($string eq '') {
10126 8         8 $modifier =~ tr/bB//d;
10127             $modifier =~ tr/i//d;
10128             return join '', $ope, $delimiter, $end_delimiter, $modifier;
10129             }
10130              
10131 8         76 # with /b /B modifier
10132             elsif ($modifier =~ tr/bB//d) {
10133             return e_s1_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
10134             }
10135              
10136 44         98 # without /b /B modifier
10137             else {
10138             return e_s1_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
10139             }
10140             }
10141              
10142             #
10143             # escape regexp (s'here'')
10144 44     44 0 98 #
10145             sub e_s1_qt {
10146 44 100       105 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
10147              
10148             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
10149 44         90  
10150             # split regexp
10151             my @char = $string =~ /\G((?>
10152             [^\x80-\xA0\xE0-\xFE\\\[\$\@\/] |
10153             [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
10154             \[\^ |
10155             \[\: (?>[a-z]+) \:\] |
10156             \[\:\^ (?>[a-z]+) \:\] |
10157             [\$\@\/] |
10158             \\ (?:$q_char) |
10159             (?:$q_char)
10160             ))/oxmsg;
10161 44         502  
10162 44 50 100     123 # unescape character
    50 100        
    50 66        
    50          
    100          
    100          
    50          
10163             for (my $i=0; $i <= $#char; $i++) {
10164             if (0) {
10165             }
10166 62         650  
10167 0         0 # escape last octet of multiple-octet
10168             elsif ($char[$i] =~ /\A ([\x80-\xFF].*) ([\\|\[\{\^]|\Q$delimiter\E|\Q$end_delimiter\E) \z/xms) {
10169             $char[$i] = $1 . '\\' . $2;
10170             }
10171              
10172 0         0 # open character class [...]
10173 0 0       0 elsif ($char[$i] eq '[') {
10174 0         0 my $left = $i;
10175             if ($char[$i+1] eq ']') {
10176 0         0 $i++;
10177 0 0       0 }
10178 0         0 while (1) {
10179             if (++$i > $#char) {
10180 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
10181 0         0 }
10182             if ($char[$i] eq ']') {
10183             my $right = $i;
10184 0         0  
10185             # [...]
10186 0         0 splice @char, $left, $right-$left+1, Ehp15::charlist_qr(@char[$left+1..$right-1], $modifier);
10187 0         0  
10188             $i = $left;
10189             last;
10190             }
10191             }
10192             }
10193              
10194 0         0 # open character class [^...]
10195 0 0       0 elsif ($char[$i] eq '[^') {
10196 0         0 my $left = $i;
10197             if ($char[$i+1] eq ']') {
10198 0         0 $i++;
10199 0 0       0 }
10200 0         0 while (1) {
10201             if (++$i > $#char) {
10202 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
10203 0         0 }
10204             if ($char[$i] eq ']') {
10205             my $right = $i;
10206 0         0  
10207             # [^...]
10208 0         0 splice @char, $left, $right-$left+1, Ehp15::charlist_not_qr(@char[$left+1..$right-1], $modifier);
10209 0         0  
10210             $i = $left;
10211             last;
10212             }
10213             }
10214             }
10215              
10216 0         0 # escape $ @ / and \
10217             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
10218             $char[$i] = '\\' . $char[$i];
10219             }
10220              
10221 0         0 # rewrite character class or escape character
10222             elsif (my $char = character_class($char[$i],$modifier)) {
10223             $char[$i] = $char;
10224             }
10225              
10226 6 50       15 # /i modifier
10227 8         15 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ehp15::uc($char[$i]) ne Ehp15::fc($char[$i]))) {
10228             if (CORE::length(Ehp15::fc($char[$i])) == 1) {
10229             $char[$i] = '[' . Ehp15::uc($char[$i]) . Ehp15::fc($char[$i]) . ']';
10230 8         18 }
10231             else {
10232             $char[$i] = '(?:' . Ehp15::uc($char[$i]) . '|' . Ehp15::fc($char[$i]) . ')';
10233             }
10234             }
10235              
10236 0 0       0 # quote character before ? + * {
10237             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
10238             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
10239 0         0 }
10240             else {
10241             $char[$i-1] = '(?:' . $char[$i-1] . ')';
10242             }
10243             }
10244 0         0 }
10245 44         79  
10246 44         65 $modifier =~ tr/i//d;
10247 44         48 $delimiter = '/';
10248 44         54 $end_delimiter = '/';
10249 44         84 my $prematch = '';
10250             $prematch = "($anchor)";
10251             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
10252             }
10253              
10254             #
10255             # escape regexp (s'here''b)
10256 44     44 0 302 #
10257             sub e_s1_qb {
10258             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
10259 44         115  
10260             # split regexp
10261             my @char = $string =~ /\G (?>[^\\]|\\\\|[\x00-\xFF]) /oxmsg;
10262 44         154  
10263 44 50       115 # unescape character
    50          
10264             for (my $i=0; $i <= $#char; $i++) {
10265             if (0) {
10266             }
10267 98         294  
10268             # remain \\
10269             elsif ($char[$i] eq '\\\\') {
10270             }
10271              
10272 0         0 # escape $ @ / and \
10273             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
10274             $char[$i] = '\\' . $char[$i];
10275             }
10276 0         0 }
10277 44         58  
10278 44         52 $delimiter = '/';
10279 44         110 $end_delimiter = '/';
10280 44         50 my $prematch = '';
10281             $prematch = q{(\G[\x00-\xFF]*?)};
10282             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
10283             }
10284              
10285             #
10286             # escape regexp (s''here')
10287 44     91 0 291 #
10288             sub e_s2_q {
10289 91         174 my($ope,$delimiter,$end_delimiter,$string) = @_;
10290              
10291 91         115 $slash = 'div';
10292 91         351  
10293 91 50 66     226 my @char = $string =~ / \G (?>[^\x80-\xA0\xE0-\xFE\\]|\\\\|$q_char) /oxmsg;
    50 33        
    100          
    100          
10294             for (my $i=0; $i <= $#char; $i++) {
10295             if (0) {
10296             }
10297 9         104  
10298 0         0 # escape last octet of multiple-octet
10299             elsif ($char[$i] =~ /\A ([\x80-\xFF].*) (\Q$delimiter\E|\Q$end_delimiter\E) \z/xms) {
10300             $char[$i] = $1 . '\\' . $2;
10301 0         0 }
10302             elsif (defined($char[$i+1]) and ($char[$i+1] eq '\\') and ($char[$i] =~ /\A ([\x80-\xFF].*) (\\) \z/xms)) {
10303             $char[$i] = $1 . '\\' . $2;
10304             }
10305              
10306             # not escape \\
10307             elsif ($char[$i] =~ /\A \\\\ \z/oxms) {
10308             }
10309              
10310 0         0 # escape $ @ / and \
10311             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
10312             $char[$i] = '\\' . $char[$i];
10313 5 50 66     20 }
10314 91         232 }
10315             if (defined($char[-1]) and ($char[-1] =~ /\A ([\x80-\xFF].*) (\\) \z/xms)) {
10316             $char[-1] = $1 . '\\' . $2;
10317 0         0 }
10318              
10319             return join '', $ope, $delimiter, @char, $end_delimiter;
10320             }
10321              
10322             #
10323             # escape regexp (s/here/and here/modifier)
10324 91     290 0 246 #
10325 290   100     2062 sub e_sub {
10326             my($variable,$delimiter1,$pattern,$end_delimiter1,$delimiter2,$replacement,$end_delimiter2,$modifier) = @_;
10327 290         1264 $modifier ||= '';
10328 290 50       712  
10329 290         1321 $modifier =~ tr/p//d;
10330 0         0 if ($modifier =~ /([adlu])/oxms) {
10331 0 0       0 my $line = 0;
10332 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
10333 0         0 if ($filename ne __FILE__) {
10334             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
10335             last;
10336 0         0 }
10337             }
10338             die qq{Unsupported modifier "$1" used at line $line.\n};
10339 0 100       0 }
10340 290         675  
10341 37         61 if ($variable eq '') {
10342             $variable = '$_';
10343             $bind_operator = ' =~ ';
10344 37         58 }
10345              
10346             $slash = 'div';
10347              
10348             # P.128 Start of match (or end of previous match): \G
10349             # P.130 Advanced Use of \G with Perl
10350             # in Chapter 3: Overview of Regular Expression Features and Flavors
10351             # P.312 Iterative Matching: Scalar Context, with /g
10352             # in Chapter 7: Perl
10353             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
10354              
10355             # P.181 Where You Left Off: The \G Assertion
10356             # in Chapter 5: Pattern Matching
10357             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
10358              
10359             # P.220 Where You Left Off: The \G Assertion
10360             # in Chapter 5: Pattern Matching
10361 290         447 # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
10362 290         408  
10363             my $e_modifier = $modifier =~ tr/e//d;
10364 290         425 my $r_modifier = $modifier =~ tr/r//d;
10365 290 50       475  
10366 290         642 my $my = '';
10367 0         0 if ($variable =~ s/\A \( (?>\s*) ( (?>(?: local \b | my \b | our \b | state \b )?) .+ ) \) \z/$1/oxms) {
10368 0         0 $my = $variable;
10369             $variable =~ s/ (?: local \b | my \b | our \b | state \b ) (?>\s*) //oxms;
10370             $variable =~ s/ = .+ \z//oxms;
10371 0         0 }
10372 290         902  
10373             (my $variable_basename = $variable) =~ s/ [\[\{].* \z//oxms;
10374             $variable_basename =~ s/ \s+ \z//oxms;
10375 290         507  
10376 290 100       423 # quote replacement string
10377 290         642 my $e_replacement = '';
10378 17         38 if ($e_modifier >= 1) {
10379             $e_replacement = e_qq('', '', '', $replacement);
10380             $e_modifier--;
10381 17 100       26 }
10382 273         524 else {
10383             if ($delimiter2 eq "'") {
10384             $e_replacement = e_s2_q('qq', '/', '/', $replacement);
10385 91         169 }
10386             else {
10387             $e_replacement = e_qq ('qq', $delimiter2, $end_delimiter2, $replacement);
10388             }
10389 182         441 }
10390              
10391             my $sub = '';
10392 290 100       484  
10393 290 100       631 # with /r
    50          
10394             if ($r_modifier) {
10395             if (0) {
10396             }
10397 8         21  
10398 0 50       0 # s///gr with multibyte anchoring
10399             elsif ($modifier =~ /g/oxms) {
10400             $sub = sprintf(
10401             # 1 2 3 4 5
10402             q,
10403              
10404             $variable, # 1
10405             ($delimiter1 eq "'") ? # 2
10406             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
10407             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
10408             $s_matched, # 3
10409             $e_replacement, # 4
10410             '$Ehp15::re_r=CORE::eval $Ehp15::re_r; ' x $e_modifier, # 5
10411             );
10412             }
10413              
10414 4 0       16 # s///gr without multibyte anchoring
10415             elsif ($modifier =~ /g/oxms) {
10416             $sub = sprintf(
10417             # 1 2 3 4 5
10418             q,
10419              
10420             $variable, # 1
10421             ($delimiter1 eq "'") ? # 2
10422             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
10423             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
10424             $s_matched, # 3
10425             $e_replacement, # 4
10426             '$Ehp15::re_r=CORE::eval $Ehp15::re_r; ' x $e_modifier, # 5
10427             );
10428             }
10429              
10430             # s///r
10431 0         0 else {
10432 4         6  
10433             my $prematch = q{$`};
10434 4 50       5 $prematch = q{${1}};
10435              
10436             $sub = sprintf(
10437             # 1 2 3 4 5 6 7
10438             q<(%s =~ %s) ? CORE::eval{%s local $^W=0; local $Ehp15::re_r=%s; %s"%s$Ehp15::re_r$'" } : %s>,
10439              
10440             $variable, # 1
10441             ($delimiter1 eq "'") ? # 2
10442             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
10443             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
10444             $s_matched, # 3
10445             $e_replacement, # 4
10446             '$Ehp15::re_r=CORE::eval $Ehp15::re_r; ' x $e_modifier, # 5
10447             $prematch, # 6
10448             $variable, # 7
10449             );
10450             }
10451 4 50       14  
10452 8         24 # $var !~ s///r doesn't make sense
10453             if ($bind_operator =~ / !~ /oxms) {
10454             $sub = q{die("$0: Using !~ with s///r doesn't make sense"), } . $sub;
10455             }
10456             }
10457              
10458 0 100       0 # without /r
    50          
10459             else {
10460             if (0) {
10461             }
10462 282         850  
10463 0 100       0 # s///g with multibyte anchoring
    100          
10464             elsif ($modifier =~ /g/oxms) {
10465             $sub = sprintf(
10466             # 1 2 3 4 5 6 7 8 9 10
10467             q,
10468              
10469             $variable, # 1
10470             ($delimiter1 eq "'") ? # 2
10471             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
10472             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
10473             $s_matched, # 3
10474             $e_replacement, # 4
10475             '$Ehp15::re_r=CORE::eval $Ehp15::re_r; ' x $e_modifier, # 5
10476             $variable, # 6
10477             $variable, # 7
10478             $variable, # 8
10479             $variable, # 9
10480              
10481             # Binary "!~" is just like "=~" except the return value is negated in the logical sense.
10482             # It returns false if the match succeeds, and true if it fails.
10483             # (and so on)
10484              
10485             ($bind_operator =~ / !~ /oxms) ? '!' : '', # 10
10486             );
10487             }
10488              
10489 35 0       154 # s///g without multibyte anchoring
    0          
10490             elsif ($modifier =~ /g/oxms) {
10491             $sub = sprintf(
10492             # 1 2 3 4 5 6 7 8
10493             q,
10494              
10495             $variable, # 1
10496             ($delimiter1 eq "'") ? # 2
10497             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
10498             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
10499             $s_matched, # 3
10500             $e_replacement, # 4
10501             '$Ehp15::re_r=CORE::eval $Ehp15::re_r; ' x $e_modifier, # 5
10502             $variable, # 6
10503             $variable, # 7
10504             ($bind_operator =~ / !~ /oxms) ? '!' : '', # 8
10505             );
10506             }
10507              
10508             # s///
10509 0         0 else {
10510 247         450  
10511             my $prematch = q{$`};
10512 247 100       325 $prematch = q{${1}};
    100          
10513              
10514             $sub = sprintf(
10515              
10516             ($bind_operator =~ / =~ /oxms) ?
10517              
10518             # 1 2 3 4 5 6 7 8
10519             q<(%s%s%s) ? CORE::eval{%s local $^W=0; local $Ehp15::re_r=%s; %s%s="%s$Ehp15::re_r$'"; 1 } : undef> :
10520              
10521             # 1 2 3 4 5 6 7 8
10522             q<(%s%s%s) ? 1 : CORE::eval{%s local $^W=0; local $Ehp15::re_r=%s; %s%s="%s$Ehp15::re_r$'"; undef }>,
10523              
10524             $variable, # 1
10525             $bind_operator, # 2
10526             ($delimiter1 eq "'") ? # 3
10527             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
10528             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
10529             $s_matched, # 4
10530             $e_replacement, # 5
10531             '$Ehp15::re_r=CORE::eval $Ehp15::re_r; ' x $e_modifier, # 6
10532             $variable, # 7
10533             $prematch, # 8
10534             );
10535             }
10536             }
10537 247 50       1148  
10538 290         774 # (my $foo = $bar) =~ s/// --> (my $foo = $bar, CORE::eval { ... })[1]
10539             if ($my ne '') {
10540             $sub = "($my, $sub)[1]";
10541             }
10542 0         0  
10543 290         405 # clear s/// variable
10544             $sub_variable = '';
10545 290         378 $bind_operator = '';
10546              
10547             return $sub;
10548             }
10549              
10550             #
10551             # escape chdir (qq//, "")
10552 290     0 0 2309 #
10553             sub e_chdir {
10554 0 0       0 my($ope,$delimiter,$end_delimiter,$string) = @_;
10555 0 0       0  
10556 0 0       0 if ($^W) {
10557 0         0 if (Ehp15::_MSWin32_5Cended_path($string)) {
10558 0         0 if ($] !~ /^5\.005/oxms) {
10559             warn <
10560             @{[__FILE__]}: Can't chdir to '$string'
10561              
10562             chdir does not work with chr(0x5C) at end of path
10563             http://bugs.activestate.com/show_bug.cgi?id=81839
10564             END
10565             }
10566             }
10567 0         0 }
10568              
10569             return e_qq($ope,$delimiter,$end_delimiter,$string);
10570             }
10571              
10572             #
10573             # escape chdir (q//, '')
10574 0     2 0 0 #
10575             sub e_chdir_q {
10576 2 50       5 my($ope,$delimiter,$end_delimiter,$string) = @_;
10577 2 0       7  
10578 0 0       0 if ($^W) {
10579 0         0 if (Ehp15::_MSWin32_5Cended_path($string)) {
10580 0         0 if ($] !~ /^5\.005/oxms) {
10581             warn <
10582             @{[__FILE__]}: Can't chdir to '$string'
10583              
10584             chdir does not work with chr(0x5C) at end of path
10585             http://bugs.activestate.com/show_bug.cgi?id=81839
10586             END
10587             }
10588             }
10589 0         0 }
10590              
10591             return e_q($ope,$delimiter,$end_delimiter,$string);
10592             }
10593              
10594             #
10595             # escape regexp of split qr//
10596 2     273 0 12 #
10597 273   100     1182 sub e_split {
10598             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
10599 273         1106 $modifier ||= '';
10600 273 50       461  
10601 273         680 $modifier =~ tr/p//d;
10602 0         0 if ($modifier =~ /([adlu])/oxms) {
10603 0 0       0 my $line = 0;
10604 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
10605 0         0 if ($filename ne __FILE__) {
10606             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
10607             last;
10608 0         0 }
10609             }
10610             die qq{Unsupported modifier "$1" used at line $line.\n};
10611 0         0 }
10612              
10613             $slash = 'div';
10614 273 100       435  
10615 273         562 # /b /B modifier
10616             if ($modifier =~ tr/bB//d) {
10617             return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
10618 84 100       371 }
10619 189         533  
10620             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
10621             my $metachar = qr/[\@\\|[\]{^]/oxms;
10622 189         626  
10623             # split regexp
10624             my @char = $string =~ /\G((?>
10625             [^\x80-\xA0\xE0-\xFE\\\$\@\[\(]|[\x80-\xA0\xE0-\xFE][\x00-\xFF] |
10626             \\x (?>[0-9A-Fa-f]{1,2}) |
10627             \\ (?>[0-7]{2,3}) |
10628             \\c [\x40-\x5F] |
10629             \\x\{ (?>[0-9A-Fa-f]+) \} |
10630             \\o\{ (?>[0-7]+) \} |
10631             \\[bBNpP]\{ (?>[^\x80-\xA0\xE0-\xFE0-9\}][^\x80-\xA0\xE0-\xFE\}]*) \} |
10632             \\ $q_char |
10633             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
10634             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
10635             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
10636             [\$\@] $qq_variable |
10637             \$ (?>\s* [0-9]+) |
10638             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
10639             \$ \$ (?![\w\{]) |
10640             \$ (?>\s*) \$ (?>\s*) $qq_variable |
10641             \[\^ |
10642             \[\: (?>[a-z]+) :\] |
10643             \[\:\^ (?>[a-z]+) :\] |
10644             \(\? |
10645             $q_char
10646 189         16830 ))/oxmsg;
10647 189         533  
10648 189         281 my $left_e = 0;
10649             my $right_e = 0;
10650             for (my $i=0; $i <= $#char; $i++) {
10651 189 50 33     606  
    50 33        
    100          
    100          
    50          
    50          
10652 372         2504 # "\L\u" --> "\u\L"
10653             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
10654             @char[$i,$i+1] = @char[$i+1,$i];
10655             }
10656              
10657 0         0 # "\U\l" --> "\l\U"
10658             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
10659             @char[$i,$i+1] = @char[$i+1,$i];
10660             }
10661              
10662 0         0 # octal escape sequence
10663             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
10664             $char[$i] = Ehp15::octchr($1);
10665             }
10666              
10667 1         4 # hexadecimal escape sequence
10668             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
10669             $char[$i] = Ehp15::hexchr($1);
10670             }
10671              
10672             # \b{...} --> b\{...}
10673             # \B{...} --> B\{...}
10674             # \N{CHARNAME} --> N\{CHARNAME}
10675             # \p{PROPERTY} --> p\{PROPERTY}
10676 1         3 # \P{PROPERTY} --> P\{PROPERTY}
10677             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x80-\xA0\xE0-\xFE0-9\}][^\x80-\xA0\xE0-\xFE\}]*) \} ) \z/oxms) {
10678             $char[$i] = $1 . '\\' . $2;
10679             }
10680              
10681 0         0 # \p, \P, \X --> p, P, X
10682             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
10683             $char[$i] = $1;
10684 0 50 100     0 }
    50 100        
    100 66        
    100 100        
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
    100          
    100          
10685              
10686             if (0) {
10687             }
10688 372         3376  
10689 0         0 # escape last octet of multiple-octet
10690             elsif ($char[$i] =~ /\A \\? ([\x80-\xFF].*) ($metachar|\Q$delimiter\E|\Q$end_delimiter\E) \z/xms) {
10691             $char[$i] = $1 . '\\' . $2;
10692             }
10693              
10694 0 0 0     0 # join separated multiple-octet
    0 0        
    0 0        
      0        
      0        
      0        
10695 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
10696             if ( ($i+3 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+3]) == 3) and (CORE::eval(sprintf '"%s%s%s%s"', @char[$i..$i+3]) =~ /\A $q_char \z/oxms)) {
10697             $char[$i] .= join '', splice @char, $i+1, 3;
10698 0         0 }
10699             elsif (($i+2 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, @char[$i+1..$i+2]) == 2) and (CORE::eval(sprintf '"%s%s%s"', @char[$i..$i+2]) =~ /\A $q_char \z/oxms)) {
10700             $char[$i] .= join '', splice @char, $i+1, 2;
10701 0         0 }
10702             elsif (($i+1 <= $#char) and (grep(/\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms, $char[$i+1 ]) == 1) and (CORE::eval(sprintf '"%s%s"', @char[$i..$i+1]) =~ /\A $q_char \z/oxms)) {
10703             $char[$i] .= join '', splice @char, $i+1, 1;
10704             }
10705             }
10706              
10707 0         0 # open character class [...]
10708 3 50       9 elsif ($char[$i] eq '[') {
10709 3         9 my $left = $i;
10710             if ($char[$i+1] eq ']') {
10711 0         0 $i++;
10712 3 50       4 }
10713 7         31 while (1) {
10714             if (++$i > $#char) {
10715 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
10716 7         12 }
10717             if ($char[$i] eq ']') {
10718             my $right = $i;
10719 3 50       5  
10720 3         19 # [...]
  0         0  
10721             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
10722             splice @char, $left, $right-$left+1, sprintf(q{@{[Ehp15::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
10723 0         0 }
10724             else {
10725             splice @char, $left, $right-$left+1, Ehp15::charlist_qr(@char[$left+1..$right-1], $modifier);
10726 3         16 }
10727 3         8  
10728             $i = $left;
10729             last;
10730             }
10731             }
10732             }
10733              
10734 3         9 # open character class [^...]
10735 1 50       2 elsif ($char[$i] eq '[^') {
10736 1         5 my $left = $i;
10737             if ($char[$i+1] eq ']') {
10738 0         0 $i++;
10739 1 50       1 }
10740 2         5 while (1) {
10741             if (++$i > $#char) {
10742 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
10743 2         5 }
10744             if ($char[$i] eq ']') {
10745             my $right = $i;
10746 1 50       2  
10747 1         7 # [^...]
  0         0  
10748             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
10749             splice @char, $left, $right-$left+1, sprintf(q{@{[Ehp15::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
10750 0         0 }
10751             else {
10752             splice @char, $left, $right-$left+1, Ehp15::charlist_not_qr(@char[$left+1..$right-1], $modifier);
10753 1         19 }
10754 1         2  
10755             $i = $left;
10756             last;
10757             }
10758             }
10759             }
10760              
10761 1         3 # rewrite character class or escape character
10762             elsif (my $char = character_class($char[$i],$modifier)) {
10763             $char[$i] = $char;
10764             }
10765              
10766             # P.794 29.2.161. split
10767             # in Chapter 29: Functions
10768             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
10769              
10770             # P.951 split
10771             # in Chapter 27: Functions
10772             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
10773              
10774             # said "The //m modifier is assumed when you split on the pattern /^/",
10775             # but perl5.008 is not so. Therefore, this software adds //m.
10776             # (and so on)
10777              
10778 5         20 # split(m/^/) --> split(m/^/m)
10779             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
10780             $modifier .= 'm';
10781             }
10782              
10783 11 50       40 # /i modifier
10784 18         39 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ehp15::uc($char[$i]) ne Ehp15::fc($char[$i]))) {
10785             if (CORE::length(Ehp15::fc($char[$i])) == 1) {
10786             $char[$i] = '[' . Ehp15::uc($char[$i]) . Ehp15::fc($char[$i]) . ']';
10787 18         39 }
10788             else {
10789             $char[$i] = '(?:' . Ehp15::uc($char[$i]) . '|' . Ehp15::fc($char[$i]) . ')';
10790             }
10791             }
10792              
10793 0 50       0 # \u \l \U \L \F \Q \E
10794 2         7 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
10795             if ($right_e < $left_e) {
10796             $char[$i] = '\\' . $char[$i];
10797             }
10798 0         0 }
10799 0         0 elsif ($char[$i] eq '\u') {
10800             $char[$i] = '@{[Ehp15::ucfirst qq<';
10801             $left_e++;
10802 0         0 }
10803 0         0 elsif ($char[$i] eq '\l') {
10804             $char[$i] = '@{[Ehp15::lcfirst qq<';
10805             $left_e++;
10806 0         0 }
10807 0         0 elsif ($char[$i] eq '\U') {
10808             $char[$i] = '@{[Ehp15::uc qq<';
10809             $left_e++;
10810 0         0 }
10811 0         0 elsif ($char[$i] eq '\L') {
10812             $char[$i] = '@{[Ehp15::lc qq<';
10813             $left_e++;
10814 0         0 }
10815 0         0 elsif ($char[$i] eq '\F') {
10816             $char[$i] = '@{[Ehp15::fc qq<';
10817             $left_e++;
10818 0         0 }
10819 0         0 elsif ($char[$i] eq '\Q') {
10820             $char[$i] = '@{[CORE::quotemeta qq<';
10821             $left_e++;
10822 0 0       0 }
10823 0         0 elsif ($char[$i] eq '\E') {
10824 0         0 if ($right_e < $left_e) {
10825             $char[$i] = '>]}';
10826             $right_e++;
10827 0         0 }
10828             else {
10829             $char[$i] = '';
10830             }
10831 0         0 }
10832 0 0       0 elsif ($char[$i] eq '\Q') {
10833 0         0 while (1) {
10834             if (++$i > $#char) {
10835 0 0       0 last;
10836 0         0 }
10837             if ($char[$i] eq '\E') {
10838             last;
10839             }
10840             }
10841             }
10842             elsif ($char[$i] eq '\E') {
10843             }
10844              
10845 0 0       0 # $0 --> $0
10846 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
10847             if ($ignorecase) {
10848             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10849             }
10850 0 0       0 }
10851 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
10852             if ($ignorecase) {
10853             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10854             }
10855             }
10856              
10857             # $$ --> $$
10858             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
10859             }
10860              
10861             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
10862 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
10863 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
10864 0         0 $char[$i] = e_capture($1);
10865             if ($ignorecase) {
10866             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10867             }
10868 0         0 }
10869 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
10870 0         0 $char[$i] = e_capture($1);
10871             if ($ignorecase) {
10872             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10873             }
10874             }
10875              
10876 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
10877 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
10878 0         0 $char[$i] = e_capture($1.'->'.$2);
10879             if ($ignorecase) {
10880             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10881             }
10882             }
10883              
10884 0         0 # $$foo{ ... } --> $ $foo->{ ... }
10885 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
10886 0         0 $char[$i] = e_capture($1.'->'.$2);
10887             if ($ignorecase) {
10888             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10889             }
10890             }
10891              
10892 0         0 # $$foo
10893 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
10894 0         0 $char[$i] = e_capture($1);
10895             if ($ignorecase) {
10896             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10897             }
10898             }
10899              
10900 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Ehp15::PREMATCH()
10901 12         40 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
10902             if ($ignorecase) {
10903             $char[$i] = '@{[Ehp15::ignorecase(Ehp15::PREMATCH())]}';
10904 0         0 }
10905             else {
10906             $char[$i] = '@{[Ehp15::PREMATCH()]}';
10907             }
10908             }
10909              
10910 12 50       192 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Ehp15::MATCH()
10911 12         32 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
10912             if ($ignorecase) {
10913             $char[$i] = '@{[Ehp15::ignorecase(Ehp15::MATCH())]}';
10914 0         0 }
10915             else {
10916             $char[$i] = '@{[Ehp15::MATCH()]}';
10917             }
10918             }
10919              
10920 12 50       61 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Ehp15::POSTMATCH()
10921 9         25 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
10922             if ($ignorecase) {
10923             $char[$i] = '@{[Ehp15::ignorecase(Ehp15::POSTMATCH())]}';
10924 0         0 }
10925             else {
10926             $char[$i] = '@{[Ehp15::POSTMATCH()]}';
10927             }
10928             }
10929              
10930 9 0       44 # ${ foo }
10931 0         0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
10932             if ($ignorecase) {
10933             $char[$i] = '@{[Ehp15::ignorecase(' . $1 . ')]}';
10934             }
10935             }
10936              
10937 0         0 # ${ ... }
10938 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
10939 0         0 $char[$i] = e_capture($1);
10940             if ($ignorecase) {
10941             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10942             }
10943             }
10944              
10945 0         0 # $scalar or @array
10946 3 50       11 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
10947 3         15 $char[$i] = e_string($char[$i]);
10948             if ($ignorecase) {
10949             $char[$i] = '@{[Ehp15::ignorecase(' . $char[$i] . ')]}';
10950             }
10951             }
10952              
10953 0 100       0 # quote character before ? + * {
10954             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
10955             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
10956 7         125 }
10957             else {
10958             $char[$i-1] = '(?:' . $char[$i-1] . ')';
10959             }
10960             }
10961             }
10962 4         56  
10963 189 50       428 # make regexp string
10964 189         399 $modifier =~ tr/i//d;
10965             if ($left_e > $right_e) {
10966 0         0 return join '', 'Ehp15::split', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter, $modifier;
10967             }
10968             return join '', 'Ehp15::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
10969             }
10970              
10971             #
10972             # escape regexp of split qr''
10973 189     112 0 1576 #
10974 112   100     591 sub e_split_q {
10975             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
10976 112         335 $modifier ||= '';
10977 112 50       216  
10978 112         317 $modifier =~ tr/p//d;
10979 0         0 if ($modifier =~ /([adlu])/oxms) {
10980 0 0       0 my $line = 0;
10981 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
10982 0         0 if ($filename ne __FILE__) {
10983             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
10984             last;
10985 0         0 }
10986             }
10987             die qq{Unsupported modifier "$1" used at line $line.\n};
10988 0         0 }
10989              
10990             $slash = 'div';
10991 112 100       192  
10992 112         231 # /b /B modifier
10993             if ($modifier =~ tr/bB//d) {
10994             return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
10995 56 100       270 }
10996              
10997             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
10998 56         147  
10999             # split regexp
11000             my @char = $string =~ /\G((?>
11001             [^\x80-\xA0\xE0-\xFE\\\[] |
11002             [\x80-\xA0\xE0-\xFE][\x00-\xFF] |
11003             \[\^ |
11004             \[\: (?>[a-z]+) \:\] |
11005             \[\:\^ (?>[a-z]+) \:\] |
11006             \\ (?:$q_char) |
11007             (?:$q_char)
11008             ))/oxmsg;
11009 56         384  
11010 56 50 33     277 # unescape character
    50 100        
    50 66        
    50 33        
    50          
    100          
    50          
11011             for (my $i=0; $i <= $#char; $i++) {
11012             if (0) {
11013             }
11014 56         788  
11015 0         0 # escape last octet of multiple-octet
11016             elsif ($char[$i] =~ /\A ([\x80-\xFF].*) ([\\|\[\{\^]|\Q$delimiter\E|\Q$end_delimiter\E) \z/xms) {
11017             $char[$i] = $1 . '\\' . $2;
11018             }
11019              
11020 0         0 # open character class [...]
11021 0 0       0 elsif ($char[$i] eq '[') {
11022 0         0 my $left = $i;
11023             if ($char[$i+1] eq ']') {
11024 0         0 $i++;
11025 0 0       0 }
11026 0         0 while (1) {
11027             if (++$i > $#char) {
11028 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
11029 0         0 }
11030             if ($char[$i] eq ']') {
11031             my $right = $i;
11032 0         0  
11033             # [...]
11034 0         0 splice @char, $left, $right-$left+1, Ehp15::charlist_qr(@char[$left+1..$right-1], $modifier);
11035 0         0  
11036             $i = $left;
11037             last;
11038             }
11039             }
11040             }
11041              
11042 0         0 # open character class [^...]
11043 0 0       0 elsif ($char[$i] eq '[^') {
11044 0         0 my $left = $i;
11045             if ($char[$i+1] eq ']') {
11046 0         0 $i++;
11047 0 0       0 }
11048 0         0 while (1) {
11049             if (++$i > $#char) {
11050 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
11051 0         0 }
11052             if ($char[$i] eq ']') {
11053             my $right = $i;
11054 0         0  
11055             # [^...]
11056 0         0 splice @char, $left, $right-$left+1, Ehp15::charlist_not_qr(@char[$left+1..$right-1], $modifier);
11057 0         0  
11058             $i = $left;
11059             last;
11060             }
11061             }
11062             }
11063              
11064 0         0 # rewrite character class or escape character
11065             elsif (my $char = character_class($char[$i],$modifier)) {
11066             $char[$i] = $char;
11067             }
11068              
11069 0         0 # split(m/^/) --> split(m/^/m)
11070             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
11071             $modifier .= 'm';
11072             }
11073              
11074 0 50       0 # /i modifier
11075 12         30 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Ehp15::uc($char[$i]) ne Ehp15::fc($char[$i]))) {
11076             if (CORE::length(Ehp15::fc($char[$i])) == 1) {
11077             $char[$i] = '[' . Ehp15::uc($char[$i]) . Ehp15::fc($char[$i]) . ']';
11078 12         31 }
11079             else {
11080             $char[$i] = '(?:' . Ehp15::uc($char[$i]) . '|' . Ehp15::fc($char[$i]) . ')';
11081             }
11082             }
11083              
11084 0 0       0 # quote character before ? + * {
11085             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
11086             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
11087 0         0 }
11088             else {
11089             $char[$i-1] = '(?:' . $char[$i-1] . ')';
11090             }
11091             }
11092 0         0 }
11093 56         122  
11094             $modifier =~ tr/i//d;
11095             return join '', 'Ehp15::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
11096             }
11097              
11098             #
11099             # escape use without import
11100 56     0 0 429 #
11101             sub e_use_noimport {
11102 0           my($module) = @_;
11103              
11104 0           my $expr = _pathof($module);
11105 0            
11106             my $fh = gensym();
11107 0 0         for my $realfilename (_realfilename($expr)) {
11108 0            
11109 0           if (Ehp15::_open_r($fh, $realfilename)) {
11110 0 0         local $/ = undef; # slurp mode
11111             my $script = <$fh>;
11112 0 0         close($fh) or die __FILE__, ": Can't close file: $realfilename\n";
11113 0            
11114             if ($script =~ /^ (?>\s*) use (?>\s+) HP15 (?>\s*) ([^\x80-\xA0\xE0-\xFE;]*) ; (?>\s*) \n? $/oxms) {
11115 0           return qq;
11116             }
11117             last;
11118             }
11119 0           }
11120              
11121             return qq;
11122             }
11123              
11124             #
11125             # escape no without unimport
11126 0     0 0   #
11127             sub e_no_nounimport {
11128 0           my($module) = @_;
11129              
11130 0           my $expr = _pathof($module);
11131 0            
11132             my $fh = gensym();
11133 0 0         for my $realfilename (_realfilename($expr)) {
11134 0            
11135 0           if (Ehp15::_open_r($fh, $realfilename)) {
11136 0 0         local $/ = undef; # slurp mode
11137             my $script = <$fh>;
11138 0 0         close($fh) or die __FILE__, ": Can't close file: $realfilename\n";
11139 0            
11140             if ($script =~ /^ (?>\s*) use (?>\s+) HP15 (?>\s*) ([^\x80-\xA0\xE0-\xFE;]*) ; (?>\s*) \n? $/oxms) {
11141 0           return qq;
11142             }
11143             last;
11144             }
11145 0           }
11146              
11147             return qq;
11148             }
11149              
11150             #
11151             # escape use with import no parameter
11152 0     0 0   #
11153             sub e_use_noparam {
11154 0           my($module) = @_;
11155              
11156 0           my $expr = _pathof($module);
11157 0            
11158             my $fh = gensym();
11159 0 0         for my $realfilename (_realfilename($expr)) {
11160 0            
11161 0           if (Ehp15::_open_r($fh, $realfilename)) {
11162 0 0         local $/ = undef; # slurp mode
11163             my $script = <$fh>;
11164 0 0         close($fh) or die __FILE__, ": Can't close file: $realfilename\n";
11165              
11166             if ($script =~ /^ (?>\s*) use (?>\s+) HP15 (?>\s*) ([^\x80-\xA0\xE0-\xFE;]*) ; (?>\s*) \n? $/oxms) {
11167              
11168             # P.326 UNIVERSAL: The Ultimate Ancestor Class
11169             # in Chapter 12: Objects
11170             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
11171              
11172             # P.435 UNIVERSAL: The Ultimate Ancestor Class
11173             # in Chapter 12: Objects
11174             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
11175              
11176 0           # (and so on)
11177              
11178 0           return qq[BEGIN { Ehp15::require '$expr'; $module->import() if $module->can('import'); }];
11179             }
11180             last;
11181             }
11182 0           }
11183              
11184             return qq;
11185             }
11186              
11187             #
11188             # escape no with unimport no parameter
11189 0     0 0   #
11190             sub e_no_noparam {
11191 0           my($module) = @_;
11192              
11193 0           my $expr = _pathof($module);
11194 0            
11195             my $fh = gensym();
11196 0 0         for my $realfilename (_realfilename($expr)) {
11197 0            
11198 0           if (Ehp15::_open_r($fh, $realfilename)) {
11199 0 0         local $/ = undef; # slurp mode
11200             my $script = <$fh>;
11201 0 0         close($fh) or die __FILE__, ": Can't close file: $realfilename\n";
11202 0            
11203             if ($script =~ /^ (?>\s*) use (?>\s+) HP15 (?>\s*) ([^\x80-\xA0\xE0-\xFE;]*) ; (?>\s*) \n? $/oxms) {
11204 0           return qq[BEGIN { Ehp15::require '$expr'; $module->unimport() if $module->can('unimport'); }];
11205             }
11206             last;
11207             }
11208 0           }
11209              
11210             return qq;
11211             }
11212              
11213             #
11214             # escape use with import parameters
11215 0     0 0   #
11216             sub e_use {
11217 0           my($module,$list) = @_;
11218              
11219 0           my $expr = _pathof($module);
11220 0            
11221             my $fh = gensym();
11222 0 0         for my $realfilename (_realfilename($expr)) {
11223 0            
11224 0           if (Ehp15::_open_r($fh, $realfilename)) {
11225 0 0         local $/ = undef; # slurp mode
11226             my $script = <$fh>;
11227 0 0         close($fh) or die __FILE__, ": Can't close file: $realfilename\n";
11228 0            
11229             if ($script =~ /^ (?>\s*) use (?>\s+) HP15 (?>\s*) ([^\x80-\xA0\xE0-\xFE;]*) ; (?>\s*) \n? $/oxms) {
11230 0           return qq[BEGIN { Ehp15::require '$expr'; $module->import($list) if $module->can('import'); }];
11231             }
11232             last;
11233             }
11234 0           }
11235              
11236             return qq;
11237             }
11238              
11239             #
11240             # escape no with unimport parameters
11241 0     0 0   #
11242             sub e_no {
11243 0           my($module,$list) = @_;
11244              
11245 0           my $expr = _pathof($module);
11246 0            
11247             my $fh = gensym();
11248 0 0         for my $realfilename (_realfilename($expr)) {
11249 0            
11250 0           if (Ehp15::_open_r($fh, $realfilename)) {
11251 0 0         local $/ = undef; # slurp mode
11252             my $script = <$fh>;
11253 0 0         close($fh) or die __FILE__, ": Can't close file: $realfilename\n";
11254 0            
11255             if ($script =~ /^ (?>\s*) use (?>\s+) HP15 (?>\s*) ([^\x80-\xA0\xE0-\xFE;]*) ; (?>\s*) \n? $/oxms) {
11256 0           return qq[BEGIN { Ehp15::require '$expr'; $module->unimport($list) if $module->can('unimport'); }];
11257             }
11258             last;
11259             }
11260 0           }
11261              
11262             return qq;
11263             }
11264              
11265             #
11266             # file path of module
11267 0     0     #
11268             sub _pathof {
11269 0 0         my($expr) = @_;
11270 0            
11271             if ($^O eq 'MacOS') {
11272             $expr =~ s#::#:#g;
11273 0           }
11274             else {
11275 0 0         $expr =~ s#::#/#g;
11276             }
11277 0           $expr .= '.pm' if $expr !~ / \.pm \z/oxmsi;
11278              
11279             return $expr;
11280             }
11281              
11282             #
11283             # real file name of module
11284 0     0     #
11285             sub _realfilename {
11286 0 0         my($expr) = @_;
11287 0            
  0            
11288             if ($^O eq 'MacOS') {
11289             return map {"$_$expr"} @INC;
11290 0           }
  0            
11291             else {
11292             return map {"$_/$expr"} @INC;
11293             }
11294             }
11295              
11296             #
11297             # instead of Carp::carp
11298 0     0 0   #
11299 0           sub carp {
11300             my($package,$filename,$line) = caller(1);
11301             print STDERR "@_ at $filename line $line.\n";
11302             }
11303              
11304             #
11305             # instead of Carp::croak
11306 0     0 0   #
11307 0           sub croak {
11308 0           my($package,$filename,$line) = caller(1);
11309             print STDERR "@_ at $filename line $line.\n";
11310             die "\n";
11311             }
11312              
11313             #
11314             # instead of Carp::cluck
11315 0     0 0   #
11316 0           sub cluck {
11317 0           my $i = 0;
11318 0           my @cluck = ();
11319 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
11320             push @cluck, "[$i] $filename($line) $package::$subroutine\n";
11321 0           $i++;
11322 0           }
11323 0           print STDERR CORE::reverse @cluck;
11324             print STDERR "\n";
11325             print STDERR @_;
11326             }
11327              
11328             #
11329             # instead of Carp::confess
11330 0     0 0   #
11331 0           sub confess {
11332 0           my $i = 0;
11333 0           my @confess = ();
11334 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
11335             push @confess, "[$i] $filename($line) $package::$subroutine\n";
11336 0           $i++;
11337 0           }
11338 0           print STDERR CORE::reverse @confess;
11339 0           print STDERR "\n";
11340             print STDERR @_;
11341             die "\n";
11342             }
11343              
11344             1;
11345              
11346             __END__