File Coverage

blib/lib/Eeuctw.pm
Criterion Covered Total %
statement 1072 3265 32.8
branch 1115 2802 39.7
condition 145 361 40.1
subroutine 57 113 50.4
pod 7 76 9.2
total 2396 6617 36.2


line stmt bran cond sub pod time code
1             package Eeuctw;
2 329     329   2202 use strict;
  329         526  
  329         11676  
3             ######################################################################
4             #
5             # Eeuctw - Run-time routines for EUCTW.pm
6             #
7             # http://search.cpan.org/dist/Char-EUCTW/
8             #
9             # Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2018, 2019 INABA Hitoshi
10             ######################################################################
11              
12 329     329   4496 use 5.00503; # Galapagos Consensus 1998 for primetools
  329         1016  
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 329     329   20772 use vars qw($VERSION);
  329         593  
  329         62637  
28             $VERSION = '1.13';
29             $VERSION = $VERSION;
30              
31             BEGIN {
32 329 50   329   2681 if ($^X =~ / jperl /oxmsi) {
33 0         0 die __FILE__, ": needs perl(not jperl) 5.00503 or later. (\$^X==$^X)\n";
34             }
35 329         550 if (CORE::ord('A') == 193) {
36             die __FILE__, ": is not US-ASCII script (may be EBCDIC or EBCDIK script).\n";
37             }
38 329         53113 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 329     329   23644 CORE::eval q{
  329     329   2721  
  329     92   646  
  329         38111  
  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 329 50       123256 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     0 0 0 my($name) = @_;
73              
74 0 0       0 if (ref $name) {
    0          
    0          
    0          
    0          
    0          
    0          
75 0         0 return $name;
76             }
77             elsif (Eeuctw::index($name,'::') >= 0) {
78 0         0 return $name;
79             }
80             elsif (Eeuctw::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 0         0 return (caller)[0] . '::' . $name;
107             }
108             }
109              
110             sub qualify_to_ref ($;$) {
111 0 0   0 0 0 if (defined $_[1]) {
112 329     329   2571 no strict qw(refs);
  329         627  
  329         27231  
113 0         0 return \*{ qualify $_[0], $_[1] };
  0         0  
114             }
115             else {
116 329     329   2247 no strict qw(refs);
  329     0   560  
  329         67468  
117 0         0 return \*{ qualify $_[0], (caller)[0] };
  0         0  
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{[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF]|[\x00-\xFF]};
148 329     329   2764 use vars qw($qq_char); $qq_char = qr/\\c[\x40-\x5F]|\\?(?:$your_char)/oxms;
  329         637  
  329         23312  
149 329     329   1904 use vars qw($q_char); $q_char = qr/$your_char/oxms;
  329         727  
  329         353439  
150              
151             #
152             # EUC-TW character range per length
153             #
154             my %range_tr = ();
155              
156             #
157             # EUC-TW 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 Eeuctw \z/oxms) {
173             %range_tr = (
174             1 => [ [0x00..0x8D],
175             [0x8F..0xA0],
176             [0xFF..0xFF],
177             ],
178             2 => [ [0xA1..0xFE],[0xA1..0xFE],
179             ],
180             4 => [ [0x8E..0x8E],[0xA1..0xB0],[0xA1..0xFE],[0xA1..0xFE],
181             ],
182             );
183             }
184              
185             else {
186             croak "Don't know my package name '@{[__PACKAGE__]}'";
187             }
188              
189             #
190             # @ARGV wildcard globbing
191             #
192             sub import {
193              
194 0 0   0   0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
195 0         0 my @argv = ();
196 0         0 for (@ARGV) {
197              
198             # has space
199 0 0       0 if (/\A (?:$q_char)*? [ ] /oxms) {
    0          
200 0 0       0 if (my @glob = Eeuctw::glob(qq{"$_"})) {
201 0         0 push @argv, @glob;
202             }
203             else {
204 0         0 push @argv, $_;
205             }
206             }
207              
208             # has wildcard metachar
209             elsif (/\A (?:$q_char)*? [*?] /oxms) {
210 0 0       0 if (my @glob = Eeuctw::glob($_)) {
211 0         0 push @argv, @glob;
212             }
213             else {
214 0         0 push @argv, $_;
215             }
216             }
217              
218             # no wildcard globbing
219             else {
220 0         0 push @argv, $_;
221             }
222             }
223 0         0 @ARGV = @argv;
224             }
225              
226 0         0 *Char::ord = \&EUCTW::ord;
227 0         0 *Char::ord_ = \&EUCTW::ord_;
228 0         0 *Char::reverse = \&EUCTW::reverse;
229 0         0 *Char::getc = \&EUCTW::getc;
230 0         0 *Char::length = \&EUCTW::length;
231 0         0 *Char::substr = \&EUCTW::substr;
232 0         0 *Char::index = \&EUCTW::index;
233 0         0 *Char::rindex = \&EUCTW::rindex;
234 0         0 *Char::eval = \&EUCTW::eval;
235 0         0 *Char::escape = \&EUCTW::escape;
236 0         0 *Char::escape_token = \&EUCTW::escape_token;
237 0         0 *Char::escape_script = \&EUCTW::escape_script;
238             }
239              
240             # P.230 Care with Prototypes
241             # in Chapter 6: Subroutines
242             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
243             #
244             # If you aren't careful, you can get yourself into trouble with prototypes.
245             # But if you are careful, you can do a lot of neat things with them. This is
246             # all very powerful, of course, and should only be used in moderation to make
247             # the world a better place.
248              
249             # P.332 Care with Prototypes
250             # in Chapter 7: Subroutines
251             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
252             #
253             # If you aren't careful, you can get yourself into trouble with prototypes.
254             # But if you are careful, you can do a lot of neat things with them. This is
255             # all very powerful, of course, and should only be used in moderation to make
256             # the world a better place.
257              
258             #
259             # Prototypes of subroutines
260             #
261       0     sub unimport {}
262             sub Eeuctw::split(;$$$);
263             sub Eeuctw::tr($$$$;$);
264             sub Eeuctw::chop(@);
265             sub Eeuctw::index($$;$);
266             sub Eeuctw::rindex($$;$);
267             sub Eeuctw::lcfirst(@);
268             sub Eeuctw::lcfirst_();
269             sub Eeuctw::lc(@);
270             sub Eeuctw::lc_();
271             sub Eeuctw::ucfirst(@);
272             sub Eeuctw::ucfirst_();
273             sub Eeuctw::uc(@);
274             sub Eeuctw::uc_();
275             sub Eeuctw::fc(@);
276             sub Eeuctw::fc_();
277             sub Eeuctw::ignorecase;
278             sub Eeuctw::classic_character_class;
279             sub Eeuctw::capture;
280             sub Eeuctw::chr(;$);
281             sub Eeuctw::chr_();
282             sub Eeuctw::glob($);
283             sub Eeuctw::glob_();
284              
285             sub EUCTW::ord(;$);
286             sub EUCTW::ord_();
287             sub EUCTW::reverse(@);
288             sub EUCTW::getc(;*@);
289             sub EUCTW::length(;$);
290             sub EUCTW::substr($$;$$);
291             sub EUCTW::index($$;$);
292             sub EUCTW::rindex($$;$);
293             sub EUCTW::escape(;$);
294              
295             #
296             # Regexp work
297             #
298 329         44275 use vars qw(
299             $re_a
300             $re_t
301             $re_n
302             $re_r
303 329     329   7623 );
  329         3663  
304              
305             #
306             # Character class
307             #
308 329         109605 use vars qw(
309             $dot
310             $dot_s
311             $eD
312             $eS
313             $eW
314             $eH
315             $eV
316             $eR
317             $eN
318             $not_alnum
319             $not_alpha
320             $not_ascii
321             $not_blank
322             $not_cntrl
323             $not_digit
324             $not_graph
325             $not_lower
326             $not_lower_i
327             $not_print
328             $not_punct
329             $not_space
330             $not_upper
331             $not_upper_i
332             $not_word
333             $not_xdigit
334             $eb
335             $eB
336 329     329   3619 );
  329         1935  
337              
338 329         4226945 use vars qw(
339             $anchor
340             $matched
341 329     329   2179 );
  329         799  
342             ${Eeuctw::anchor} = qr{\G(?>[^\x8E\xA1-\xFE]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])*?}oxms;
343              
344             # unless LONG_STRING_FOR_RE
345             if (1) {
346             }
347              
348             my $q_char_SADAHIRO_Tomoyuki_2002_01_17 = '';
349              
350             # Quantifiers
351             # {n,m} --- Match at least n but not more than m times
352             #
353             # n and m are limited to non-negative integral values less than a
354             # preset limit defined when perl is built. This is usually 32766 on
355             # the most common platforms.
356             #
357             # The following code is an attempt to solve the above limitations
358             # in a multi-byte anchoring.
359              
360             # avoid "Segmentation fault" and "Error: Parse exception"
361              
362             # perl5101delta
363             # http://perldoc.perl.org/perl5101delta.html
364             # In 5.10.0, the * quantifier in patterns was sometimes treated as {0,32767}
365             # [RT #60034, #60464]. For example, this match would fail:
366             # ("ab" x 32768) =~ /^(ab)*$/
367              
368             # SEE ALSO
369             #
370             # Complex regular subexpression recursion limit
371             # http://www.perlmonks.org/?node_id=810857
372             #
373             # regexp iteration limits
374             # http://www.nntp.perl.org/group/perl.perl5.porters/2009/02/msg144065.html
375             #
376             # latest Perl won't match certain regexes more than 32768 characters long
377             # http://stackoverflow.com/questions/26226630/latest-perl-wont-match-certain-regexes-more-than-32768-characters-long
378             #
379             # Break through the limitations of regular expressions of Perl
380             # http://d.hatena.ne.jp/gfx/20110212/1297512479
381              
382             if (($] >= 5.010001) or
383             # ActivePerl 5.6 or later (include 5.10.0)
384             (defined($ActivePerl::VERSION) and ($ActivePerl::VERSION > 800)) or
385             (($^O eq 'MSWin32') and ($] =~ /\A 5\.006/oxms))
386             ) {
387             my $sbcs = ''; # Single Byte Character Set
388             for my $range (@{ $range_tr{1} }) {
389             $sbcs .= sprintf('\\x%02X-\\x%02X', $range->[0], $range->[-1]);
390             }
391              
392             if (0) {
393             }
394              
395             # EUC-TW encoding
396             elsif (__PACKAGE__ =~ / \b Eeuctw \z/oxms) {
397             ${Eeuctw::q_char_SADAHIRO_Tomoyuki_2002_01_17} = qr{.*?[^\x8E\xA1-\xFE] (?> [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\xA1-\xFE] )*?}oxms;
398             # **************** octets not in multiple octet char (always char boundary)
399             # ********************** 2 octet chars
400             # ************************************* 4 octet chars
401             }
402              
403             # other encoding
404             else {
405             ${Eeuctw::q_char_SADAHIRO_Tomoyuki_2002_01_17} = qr{.*?[$sbcs](?:[^$sbcs][^$sbcs])*?}oxms;
406             # ******* octets not in multiple octet char (always char boundary)
407             # **************** 2 octet chars
408             }
409              
410             ${Eeuctw::anchor_SADAHIRO_Tomoyuki_2002_01_17} =
411             qr{\G(?(?=.{0,32766}\z)(?:[^\x8E\xA1-\xFE]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])*?|(?(?=[$sbcs]+\z).*?|(?:${Eeuctw::q_char_SADAHIRO_Tomoyuki_2002_01_17})))}oxms;
412             # qr{
413             # \G # (1), (2)
414             # (? # (3)
415             # (?=.{0,32766}\z) # (4)
416             # (?:[^\x8E\xA1-\xFE]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])*?| # (5)
417             # (?(?=[$sbcs]+\z) # (6)
418             # .*?| #(7)
419             # (?:${Eeuctw::q_char_SADAHIRO_Tomoyuki_2002_01_17}) # (8)
420             # ))}oxms;
421              
422             # avoid: Complex regular subexpression recursion limit (32766) exceeded at here.
423             local $^W = 0;
424              
425             if (((('A' x 32768).'B') !~ / ${Eeuctw::anchor} B /oxms) and
426             ((('A' x 32768).'B') =~ / ${Eeuctw::anchor_SADAHIRO_Tomoyuki_2002_01_17} B /oxms)
427             ) {
428             ${Eeuctw::anchor} = ${Eeuctw::anchor_SADAHIRO_Tomoyuki_2002_01_17};
429             }
430             else {
431             undef ${Eeuctw::q_char_SADAHIRO_Tomoyuki_2002_01_17};
432             }
433             }
434              
435             # (1)
436             # P.128 Start of match (or end of previous match): \G
437             # P.130 Advanced Use of \G with Perl
438             # in Chapter3: Over view of Regular Expression Features and Flavors
439             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
440              
441             # (2)
442             # P.255 Use leading anchors
443             # P.256 Expose ^ and \G at the front of expressions
444             # in Chapter6: Crafting an Efficient Expression
445             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
446              
447             # (3)
448             # P.138 Conditional: (? if then| else)
449             # in Chapter3: Over view of Regular Expression Features and Flavors
450             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
451              
452             # (4)
453             # perlre
454             # http://perldoc.perl.org/perlre.html
455             # The "*" quantifier is equivalent to {0,} , the "+" quantifier to {1,} ,
456             # and the "?" quantifier to {0,1}, ., n, and m are limited to non-negative
457             # integral values less than a preset limit defined when perl is built.
458             # This is usually 32766 on the most common platforms. The actual limit
459             # can be seen in the error message generated by code such as this:
460             # $_ **= $_ , / {$_} / for 2 .. 42;
461              
462             # (5)
463             # P.1023 Multiple-Byte Anchoring
464             # in Appendix W Perl Code Examples
465             # of ISBN 1-56592-224-7 CJKV Information Processing
466              
467             # (6)
468             # if string has only SBCS (Single Byte Character Set)
469              
470             # (7)
471             # then .*? (isn't limited to 32766)
472              
473             # (8)
474             # else EUC-TW::Regexp::Const (SADAHIRO Tomoyuki)
475             # http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#long
476             # http://search.cpan.org/~sadahiro/EUC-TW-Regexp/
477             # $PadA = ' (?:\A| [\x00-\x80\xA0-\xDF])(?:[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE]{2})*?';
478             # $PadG = '\G(?: |[\x00-\xFF]*?[\x00-\x80\xA0-\xDF])(?:[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE]{2})*?';
479             # $PadGA = '\G(?:\A|(?:[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE]{2})+?|[\x00-\xFF]*?[\x00-\x80\xA0-\xDF] (?:[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE]{2})*?)';
480              
481             ${Eeuctw::dot} = qr{(?>[^\x8E\xA1-\xFE\x0A]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
482             ${Eeuctw::dot_s} = qr{(?>[^\x8E\xA1-\xFE]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
483             ${Eeuctw::eD} = qr{(?>[^\x8E\xA1-\xFE0-9]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
484              
485             # Vertical tabs are now whitespace
486             # \s in a regex now matches a vertical tab in all circumstances.
487             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
488             # ${Eeuctw::eS} = qr{(?>[^\x8E\xA1-\xFE\x09\x0A \x0C\x0D\x20]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
489             # ${Eeuctw::eS} = qr{(?>[^\x8E\xA1-\xFE\x09\x0A\x0B\x0C\x0D\x20]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
490             ${Eeuctw::eS} = qr{(?>[^\x8E\xA1-\xFE\s]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
491              
492             ${Eeuctw::eW} = qr{(?>[^\x8E\xA1-\xFE0-9A-Z_a-z]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
493             ${Eeuctw::eH} = qr{(?>[^\x8E\xA1-\xFE\x09\x20]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
494             ${Eeuctw::eV} = qr{(?>[^\x8E\xA1-\xFE\x0A\x0B\x0C\x0D]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
495             ${Eeuctw::eR} = qr{(?>\x0D\x0A|[\x0A\x0D])};
496             ${Eeuctw::eN} = qr{(?>[^\x8E\xA1-\xFE\x0A]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
497             ${Eeuctw::not_alnum} = qr{(?>[^\x8E\xA1-\xFE\x30-\x39\x41-\x5A\x61-\x7A]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
498             ${Eeuctw::not_alpha} = qr{(?>[^\x8E\xA1-\xFE\x41-\x5A\x61-\x7A]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
499             ${Eeuctw::not_ascii} = qr{(?>[^\x8E\xA1-\xFE\x00-\x7F]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
500             ${Eeuctw::not_blank} = qr{(?>[^\x8E\xA1-\xFE\x09\x20]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
501             ${Eeuctw::not_cntrl} = qr{(?>[^\x8E\xA1-\xFE\x00-\x1F\x7F]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
502             ${Eeuctw::not_digit} = qr{(?>[^\x8E\xA1-\xFE\x30-\x39]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
503             ${Eeuctw::not_graph} = qr{(?>[^\x8E\xA1-\xFE\x21-\x7F]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
504             ${Eeuctw::not_lower} = qr{(?>[^\x8E\xA1-\xFE\x61-\x7A]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
505             ${Eeuctw::not_lower_i} = qr{(?>[^\x8E\xA1-\xFE\x41-\x5A\x61-\x7A]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])}; # Perl 5.16 compatible
506             # ${Eeuctw::not_lower_i} = qr{(?>[^\x8E\xA1-\xFE]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])}; # older Perl compatible
507             ${Eeuctw::not_print} = qr{(?>[^\x8E\xA1-\xFE\x20-\x7F]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
508             ${Eeuctw::not_punct} = qr{(?>[^\x8E\xA1-\xFE\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
509             ${Eeuctw::not_space} = qr{(?>[^\x8E\xA1-\xFE\s\x0B]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
510             ${Eeuctw::not_upper} = qr{(?>[^\x8E\xA1-\xFE\x41-\x5A]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
511             ${Eeuctw::not_upper_i} = qr{(?>[^\x8E\xA1-\xFE\x41-\x5A\x61-\x7A]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])}; # Perl 5.16 compatible
512             # ${Eeuctw::not_upper_i} = qr{(?>[^\x8E\xA1-\xFE]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])}; # older Perl compatible
513             ${Eeuctw::not_word} = qr{(?>[^\x8E\xA1-\xFE\x30-\x39\x41-\x5A\x5F\x61-\x7A]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
514             ${Eeuctw::not_xdigit} = qr{(?>[^\x8E\xA1-\xFE\x30-\x39\x41-\x46\x61-\x66]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])};
515             ${Eeuctw::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))};
516             ${Eeuctw::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]))};
517              
518             # avoid: Name "Eeuctw::foo" used only once: possible typo at here.
519             ${Eeuctw::dot} = ${Eeuctw::dot};
520             ${Eeuctw::dot_s} = ${Eeuctw::dot_s};
521             ${Eeuctw::eD} = ${Eeuctw::eD};
522             ${Eeuctw::eS} = ${Eeuctw::eS};
523             ${Eeuctw::eW} = ${Eeuctw::eW};
524             ${Eeuctw::eH} = ${Eeuctw::eH};
525             ${Eeuctw::eV} = ${Eeuctw::eV};
526             ${Eeuctw::eR} = ${Eeuctw::eR};
527             ${Eeuctw::eN} = ${Eeuctw::eN};
528             ${Eeuctw::not_alnum} = ${Eeuctw::not_alnum};
529             ${Eeuctw::not_alpha} = ${Eeuctw::not_alpha};
530             ${Eeuctw::not_ascii} = ${Eeuctw::not_ascii};
531             ${Eeuctw::not_blank} = ${Eeuctw::not_blank};
532             ${Eeuctw::not_cntrl} = ${Eeuctw::not_cntrl};
533             ${Eeuctw::not_digit} = ${Eeuctw::not_digit};
534             ${Eeuctw::not_graph} = ${Eeuctw::not_graph};
535             ${Eeuctw::not_lower} = ${Eeuctw::not_lower};
536             ${Eeuctw::not_lower_i} = ${Eeuctw::not_lower_i};
537             ${Eeuctw::not_print} = ${Eeuctw::not_print};
538             ${Eeuctw::not_punct} = ${Eeuctw::not_punct};
539             ${Eeuctw::not_space} = ${Eeuctw::not_space};
540             ${Eeuctw::not_upper} = ${Eeuctw::not_upper};
541             ${Eeuctw::not_upper_i} = ${Eeuctw::not_upper_i};
542             ${Eeuctw::not_word} = ${Eeuctw::not_word};
543             ${Eeuctw::not_xdigit} = ${Eeuctw::not_xdigit};
544             ${Eeuctw::eb} = ${Eeuctw::eb};
545             ${Eeuctw::eB} = ${Eeuctw::eB};
546              
547             #
548             # EUC-TW split
549             #
550             sub Eeuctw::split(;$$$) {
551              
552             # P.794 29.2.161. split
553             # in Chapter 29: Functions
554             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
555              
556             # P.951 split
557             # in Chapter 27: Functions
558             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
559              
560 0     0 0 0 my $pattern = $_[0];
561 0         0 my $string = $_[1];
562 0         0 my $limit = $_[2];
563              
564             # if $pattern is also omitted or is the literal space, " "
565 0 0       0 if (not defined $pattern) {
566 0         0 $pattern = ' ';
567             }
568              
569             # if $string is omitted, the function splits the $_ string
570 0 0       0 if (not defined $string) {
571 0 0       0 if (defined $_) {
572 0         0 $string = $_;
573             }
574             else {
575 0         0 $string = '';
576             }
577             }
578              
579 0         0 my @split = ();
580              
581             # when string is empty
582 0 0       0 if ($string eq '') {
    0          
583              
584             # resulting list value in list context
585 0 0       0 if (wantarray) {
586 0         0 return @split;
587             }
588              
589             # count of substrings in scalar context
590             else {
591 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
592 0         0 @_ = @split;
593 0         0 return scalar @_;
594             }
595             }
596              
597             # split's first argument is more consistently interpreted
598             #
599             # After some changes earlier in v5.17, split's behavior has been simplified:
600             # if the PATTERN argument evaluates to a string containing one space, it is
601             # treated the way that a literal string containing one space once was.
602             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#split's_first_argument_is_more_consistently_interpreted
603              
604             # if $pattern is also omitted or is the literal space, " ", the function splits
605             # on whitespace, /\s+/, after skipping any leading whitespace
606             # (and so on)
607              
608             elsif ($pattern eq ' ') {
609 0 0       0 if (not defined $limit) {
610 0         0 return CORE::split(' ', $string);
611             }
612             else {
613 0         0 return CORE::split(' ', $string, $limit);
614             }
615             }
616              
617 0         0 local $q_char = $q_char;
618 0 0       0 if (CORE::length($string) > 32766) {
619 0 0       0 if ($string =~ /\A [\x00-\x7F]+ \z/oxms) {
    0          
620 0         0 $q_char = qr{.}s;
621             }
622             elsif (defined ${Eeuctw::q_char_SADAHIRO_Tomoyuki_2002_01_17}) {
623 0         0 $q_char = ${Eeuctw::q_char_SADAHIRO_Tomoyuki_2002_01_17};
624             }
625             }
626              
627             # if $limit is negative, it is treated as if an arbitrarily large $limit has been specified
628 0 0 0     0 if ((not defined $limit) or ($limit <= 0)) {
    0          
629              
630             # a pattern capable of matching either the null string or something longer than the
631             # null string will split the value of $string into separate characters wherever it
632             # matches the null string between characters
633             # (and so on)
634              
635 0 0       0 if ('' =~ / \A $pattern \z /xms) {
636 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
637 0         0 my $limit = scalar(() = $string =~ /($pattern)/oxmsg);
638              
639             # P.1024 Appendix W.10 Multibyte Processing
640             # of ISBN 1-56592-224-7 CJKV Information Processing
641             # (and so on)
642              
643             # the //m modifier is assumed when you split on the pattern /^/
644             # (and so on)
645              
646             # V
647 0   0     0 while ((--$limit > 0) and ($string =~ s/\A((?:$q_char)+?)$pattern//m)) {
648              
649             # if the $pattern contains parentheses, then the substring matched by each pair of parentheses
650             # is included in the resulting list, interspersed with the fields that are ordinarily returned
651             # (and so on)
652              
653 0         0 local $@;
654 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
655 0         0 push @split, CORE::eval('$' . $digit);
656             }
657             }
658             }
659              
660             else {
661 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
662              
663             # V
664 0         0 while ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
665 0         0 local $@;
666 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
667 0         0 push @split, CORE::eval('$' . $digit);
668             }
669             }
670             }
671             }
672              
673             elsif ($limit > 0) {
674 0 0       0 if ('' =~ / \A $pattern \z /xms) {
675 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
676 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
677              
678             # V
679 0 0       0 if ($string =~ s/\A((?:$q_char)+?)$pattern//m) {
680 0         0 local $@;
681 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
682 0         0 push @split, CORE::eval('$' . $digit);
683             }
684             }
685             }
686             }
687             else {
688 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
689 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
690              
691             # V
692 0 0       0 if ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
693 0         0 local $@;
694 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
695 0         0 push @split, CORE::eval('$' . $digit);
696             }
697             }
698             }
699             }
700             }
701              
702 0 0       0 if (CORE::length($string) > 0) {
703 0         0 push @split, $string;
704             }
705              
706             # if $_[2] (NOT "$limit") is omitted or zero, trailing null fields are stripped from the result
707 0 0 0     0 if ((not defined $_[2]) or ($_[2] == 0)) {
708 0   0     0 while ((scalar(@split) >= 1) and ($split[-1] eq '')) {
709 0         0 pop @split;
710             }
711             }
712              
713             # resulting list value in list context
714 0 0       0 if (wantarray) {
715 0         0 return @split;
716             }
717              
718             # count of substrings in scalar context
719             else {
720 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
721 0         0 @_ = @split;
722 0         0 return scalar @_;
723             }
724             }
725              
726             #
727             # get last subexpression offsets
728             #
729             sub _last_subexpression_offsets {
730 0     0   0 my $pattern = $_[0];
731              
732             # remove comment
733 0         0 $pattern =~ s/\(\?\# .*? \)//oxmsg;
734              
735 0         0 my $modifier = '';
736 0 0       0 if ($pattern =~ /\(\?\^? ([\-A-Za-z]+) :/oxms) {
737 0         0 $modifier = $1;
738 0         0 $modifier =~ s/-[A-Za-z]*//;
739             }
740              
741             # with /x modifier
742 0         0 my @char = ();
743 0 0       0 if ($modifier =~ /x/oxms) {
744 0         0 @char = $pattern =~ /\G((?>
745             [^\x8E\xA1-\xFE\\\#\[\(]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
746             \\ $q_char |
747             \# (?>[^\n]*) $ |
748             \[ (?>(?:[^\x8E\xA1-\xFE\\\]]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF]|\\\\|\\\]|$q_char)+) \] |
749             \(\? |
750             $q_char
751             ))/oxmsg;
752             }
753              
754             # without /x modifier
755             else {
756 0         0 @char = $pattern =~ /\G((?>
757             [^\x8E\xA1-\xFE\\\[\(]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
758             \\ $q_char |
759             \[ (?>(?:[^\x8E\xA1-\xFE\\\]]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF]|\\\\|\\\]|$q_char)+) \] |
760             \(\? |
761             $q_char
762             ))/oxmsg;
763             }
764              
765 0         0 return scalar grep { $_ eq '(' } @char;
  0         0  
766             }
767              
768             #
769             # EUC-TW transliteration (tr///)
770             #
771             sub Eeuctw::tr($$$$;$) {
772              
773 0     0 0 0 my $bind_operator = $_[1];
774 0         0 my $searchlist = $_[2];
775 0         0 my $replacementlist = $_[3];
776 0   0     0 my $modifier = $_[4] || '';
777              
778 0 0       0 if ($modifier =~ /r/oxms) {
779 0 0       0 if ($bind_operator =~ / !~ /oxms) {
780 0         0 croak "Using !~ with tr///r doesn't make sense";
781             }
782             }
783              
784 0         0 my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
785 0         0 my @searchlist = _charlist_tr($searchlist);
786 0         0 my @replacementlist = _charlist_tr($replacementlist);
787              
788 0         0 my %tr = ();
789 0         0 for (my $i=0; $i <= $#searchlist; $i++) {
790 0 0       0 if (not exists $tr{$searchlist[$i]}) {
791 0 0 0     0 if (defined $replacementlist[$i] and ($replacementlist[$i] ne '')) {
    0 0        
    0          
792 0         0 $tr{$searchlist[$i]} = $replacementlist[$i];
793             }
794             elsif ($modifier =~ /d/oxms) {
795 0         0 $tr{$searchlist[$i]} = '';
796             }
797             elsif (defined $replacementlist[-1] and ($replacementlist[-1] ne '')) {
798 0         0 $tr{$searchlist[$i]} = $replacementlist[-1];
799             }
800             else {
801 0         0 $tr{$searchlist[$i]} = $searchlist[$i];
802             }
803             }
804             }
805              
806 0         0 my $tr = 0;
807 0         0 my $replaced = '';
808 0 0       0 if ($modifier =~ /c/oxms) {
809 0         0 while (defined(my $char = shift @char)) {
810 0 0       0 if (not exists $tr{$char}) {
811 0 0       0 if (defined $replacementlist[0]) {
812 0         0 $replaced .= $replacementlist[0];
813             }
814 0         0 $tr++;
815 0 0       0 if ($modifier =~ /s/oxms) {
816 0   0     0 while (@char and (not exists $tr{$char[0]})) {
817 0         0 shift @char;
818 0         0 $tr++;
819             }
820             }
821             }
822             else {
823 0         0 $replaced .= $char;
824             }
825             }
826             }
827             else {
828 0         0 while (defined(my $char = shift @char)) {
829 0 0       0 if (exists $tr{$char}) {
830 0         0 $replaced .= $tr{$char};
831 0         0 $tr++;
832 0 0       0 if ($modifier =~ /s/oxms) {
833 0   0     0 while (@char and (exists $tr{$char[0]}) and ($tr{$char[0]} eq $tr{$char})) {
      0        
834 0         0 shift @char;
835 0         0 $tr++;
836             }
837             }
838             }
839             else {
840 0         0 $replaced .= $char;
841             }
842             }
843             }
844              
845 0 0       0 if ($modifier =~ /r/oxms) {
846 0         0 return $replaced;
847             }
848             else {
849 0         0 $_[0] = $replaced;
850 0 0       0 if ($bind_operator =~ / !~ /oxms) {
851 0         0 return not $tr;
852             }
853             else {
854 0         0 return $tr;
855             }
856             }
857             }
858              
859             #
860             # EUC-TW chop
861             #
862             sub Eeuctw::chop(@) {
863              
864 0     0 0 0 my $chop;
865 0 0       0 if (@_ == 0) {
866 0         0 my @char = /\G (?>$q_char) /oxmsg;
867 0         0 $chop = pop @char;
868 0         0 $_ = join '', @char;
869             }
870             else {
871 0         0 for (@_) {
872 0         0 my @char = /\G (?>$q_char) /oxmsg;
873 0         0 $chop = pop @char;
874 0         0 $_ = join '', @char;
875             }
876             }
877 0         0 return $chop;
878             }
879              
880             #
881             # EUC-TW index by octet
882             #
883             sub Eeuctw::index($$;$) {
884              
885 0     0 1 0 my($str,$substr,$position) = @_;
886 0   0     0 $position ||= 0;
887 0         0 my $pos = 0;
888              
889 0         0 while ($pos < CORE::length($str)) {
890 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
891 0 0       0 if ($pos >= $position) {
892 0         0 return $pos;
893             }
894             }
895 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
896 0         0 $pos += CORE::length($1);
897             }
898             else {
899 0         0 $pos += 1;
900             }
901             }
902 0         0 return -1;
903             }
904              
905             #
906             # EUC-TW reverse index
907             #
908             sub Eeuctw::rindex($$;$) {
909              
910 0     0 0 0 my($str,$substr,$position) = @_;
911 0   0     0 $position ||= CORE::length($str) - 1;
912 0         0 my $pos = 0;
913 0         0 my $rindex = -1;
914              
915 0   0     0 while (($pos < CORE::length($str)) and ($pos <= $position)) {
916 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
917 0         0 $rindex = $pos;
918             }
919 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
920 0         0 $pos += CORE::length($1);
921             }
922             else {
923 0         0 $pos += 1;
924             }
925             }
926 0         0 return $rindex;
927             }
928              
929             #
930             # EUC-TW lower case first with parameter
931             #
932             sub Eeuctw::lcfirst(@) {
933 0 0   0 0 0 if (@_) {
934 0         0 my $s = shift @_;
935 0 0 0     0 if (@_ and wantarray) {
936 0         0 return Eeuctw::lc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
937             }
938             else {
939 0         0 return Eeuctw::lc(CORE::substr($s,0,1)) . CORE::substr($s,1);
940             }
941             }
942             else {
943 0         0 return Eeuctw::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
944             }
945             }
946              
947             #
948             # EUC-TW lower case first without parameter
949             #
950             sub Eeuctw::lcfirst_() {
951 0     0 0 0 return Eeuctw::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
952             }
953              
954             #
955             # EUC-TW lower case with parameter
956             #
957             sub Eeuctw::lc(@) {
958 0 0   0 0 0 if (@_) {
959 0         0 my $s = shift @_;
960 0 0 0     0 if (@_ and wantarray) {
961 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
962             }
963             else {
964 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  0         0  
965             }
966             }
967             else {
968 0         0 return Eeuctw::lc_();
969             }
970             }
971              
972             #
973             # EUC-TW lower case without parameter
974             #
975             sub Eeuctw::lc_() {
976 0     0 0 0 my $s = $_;
977 0 0       0 return join '', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
978             }
979              
980             #
981             # EUC-TW upper case first with parameter
982             #
983             sub Eeuctw::ucfirst(@) {
984 0 0   0 0 0 if (@_) {
985 0         0 my $s = shift @_;
986 0 0 0     0 if (@_ and wantarray) {
987 0         0 return Eeuctw::uc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
988             }
989             else {
990 0         0 return Eeuctw::uc(CORE::substr($s,0,1)) . CORE::substr($s,1);
991             }
992             }
993             else {
994 0         0 return Eeuctw::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
995             }
996             }
997              
998             #
999             # EUC-TW upper case first without parameter
1000             #
1001             sub Eeuctw::ucfirst_() {
1002 0     0 0 0 return Eeuctw::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
1003             }
1004              
1005             #
1006             # EUC-TW upper case with parameter
1007             #
1008             sub Eeuctw::uc(@) {
1009 0 50   2790 0 0 if (@_) {
1010 2790         5074 my $s = shift @_;
1011 2790 50 33     3678 if (@_ and wantarray) {
1012 2790 0       5471 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
1013             }
1014             else {
1015 0 100       0 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  2790         8755  
1016             }
1017             }
1018             else {
1019 2790         13586 return Eeuctw::uc_();
1020             }
1021             }
1022              
1023             #
1024             # EUC-TW upper case without parameter
1025             #
1026             sub Eeuctw::uc_() {
1027 0     0 0 0 my $s = $_;
1028 0 0       0 return join '', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
1029             }
1030              
1031             #
1032             # EUC-TW fold case with parameter
1033             #
1034             sub Eeuctw::fc(@) {
1035 0 50   2865 0 0 if (@_) {
1036 2865         3725 my $s = shift @_;
1037 2865 50 33     3657 if (@_ and wantarray) {
1038 2865 0       5793 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
1039             }
1040             else {
1041 0 100       0 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  2865         7350  
1042             }
1043             }
1044             else {
1045 2865         10366 return Eeuctw::fc_();
1046             }
1047             }
1048              
1049             #
1050             # EUC-TW fold case without parameter
1051             #
1052             sub Eeuctw::fc_() {
1053 0     0 0 0 my $s = $_;
1054 0 0       0 return join '', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
1055             }
1056              
1057             #
1058             # EUC-TW regexp capture
1059             #
1060             {
1061             # 10.3. Creating Persistent Private Variables
1062             # in Chapter 10. Subroutines
1063             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
1064              
1065             my $last_s_matched = 0;
1066              
1067             sub Eeuctw::capture {
1068 0 0 0 0 1 0 if ($last_s_matched and ($_[0] =~ /\A (?>[1-9][0-9]*) \z/oxms)) {
1069 0         0 return $_[0] + 1;
1070             }
1071 0         0 return $_[0];
1072             }
1073              
1074             # EUC-TW mark last regexp matched
1075             sub Eeuctw::matched() {
1076 0     0 0 0 $last_s_matched = 0;
1077             }
1078              
1079             # EUC-TW mark last s/// matched
1080             sub Eeuctw::s_matched() {
1081 0     0 0 0 $last_s_matched = 1;
1082             }
1083              
1084             # P.854 31.17. use re
1085             # in Chapter 31. Pragmatic Modules
1086             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1087              
1088             # P.1026 re
1089             # in Chapter 29. Pragmatic Modules
1090             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1091              
1092             $Eeuctw::matched = qr/(?{Eeuctw::matched})/;
1093             }
1094              
1095             #
1096             # EUC-TW regexp ignore case modifier
1097             #
1098             sub Eeuctw::ignorecase {
1099              
1100 0     0 0 0 my @string = @_;
1101 0         0 my $metachar = qr/[\@\\|[\]{]/oxms;
1102              
1103             # ignore case of $scalar or @array
1104 0         0 for my $string (@string) {
1105              
1106             # split regexp
1107 0         0 my @char = $string =~ /\G (?>\[\^|\\$q_char|$q_char) /oxmsg;
1108              
1109             # unescape character
1110 0         0 for (my $i=0; $i <= $#char; $i++) {
1111 0 0       0 next if not defined $char[$i];
1112              
1113             # open character class [...]
1114 0 0       0 if ($char[$i] eq '[') {
    0          
    0          
    0          
1115 0         0 my $left = $i;
1116              
1117             # [] make die "unmatched [] in regexp ...\n"
1118              
1119 0 0       0 if ($char[$i+1] eq ']') {
1120 0         0 $i++;
1121             }
1122              
1123 0         0 while (1) {
1124 0 0       0 if (++$i > $#char) {
1125 0         0 croak "Unmatched [] in regexp";
1126             }
1127 0 0       0 if ($char[$i] eq ']') {
1128 0         0 my $right = $i;
1129 0         0 my @charlist = charlist_qr(@char[$left+1..$right-1], 'i');
1130              
1131             # escape character
1132 0         0 for my $char (@charlist) {
1133 0 0       0 if (0) {
1134             }
1135              
1136 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
1137 0         0 $char = '\\' . $char;
1138             }
1139             }
1140              
1141             # [...]
1142 0         0 splice @char, $left, $right-$left+1, '(?:' . join('|', @charlist) . ')';
1143              
1144 0         0 $i = $left;
1145 0         0 last;
1146             }
1147             }
1148             }
1149              
1150             # open character class [^...]
1151             elsif ($char[$i] eq '[^') {
1152 0         0 my $left = $i;
1153              
1154             # [^] make die "unmatched [] in regexp ...\n"
1155              
1156 0 0       0 if ($char[$i+1] eq ']') {
1157 0         0 $i++;
1158             }
1159              
1160 0         0 while (1) {
1161 0 0       0 if (++$i > $#char) {
1162 0         0 croak "Unmatched [] in regexp";
1163             }
1164 0 0       0 if ($char[$i] eq ']') {
1165 0         0 my $right = $i;
1166 0         0 my @charlist = charlist_not_qr(@char[$left+1..$right-1], 'i');
1167              
1168             # escape character
1169 0         0 for my $char (@charlist) {
1170 0 0       0 if (0) {
1171             }
1172              
1173 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
1174 0         0 $char = '\\' . $char;
1175             }
1176             }
1177              
1178             # [^...]
1179 0         0 splice @char, $left, $right-$left+1, '(?!' . join('|', @charlist) . ")(?:$your_char)";
1180              
1181 0         0 $i = $left;
1182 0         0 last;
1183             }
1184             }
1185             }
1186              
1187             # rewrite classic character class or escape character
1188             elsif (my $char = classic_character_class($char[$i])) {
1189 0         0 $char[$i] = $char;
1190             }
1191              
1192             # with /i modifier
1193             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
1194 0         0 my $uc = Eeuctw::uc($char[$i]);
1195 0         0 my $fc = Eeuctw::fc($char[$i]);
1196 0 0       0 if ($uc ne $fc) {
1197 0 0       0 if (CORE::length($fc) == 1) {
1198 0         0 $char[$i] = '[' . $uc . $fc . ']';
1199             }
1200             else {
1201 0         0 $char[$i] = '(?:' . $uc . '|' . $fc . ')';
1202             }
1203             }
1204             }
1205             }
1206              
1207             # characterize
1208 0         0 for (my $i=0; $i <= $#char; $i++) {
1209 0 0       0 next if not defined $char[$i];
1210              
1211 0 0       0 if (0) {
1212             }
1213              
1214             # quote character before ? + * {
1215 0 0       0 elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
1216 0 0       0 if ($char[$i-1] !~ /\A [\x00-\xFF] \z/oxms) {
1217 0         0 $char[$i-1] = '(?:' . $char[$i-1] . ')';
1218             }
1219             }
1220             }
1221              
1222 0         0 $string = join '', @char;
1223             }
1224              
1225             # make regexp string
1226 0         0 return @string;
1227             }
1228              
1229             #
1230             # classic character class ( \D \S \W \d \s \w \C \X \H \V \h \v \R \N \b \B )
1231             #
1232             sub Eeuctw::classic_character_class {
1233 0     2950 0 0 my($char) = @_;
1234              
1235             return {
1236             '\D' => '${Eeuctw::eD}',
1237             '\S' => '${Eeuctw::eS}',
1238             '\W' => '${Eeuctw::eW}',
1239             '\d' => '[0-9]',
1240              
1241             # Before Perl 5.6, \s only matched the five whitespace characters
1242             # tab, newline, form-feed, carriage return, and the space character
1243             # itself, which, taken together, is the character class [\t\n\f\r ].
1244              
1245             # Vertical tabs are now whitespace
1246             # \s in a regex now matches a vertical tab in all circumstances.
1247             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1248             # \t \n \v \f \r space
1249             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
1250             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
1251             '\s' => '\s',
1252              
1253             '\w' => '[0-9A-Z_a-z]',
1254             '\C' => '[\x00-\xFF]',
1255             '\X' => 'X',
1256              
1257             # \h \v \H \V
1258              
1259             # P.114 Character Class Shortcuts
1260             # in Chapter 7: In the World of Regular Expressions
1261             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
1262              
1263             # P.357 13.2.3 Whitespace
1264             # in Chapter 13: perlrecharclass: Perl Regular Expression Character Classes
1265             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
1266             #
1267             # 0x00009 CHARACTER TABULATION h s
1268             # 0x0000a LINE FEED (LF) vs
1269             # 0x0000b LINE TABULATION v
1270             # 0x0000c FORM FEED (FF) vs
1271             # 0x0000d CARRIAGE RETURN (CR) vs
1272             # 0x00020 SPACE h s
1273              
1274             # P.196 Table 5-9. Alphanumeric regex metasymbols
1275             # in Chapter 5. Pattern Matching
1276             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1277              
1278             # (and so on)
1279              
1280             '\H' => '${Eeuctw::eH}',
1281             '\V' => '${Eeuctw::eV}',
1282             '\h' => '[\x09\x20]',
1283             '\v' => '[\x0A\x0B\x0C\x0D]',
1284             '\R' => '${Eeuctw::eR}',
1285              
1286             # \N
1287             #
1288             # http://perldoc.perl.org/perlre.html
1289             # Character Classes and other Special Escapes
1290             # Any character but \n (experimental). Not affected by /s modifier
1291              
1292             '\N' => '${Eeuctw::eN}',
1293              
1294             # \b \B
1295              
1296             # P.180 Boundaries: The \b and \B Assertions
1297             # in Chapter 5: Pattern Matching
1298             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1299              
1300             # P.219 Boundaries: The \b and \B Assertions
1301             # in Chapter 5: Pattern Matching
1302             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1303              
1304             # \b really means (?:(?<=\w)(?!\w)|(?
1305             # or (?:(?<=\A|\W)(?=\w)|(?<=\w)(?=\W|\z))
1306             '\b' => '${Eeuctw::eb}',
1307              
1308             # \B really means (?:(?<=\w)(?=\w)|(?
1309             # or (?:(?<=\w)(?=\w)|(?<=\W)(?=\W))
1310             '\B' => '${Eeuctw::eB}',
1311              
1312 2950   100     4353 }->{$char} || '';
1313             }
1314              
1315             #
1316             # prepare EUC-TW characters per length
1317             #
1318              
1319             # 1 octet characters
1320             my @chars1 = ();
1321             sub chars1 {
1322 2950 0   0 0 123024 if (@chars1) {
1323 0         0 return @chars1;
1324             }
1325 0 0       0 if (exists $range_tr{1}) {
1326 0         0 my @ranges = @{ $range_tr{1} };
  0         0  
1327 0         0 while (my @range = splice(@ranges,0,1)) {
1328 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1329 0         0 push @chars1, pack 'C', $oct0;
1330             }
1331             }
1332             }
1333 0         0 return @chars1;
1334             }
1335              
1336             # 2 octets characters
1337             my @chars2 = ();
1338             sub chars2 {
1339 0 0   0 0 0 if (@chars2) {
1340 0         0 return @chars2;
1341             }
1342 0 0       0 if (exists $range_tr{2}) {
1343 0         0 my @ranges = @{ $range_tr{2} };
  0         0  
1344 0         0 while (my @range = splice(@ranges,0,2)) {
1345 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1346 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1347 0         0 push @chars2, pack 'CC', $oct0,$oct1;
1348             }
1349             }
1350             }
1351             }
1352 0         0 return @chars2;
1353             }
1354              
1355             # 3 octets characters
1356             my @chars3 = ();
1357             sub chars3 {
1358 0 0   0 0 0 if (@chars3) {
1359 0         0 return @chars3;
1360             }
1361 0 0       0 if (exists $range_tr{3}) {
1362 0         0 my @ranges = @{ $range_tr{3} };
  0         0  
1363 0         0 while (my @range = splice(@ranges,0,3)) {
1364 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1365 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1366 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
1367 0         0 push @chars3, pack 'CCC', $oct0,$oct1,$oct2;
1368             }
1369             }
1370             }
1371             }
1372             }
1373 0         0 return @chars3;
1374             }
1375              
1376             # 4 octets characters
1377             my @chars4 = ();
1378             sub chars4 {
1379 0 0   0 0 0 if (@chars4) {
1380 0         0 return @chars4;
1381             }
1382 0 0       0 if (exists $range_tr{4}) {
1383 0         0 my @ranges = @{ $range_tr{4} };
  0         0  
1384 0         0 while (my @range = splice(@ranges,0,4)) {
1385 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1386 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1387 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
1388 0         0 for my $oct3 (@{$range[3]}) {
  0         0  
1389 0         0 push @chars4, pack 'CCCC', $oct0,$oct1,$oct2,$oct3;
1390             }
1391             }
1392             }
1393             }
1394             }
1395             }
1396 0         0 return @chars4;
1397             }
1398              
1399             #
1400             # EUC-TW open character list for tr
1401             #
1402             sub _charlist_tr {
1403              
1404 0     0   0 local $_ = shift @_;
1405              
1406             # unescape character
1407 0         0 my @char = ();
1408 0         0 while (not /\G \z/oxmsgc) {
1409 0 0       0 if (/\G (\\0?55|\\x2[Dd]|\\-) /oxmsgc) {
    0          
    0          
    0          
    0          
    0          
    0          
1410 0         0 push @char, '\-';
1411             }
1412             elsif (/\G \\ ([0-7]{2,3}) /oxmsgc) {
1413 0         0 push @char, CORE::chr(oct $1);
1414             }
1415             elsif (/\G \\x ([0-9A-Fa-f]{1,2}) /oxmsgc) {
1416 0         0 push @char, CORE::chr(hex $1);
1417             }
1418             elsif (/\G \\c ([\x40-\x5F]) /oxmsgc) {
1419 0         0 push @char, CORE::chr(CORE::ord($1) & 0x1F);
1420             }
1421             elsif (/\G (\\ [0nrtfbae]) /oxmsgc) {
1422             push @char, {
1423             '\0' => "\0",
1424             '\n' => "\n",
1425             '\r' => "\r",
1426             '\t' => "\t",
1427             '\f' => "\f",
1428             '\b' => "\x08", # \b means backspace in character class
1429             '\a' => "\a",
1430             '\e' => "\e",
1431 0         0 }->{$1};
1432             }
1433             elsif (/\G \\ ($q_char) /oxmsgc) {
1434 0         0 push @char, $1;
1435             }
1436             elsif (/\G ($q_char) /oxmsgc) {
1437 0         0 push @char, $1;
1438             }
1439             }
1440              
1441             # join separated multiple-octet
1442 0         0 @char = join('',@char) =~ /\G (?>\\-|$q_char) /oxmsg;
1443              
1444             # unescape '-'
1445 0         0 my @i = ();
1446 0         0 for my $i (0 .. $#char) {
1447 0 0       0 if ($char[$i] eq '\-') {
    0          
1448 0         0 $char[$i] = '-';
1449             }
1450             elsif ($char[$i] eq '-') {
1451 0 0 0     0 if ((0 < $i) and ($i < $#char)) {
1452 0         0 push @i, $i;
1453             }
1454             }
1455             }
1456              
1457             # open character list (reverse for splice)
1458 0         0 for my $i (CORE::reverse @i) {
1459 0         0 my @range = ();
1460              
1461             # range error
1462 0 0 0     0 if ((CORE::length($char[$i-1]) > CORE::length($char[$i+1])) or ($char[$i-1] gt $char[$i+1])) {
1463 0         0 croak "Invalid tr/// range \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1464             }
1465              
1466             # range of multiple-octet code
1467 0 0       0 if (CORE::length($char[$i-1]) == 1) {
    0          
    0          
    0          
1468 0 0       0 if (CORE::length($char[$i+1]) == 1) {
    0          
    0          
    0          
1469 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars1();
  0         0  
1470             }
1471             elsif (CORE::length($char[$i+1]) == 2) {
1472 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1473 0         0 push @range, grep {$_ le $char[$i+1]} chars2();
  0         0  
1474             }
1475             elsif (CORE::length($char[$i+1]) == 3) {
1476 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1477 0         0 push @range, chars2();
1478 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
1479             }
1480             elsif (CORE::length($char[$i+1]) == 4) {
1481 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1482 0         0 push @range, chars2();
1483 0         0 push @range, chars3();
1484 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1485             }
1486             else {
1487 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1488             }
1489             }
1490             elsif (CORE::length($char[$i-1]) == 2) {
1491 0 0       0 if (CORE::length($char[$i+1]) == 2) {
    0          
    0          
1492 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars2();
  0         0  
1493             }
1494             elsif (CORE::length($char[$i+1]) == 3) {
1495 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
1496 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
1497             }
1498             elsif (CORE::length($char[$i+1]) == 4) {
1499 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
1500 0         0 push @range, chars3();
1501 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1502             }
1503             else {
1504 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1505             }
1506             }
1507             elsif (CORE::length($char[$i-1]) == 3) {
1508 0 0       0 if (CORE::length($char[$i+1]) == 3) {
    0          
1509 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars3();
  0         0  
1510             }
1511             elsif (CORE::length($char[$i+1]) == 4) {
1512 0         0 push @range, grep {$char[$i-1] le $_} chars3();
  0         0  
1513 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1514             }
1515             else {
1516 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1517             }
1518             }
1519             elsif (CORE::length($char[$i-1]) == 4) {
1520 0 0       0 if (CORE::length($char[$i+1]) == 4) {
1521 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars4();
  0         0  
1522             }
1523             else {
1524 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1525             }
1526             }
1527             else {
1528 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1529             }
1530              
1531 0         0 splice @char, $i-1, 3, @range;
1532             }
1533              
1534 0         0 return @char;
1535             }
1536              
1537             #
1538             # EUC-TW open character class
1539             #
1540             sub _cc {
1541 0 50   342   0 if (scalar(@_) == 0) {
    100          
    50          
1542 342         933 die __FILE__, ": subroutine cc got no parameter.\n";
1543             }
1544             elsif (scalar(@_) == 1) {
1545 0         0 return sprintf('\x%02X',$_[0]);
1546             }
1547             elsif (scalar(@_) == 2) {
1548 151 50       650 if ($_[0] > $_[1]) {
    50          
    100          
1549 191         525 die __FILE__, ": subroutine cc got \$_[0] > \$_[1] parameters).\n";
1550             }
1551             elsif ($_[0] == $_[1]) {
1552 0         0 return sprintf('\x%02X',$_[0]);
1553             }
1554             elsif (($_[0]+1) == $_[1]) {
1555 0         0 return sprintf('[\\x%02X\\x%02X]',$_[0],$_[1]);
1556             }
1557             else {
1558 20         54 return sprintf('[\\x%02X-\\x%02X]',$_[0],$_[1]);
1559             }
1560             }
1561             else {
1562 171         943 die __FILE__, ": subroutine cc got 3 or more parameters (@{[scalar(@_)]} parameters).\n";
  0         0  
1563             }
1564             }
1565              
1566             #
1567             # EUC-TW octet range
1568             #
1569             sub _octets {
1570 0     557   0 my $length = shift @_;
1571              
1572 557 100       907 if ($length == 1) {
    50          
    0          
    0          
1573 557         1295 my($a1) = unpack 'C', $_[0];
1574 426         1051 my($z1) = unpack 'C', $_[1];
1575              
1576 426 50       723 if ($a1 > $z1) {
1577 426         806 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$a1) . '-\x' . unpack('H*',$z1);
1578             }
1579              
1580 0 100       0 if ($a1 == $z1) {
    50          
1581 426         965 return sprintf('\x%02X',$a1);
1582             }
1583             elsif (($a1+1) == $z1) {
1584 20         117 return sprintf('\x%02X\x%02X',$a1,$z1);
1585             }
1586             else {
1587 0         0 return sprintf('\x%02X-\x%02X',$a1,$z1);
1588             }
1589             }
1590             elsif ($length == 2) {
1591 406         2284 my($a1,$a2) = unpack 'CC', $_[0];
1592 131         356 my($z1,$z2) = unpack 'CC', $_[1];
1593 131         260 my($A1,$A2) = unpack 'CC', $_[2];
1594 131         340 my($Z1,$Z2) = unpack 'CC', $_[3];
1595              
1596 131 100       223 if ($a1 == $z1) {
    50          
1597             return (
1598             # 11111111 222222222222
1599             # A A Z
1600 131         310 _cc($a1) . _cc($a2,$z2), # a2-z2
1601             );
1602             }
1603             elsif (($a1+1) == $z1) {
1604             return (
1605             # 11111111111 222222222222
1606             # A Z A Z
1607 111         224 _cc($a1) . _cc($a2,$Z2), # a2-
1608             _cc( $z1) . _cc($A2,$z2), # -z2
1609             );
1610             }
1611             else {
1612             return (
1613             # 1111111111111111 222222222222
1614             # A Z A Z
1615 0         0 _cc($a1) . _cc($a2,$Z2), # a2-
1616             _cc($a1+1,$z1-1) . _cc($A2,$Z2), # -
1617             _cc( $z1) . _cc($A2,$z2), # -z2
1618             );
1619             }
1620             }
1621             elsif ($length == 3) {
1622 20         44 my($a1,$a2,$a3) = unpack 'CCC', $_[0];
1623 0         0 my($z1,$z2,$z3) = unpack 'CCC', $_[1];
1624 0         0 my($A1,$A2,$A3) = unpack 'CCC', $_[2];
1625 0         0 my($Z1,$Z2,$Z3) = unpack 'CCC', $_[3];
1626              
1627 0 0       0 if ($a1 == $z1) {
    0          
1628 0 0       0 if ($a2 == $z2) {
    0          
1629             return (
1630             # 11111111 22222222 333333333333
1631             # A A A Z
1632 0         0 _cc($a1) . _cc($a2) . _cc($a3,$z3), # a3-z3
1633             );
1634             }
1635             elsif (($a2+1) == $z2) {
1636             return (
1637             # 11111111 22222222222 333333333333
1638             # A A Z A Z
1639 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1640             _cc($a1) . _cc( $z2) . _cc($A3,$z3), # -z3
1641             );
1642             }
1643             else {
1644             return (
1645             # 11111111 2222222222222222 333333333333
1646             # A A Z A Z
1647 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1648             _cc($a1) . _cc($a2+1,$z2-1) . _cc($A3,$Z3), # -
1649             _cc($a1) . _cc( $z2) . _cc($A3,$z3), # -z3
1650             );
1651             }
1652             }
1653             elsif (($a1+1) == $z1) {
1654             return (
1655             # 11111111111 22222222222222 333333333333
1656             # A Z A Z A Z
1657 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1658             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3), # -
1659             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3), # -
1660             _cc( $z1) . _cc( $z2) . _cc($A3,$z3), # -z3
1661             );
1662             }
1663             else {
1664             return (
1665             # 1111111111111111 22222222222222 333333333333
1666             # A Z A Z A Z
1667 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1668             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3), # -
1669             _cc($a1+1,$z1-1) . _cc($A2,$Z2) . _cc($A3,$Z3), # -
1670             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3), # -
1671             _cc( $z1) . _cc( $z2) . _cc($A3,$z3), # -z3
1672             );
1673             }
1674             }
1675             elsif ($length == 4) {
1676 0         0 my($a1,$a2,$a3,$a4) = unpack 'CCCC', $_[0];
1677 0         0 my($z1,$z2,$z3,$z4) = unpack 'CCCC', $_[1];
1678 0         0 my($A1,$A2,$A3,$A4) = unpack 'CCCC', $_[0];
1679 0         0 my($Z1,$Z2,$Z3,$Z4) = unpack 'CCCC', $_[1];
1680              
1681 0 0       0 if ($a1 == $z1) {
    0          
1682 0 0       0 if ($a2 == $z2) {
    0          
1683 0 0       0 if ($a3 == $z3) {
    0          
1684             return (
1685             # 11111111 22222222 33333333 444444444444
1686             # A A A A Z
1687 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$z4), # a4-z4
1688             );
1689             }
1690             elsif (($a3+1) == $z3) {
1691             return (
1692             # 11111111 22222222 33333333333 444444444444
1693             # A A A Z A Z
1694 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1695             _cc($a1) . _cc($a2) . _cc( $z3) . _cc($A4,$z4), # -z4
1696             );
1697             }
1698             else {
1699             return (
1700             # 11111111 22222222 3333333333333333 444444444444
1701             # A A A Z A Z
1702 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1703             _cc($a1) . _cc($a2) . _cc($a3+1,$z3-1) . _cc($A4,$Z4), # -
1704             _cc($a1) . _cc($a2) . _cc( $z3) . _cc($A4,$z4), # -z4
1705             );
1706             }
1707             }
1708             elsif (($a2+1) == $z2) {
1709             return (
1710             # 11111111 22222222222 33333333333333 444444444444
1711             # A A Z A Z A Z
1712 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1713             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1714             _cc($a1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1715             _cc($a1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1716             );
1717             }
1718             else {
1719             return (
1720             # 11111111 2222222222222222 33333333333333 444444444444
1721             # A A Z A Z A Z
1722 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1723             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1724             _cc($a1) . _cc($a2+1,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1725             _cc($a1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1726             _cc($a1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1727             );
1728             }
1729             }
1730             elsif (($a1+1) == $z1) {
1731             return (
1732             # 11111111111 22222222222222 33333333333333 444444444444
1733             # A Z A Z A Z A Z
1734 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1735             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1736             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1737             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1738             _cc( $z1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1739             _cc( $z1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1740             );
1741             }
1742             else {
1743             return (
1744             # 1111111111111111 22222222222222 33333333333333 444444444444
1745             # A Z A Z A Z A Z
1746 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1747             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1748             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1749             _cc($a1+1,$z1-1) . _cc($A2,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1750             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1751             _cc( $z1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1752             _cc( $z1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1753             );
1754             }
1755             }
1756             else {
1757 0         0 die __FILE__, ": subroutine _octets got invalid length ($length).\n";
1758             }
1759             }
1760              
1761             #
1762             # EUC-TW range regexp
1763             #
1764             sub _range_regexp {
1765 0     517   0 my($length,$first,$last) = @_;
1766              
1767 517         1098 my @range_regexp = ();
1768 517 50       701 if (not exists $range_tr{$length}) {
1769 517         1210 return @range_regexp;
1770             }
1771              
1772 0         0 my @ranges = @{ $range_tr{$length} };
  517         645  
1773 517         1158 while (my @range = splice(@ranges,0,$length)) {
1774 517         1521 my $min = '';
1775 1289         1653 my $max = '';
1776 1289         1480 for (my $i=0; $i < $length; $i++) {
1777 1289         2195 $min .= pack 'C', $range[$i][0];
1778 1420         2867 $max .= pack 'C', $range[$i][-1];
1779             }
1780              
1781             # min___max
1782             # FIRST_____________LAST
1783             # (nothing)
1784              
1785 1420 50 66     2666 if ($max lt $first) {
    100 100        
    50 33        
    100 100        
    100 66        
    100 66        
    50 66        
1786             }
1787              
1788             # **********
1789             # min_________max
1790             # FIRST_____________LAST
1791             # **********
1792              
1793             elsif (($min le $first) and ($first le $max) and ($max le $last)) {
1794 1289         10874 push @range_regexp, _octets($length,$first,$max,$min,$max);
1795             }
1796              
1797             # **********************
1798             # min________________max
1799             # FIRST_____________LAST
1800             # **********************
1801              
1802             elsif (($min eq $first) and ($max eq $last)) {
1803 20         47 push @range_regexp, _octets($length,$first,$last,$min,$max);
1804             }
1805              
1806             # *********
1807             # min___max
1808             # FIRST_____________LAST
1809             # *********
1810              
1811             elsif (($first le $min) and ($max le $last)) {
1812 0         0 push @range_regexp, _octets($length,$min,$max,$min,$max);
1813             }
1814              
1815             # **********************
1816             # min__________________________max
1817             # FIRST_____________LAST
1818             # **********************
1819              
1820             elsif (($min le $first) and ($last le $max)) {
1821 40         480 push @range_regexp, _octets($length,$first,$last,$min,$max);
1822             }
1823              
1824             # *********
1825             # min________max
1826             # FIRST_____________LAST
1827             # *********
1828              
1829             elsif (($first le $min) and ($min le $last) and ($last le $max)) {
1830 477         1368 push @range_regexp, _octets($length,$min,$last,$min,$max);
1831             }
1832              
1833             # min___max
1834             # FIRST_____________LAST
1835             # (nothing)
1836              
1837             elsif ($last lt $min) {
1838             }
1839              
1840             else {
1841 20         38 die __FILE__, ": subroutine _range_regexp panic.\n";
1842             }
1843             }
1844              
1845 0         0 return @range_regexp;
1846             }
1847              
1848             #
1849             # EUC-TW open character list for qr and not qr
1850             #
1851             sub _charlist {
1852              
1853 517     758   1095 my $modifier = pop @_;
1854 758         1061 my @char = @_;
1855              
1856 758 100       1637 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
1857              
1858             # unescape character
1859 758         1718 for (my $i=0; $i <= $#char; $i++) {
1860              
1861             # escape - to ...
1862 758 100 100     2410 if ($char[$i] eq '-') {
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
1863 2648 100 100     17756 if ((0 < $i) and ($i < $#char)) {
1864 522         1747 $char[$i] = '...';
1865             }
1866             }
1867              
1868             # octal escape sequence
1869             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
1870 497         1129 $char[$i] = octchr($1);
1871             }
1872              
1873             # hexadecimal escape sequence
1874             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
1875 0         0 $char[$i] = hexchr($1);
1876             }
1877              
1878             # \b{...} --> b\{...}
1879             # \B{...} --> B\{...}
1880             # \N{CHARNAME} --> N\{CHARNAME}
1881             # \p{PROPERTY} --> p\{PROPERTY}
1882             # \P{PROPERTY} --> P\{PROPERTY}
1883             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x8E\xA1-\xFE0-9\}][^\x8E\xA1-\xFE\}]*) \} ) \z/oxms) {
1884 0         0 $char[$i] = $1 . '\\' . $2;
1885             }
1886              
1887             # \p, \P, \X --> p, P, X
1888             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
1889 0         0 $char[$i] = $1;
1890             }
1891              
1892             elsif ($char[$i] =~ /\A \\ ([0-7]{2,3}) \z/oxms) {
1893 0         0 $char[$i] = CORE::chr oct $1;
1894             }
1895             elsif ($char[$i] =~ /\A \\x ([0-9A-Fa-f]{1,2}) \z/oxms) {
1896 0         0 $char[$i] = CORE::chr hex $1;
1897             }
1898             elsif ($char[$i] =~ /\A \\c ([\x40-\x5F]) \z/oxms) {
1899 206         725 $char[$i] = CORE::chr(CORE::ord($1) & 0x1F);
1900             }
1901             elsif ($char[$i] =~ /\A (\\ [0nrtfbaedswDSWHVhvR]) \z/oxms) {
1902             $char[$i] = {
1903             '\0' => "\0",
1904             '\n' => "\n",
1905             '\r' => "\r",
1906             '\t' => "\t",
1907             '\f' => "\f",
1908             '\b' => "\x08", # \b means backspace in character class
1909             '\a' => "\a",
1910             '\e' => "\e",
1911             '\d' => '[0-9]',
1912              
1913             # Vertical tabs are now whitespace
1914             # \s in a regex now matches a vertical tab in all circumstances.
1915             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1916             # \t \n \v \f \r space
1917             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
1918             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
1919             '\s' => '\s',
1920              
1921             '\w' => '[0-9A-Z_a-z]',
1922             '\D' => '${Eeuctw::eD}',
1923             '\S' => '${Eeuctw::eS}',
1924             '\W' => '${Eeuctw::eW}',
1925              
1926             '\H' => '${Eeuctw::eH}',
1927             '\V' => '${Eeuctw::eV}',
1928             '\h' => '[\x09\x20]',
1929             '\v' => '[\x0A\x0B\x0C\x0D]',
1930             '\R' => '${Eeuctw::eR}',
1931              
1932 0         0 }->{$1};
1933             }
1934              
1935             # POSIX-style character classes
1936             elsif ($ignorecase and ($char[$i] =~ /\A ( \[\: \^? (?:lower|upper) :\] ) \z/oxms)) {
1937             $char[$i] = {
1938              
1939             '[:lower:]' => '[\x41-\x5A\x61-\x7A]',
1940             '[:upper:]' => '[\x41-\x5A\x61-\x7A]',
1941             '[:^lower:]' => '${Eeuctw::not_lower_i}',
1942             '[:^upper:]' => '${Eeuctw::not_upper_i}',
1943              
1944 33         513 }->{$1};
1945             }
1946             elsif ($char[$i] =~ /\A ( \[\: \^? (?:alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print|punct|space|upper|word|xdigit) :\] ) \z/oxms) {
1947             $char[$i] = {
1948              
1949             '[:alnum:]' => '[\x30-\x39\x41-\x5A\x61-\x7A]',
1950             '[:alpha:]' => '[\x41-\x5A\x61-\x7A]',
1951             '[:ascii:]' => '[\x00-\x7F]',
1952             '[:blank:]' => '[\x09\x20]',
1953             '[:cntrl:]' => '[\x00-\x1F\x7F]',
1954             '[:digit:]' => '[\x30-\x39]',
1955             '[:graph:]' => '[\x21-\x7F]',
1956             '[:lower:]' => '[\x61-\x7A]',
1957             '[:print:]' => '[\x20-\x7F]',
1958             '[:punct:]' => '[\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]',
1959              
1960             # P.174 POSIX-Style Character Classes
1961             # in Chapter 5: Pattern Matching
1962             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1963              
1964             # P.311 11.2.4 Character Classes and other Special Escapes
1965             # in Chapter 11: perlre: Perl regular expressions
1966             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
1967              
1968             # P.210 POSIX-Style Character Classes
1969             # in Chapter 5: Pattern Matching
1970             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1971              
1972             '[:space:]' => '[\s\x0B]', # "\s" plus vertical tab ("\cK")
1973              
1974             '[:upper:]' => '[\x41-\x5A]',
1975             '[:word:]' => '[\x30-\x39\x41-\x5A\x5F\x61-\x7A]',
1976             '[:xdigit:]' => '[\x30-\x39\x41-\x46\x61-\x66]',
1977             '[:^alnum:]' => '${Eeuctw::not_alnum}',
1978             '[:^alpha:]' => '${Eeuctw::not_alpha}',
1979             '[:^ascii:]' => '${Eeuctw::not_ascii}',
1980             '[:^blank:]' => '${Eeuctw::not_blank}',
1981             '[:^cntrl:]' => '${Eeuctw::not_cntrl}',
1982             '[:^digit:]' => '${Eeuctw::not_digit}',
1983             '[:^graph:]' => '${Eeuctw::not_graph}',
1984             '[:^lower:]' => '${Eeuctw::not_lower}',
1985             '[:^print:]' => '${Eeuctw::not_print}',
1986             '[:^punct:]' => '${Eeuctw::not_punct}',
1987             '[:^space:]' => '${Eeuctw::not_space}',
1988             '[:^upper:]' => '${Eeuctw::not_upper}',
1989             '[:^word:]' => '${Eeuctw::not_word}',
1990             '[:^xdigit:]' => '${Eeuctw::not_xdigit}',
1991              
1992 8         66 }->{$1};
1993             }
1994             elsif ($char[$i] =~ /\A \\ ($q_char) \z/oxms) {
1995 70         1284 $char[$i] = $1;
1996             }
1997             }
1998              
1999             # open character list
2000 7         38 my @singleoctet = ();
2001 758         1269 my @multipleoctet = ();
2002 758         1233 for (my $i=0; $i <= $#char; ) {
2003              
2004             # escaped -
2005 758 100 100     2005 if (defined($char[$i+1]) and ($char[$i+1] eq '...')) {
    100          
    100          
    50          
    50          
    100          
2006 2151         8676 $i += 1;
2007 497         653 next;
2008             }
2009              
2010             # make range regexp
2011             elsif ($char[$i] eq '...') {
2012              
2013             # range error
2014 497 50       875 if (CORE::length($char[$i-1]) > CORE::length($char[$i+1])) {
    100          
2015 497         1739 croak 'Invalid [] range in regexp (length(A) > length(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
2016             }
2017             elsif (CORE::length($char[$i-1]) == CORE::length($char[$i+1])) {
2018 0 50       0 if ($char[$i-1] gt $char[$i+1]) {
2019 477         1041 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
2020             }
2021             }
2022              
2023             # make range regexp per length
2024 0         0 for my $length (CORE::length($char[$i-1]) .. CORE::length($char[$i+1])) {
2025 497         1292 my @regexp = ();
2026              
2027             # is first and last
2028 517 100 100     718 if (($length == CORE::length($char[$i-1])) and ($length == CORE::length($char[$i+1]))) {
    100 33        
    50          
    50          
2029 517         1901 push @regexp, _range_regexp($length, $char[$i-1], $char[$i+1]);
2030             }
2031              
2032             # is first
2033             elsif ($length == CORE::length($char[$i-1])) {
2034 477         1118 push @regexp, _range_regexp($length, $char[$i-1], "\xFF" x $length);
2035             }
2036              
2037             # is inside in first and last
2038             elsif ((CORE::length($char[$i-1]) < $length) and ($length < CORE::length($char[$i+1]))) {
2039 20         84 push @regexp, _range_regexp($length, "\x00" x $length, "\xFF" x $length);
2040             }
2041              
2042             # is last
2043             elsif ($length == CORE::length($char[$i+1])) {
2044 0         0 push @regexp, _range_regexp($length, "\x00" x $length, $char[$i+1]);
2045             }
2046              
2047             else {
2048 20         66 die __FILE__, ": subroutine make_regexp panic.\n";
2049             }
2050              
2051 0 100       0 if ($length == 1) {
2052 517         912 push @singleoctet, @regexp;
2053             }
2054             else {
2055 386         854 push @multipleoctet, @regexp;
2056             }
2057             }
2058              
2059 131         267 $i += 2;
2060             }
2061              
2062             # with /i modifier
2063             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
2064 497 100       998 if ($modifier =~ /i/oxms) {
2065 764         1171 my $uc = Eeuctw::uc($char[$i]);
2066 192         291 my $fc = Eeuctw::fc($char[$i]);
2067 192 50       299 if ($uc ne $fc) {
2068 192 50       293 if (CORE::length($fc) == 1) {
2069 192         240 push @singleoctet, $uc, $fc;
2070             }
2071             else {
2072 192         353 push @singleoctet, $uc;
2073 0         0 push @multipleoctet, $fc;
2074             }
2075             }
2076             else {
2077 0         0 push @singleoctet, $char[$i];
2078             }
2079             }
2080             else {
2081 0         0 push @singleoctet, $char[$i];
2082             }
2083 572         814 $i += 1;
2084             }
2085              
2086             # single character of single octet code
2087             elsif ($char[$i] =~ /\A (?: \\h ) \z/oxms) {
2088 764         1333 push @singleoctet, "\t", "\x20";
2089 0         0 $i += 1;
2090             }
2091             elsif ($char[$i] =~ /\A (?: \\v ) \z/oxms) {
2092 0         0 push @singleoctet, "\x0A", "\x0B", "\x0C", "\x0D";
2093 0         0 $i += 1;
2094             }
2095             elsif ($char[$i] =~ /\A (?: \\d | \\s | \\w ) \z/oxms) {
2096 0         0 push @singleoctet, $char[$i];
2097 2         7 $i += 1;
2098             }
2099              
2100             # single character of multiple-octet code
2101             else {
2102 2         6 push @multipleoctet, $char[$i];
2103 391         649 $i += 1;
2104             }
2105             }
2106              
2107             # quote metachar
2108 391         613 for (@singleoctet) {
2109 758 50       16631 if ($_ eq '...') {
    100          
    100          
    100          
    100          
2110 1384         6922 $_ = '-';
2111             }
2112             elsif (/\A \n \z/oxms) {
2113 0         0 $_ = '\n';
2114             }
2115             elsif (/\A \r \z/oxms) {
2116 8         25 $_ = '\r';
2117             }
2118             elsif (/\A ([\x00-\x20\x7F-\xFF]) \z/oxms) {
2119 8         24 $_ = sprintf('\x%02X', CORE::ord $1);
2120             }
2121             elsif (/\A [\x00-\xFF] \z/oxms) {
2122 1         7 $_ = quotemeta $_;
2123             }
2124             }
2125              
2126             # return character list
2127 939         1494 return \@singleoctet, \@multipleoctet;
2128             }
2129              
2130             #
2131             # EUC-TW octal escape sequence
2132             #
2133             sub octchr {
2134 758     5 0 2676 my($octdigit) = @_;
2135              
2136 5         15 my @binary = ();
2137 5         9 for my $octal (split(//,$octdigit)) {
2138             push @binary, {
2139             '0' => '000',
2140             '1' => '001',
2141             '2' => '010',
2142             '3' => '011',
2143             '4' => '100',
2144             '5' => '101',
2145             '6' => '110',
2146             '7' => '111',
2147 5         26 }->{$octal};
2148             }
2149 50         176 my $binary = join '', @binary;
2150              
2151             my $octchr = {
2152             # 1234567
2153             1 => pack('B*', "0000000$binary"),
2154             2 => pack('B*', "000000$binary"),
2155             3 => pack('B*', "00000$binary"),
2156             4 => pack('B*', "0000$binary"),
2157             5 => pack('B*', "000$binary"),
2158             6 => pack('B*', "00$binary"),
2159             7 => pack('B*', "0$binary"),
2160             0 => pack('B*', "$binary"),
2161              
2162 5         16 }->{CORE::length($binary) % 8};
2163              
2164 5         65 return $octchr;
2165             }
2166              
2167             #
2168             # EUC-TW hexadecimal escape sequence
2169             #
2170             sub hexchr {
2171 5     5 0 19 my($hexdigit) = @_;
2172              
2173             my $hexchr = {
2174             1 => pack('H*', "0$hexdigit"),
2175             0 => pack('H*', "$hexdigit"),
2176              
2177 5         15 }->{CORE::length($_[0]) % 2};
2178              
2179 5         38 return $hexchr;
2180             }
2181              
2182             #
2183             # EUC-TW open character list for qr
2184             #
2185             sub charlist_qr {
2186              
2187 5     519 0 19 my $modifier = pop @_;
2188 519         949 my @char = @_;
2189              
2190 519         1211 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
2191 519         1331 my @singleoctet = @$singleoctet;
2192 519         1137 my @multipleoctet = @$multipleoctet;
2193              
2194             # return character list
2195 519 100       776 if (scalar(@singleoctet) >= 1) {
2196              
2197             # with /i modifier
2198 519 100       1295 if ($modifier =~ m/i/oxms) {
2199 384         830 my %singleoctet_ignorecase = ();
2200 107         144 for (@singleoctet) {
2201 107   100     146 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
2202 277         873 for my $ord (hex($1) .. hex($2)) {
2203 85         280 my $char = CORE::chr($ord);
2204 1201         1539 my $uc = Eeuctw::uc($char);
2205 1201         1463 my $fc = Eeuctw::fc($char);
2206 1201 100       1850 if ($uc eq $fc) {
2207 1201         1742 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
2208             }
2209             else {
2210 612 50       1369 if (CORE::length($fc) == 1) {
2211 589         781 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2212 589         1403 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
2213             }
2214             else {
2215 589         1368 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2216 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
2217             }
2218             }
2219             }
2220             }
2221 0 100       0 if ($_ ne '') {
2222 277         512 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
2223             }
2224             }
2225 192         412 my $i = 0;
2226 107         129 my @singleoctet_ignorecase = ();
2227 107         137 for my $ord (0 .. 255) {
2228 107 100       167 if (exists $singleoctet_ignorecase{$ord}) {
2229 27392         31878 push @{$singleoctet_ignorecase[$i]}, $ord;
  1732         1766  
2230             }
2231             else {
2232 1732         2646 $i++;
2233             }
2234             }
2235 25660         26077 @singleoctet = ();
2236 107         165 for my $range (@singleoctet_ignorecase) {
2237 107 100       250 if (ref $range) {
2238 11257 100       16860 if (scalar(@{$range}) == 1) {
  219 50       221  
2239 219         341 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  5         8  
2240             }
2241 5         69 elsif (scalar(@{$range}) == 2) {
2242 214         265 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
2243             }
2244             else {
2245 0         0 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  214         244  
  214         266  
2246             }
2247             }
2248             }
2249             }
2250              
2251 214         1107 my $not_anchor = '';
2252 384         567 $not_anchor = '(?![\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE])';
2253              
2254 384         480 push @multipleoctet, join('', $not_anchor, '[', @singleoctet, ']' );
2255             }
2256 384 100       1039 if (scalar(@multipleoctet) >= 2) {
2257 519         1053 return '(?:' . join('|', @multipleoctet) . ')';
2258             }
2259             else {
2260 102         569 return $multipleoctet[0];
2261             }
2262             }
2263              
2264             #
2265             # EUC-TW open character list for not qr
2266             #
2267             sub charlist_not_qr {
2268              
2269 417     239 0 1806 my $modifier = pop @_;
2270 239         385 my @char = @_;
2271              
2272 239         641 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
2273 239         617 my @singleoctet = @$singleoctet;
2274 239         474 my @multipleoctet = @$multipleoctet;
2275              
2276             # with /i modifier
2277 239 100       418 if ($modifier =~ m/i/oxms) {
2278 239         577 my %singleoctet_ignorecase = ();
2279 128         199 for (@singleoctet) {
2280 128   100     192 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
2281 277         967 for my $ord (hex($1) .. hex($2)) {
2282 85         337 my $char = CORE::chr($ord);
2283 1201         1894 my $uc = Eeuctw::uc($char);
2284 1201         2173 my $fc = Eeuctw::fc($char);
2285 1201 100       2228 if ($uc eq $fc) {
2286 1201         2303 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
2287             }
2288             else {
2289 612 50       2000 if (CORE::length($fc) == 1) {
2290 589         869 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2291 589         1232 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
2292             }
2293             else {
2294 589         1471 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2295 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
2296             }
2297             }
2298             }
2299             }
2300 0 100       0 if ($_ ne '') {
2301 277         501 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
2302             }
2303             }
2304 192         481 my $i = 0;
2305 128         172 my @singleoctet_ignorecase = ();
2306 128         227 for my $ord (0 .. 255) {
2307 128 100       229 if (exists $singleoctet_ignorecase{$ord}) {
2308 32768         38568 push @{$singleoctet_ignorecase[$i]}, $ord;
  1732         1774  
2309             }
2310             else {
2311 1732         3388 $i++;
2312             }
2313             }
2314 31036         32712 @singleoctet = ();
2315 128         252 for my $range (@singleoctet_ignorecase) {
2316 128 100       389 if (ref $range) {
2317 11257 100       17495 if (scalar(@{$range}) == 1) {
  219 50       209  
2318 219         362 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  5         6  
2319             }
2320 5         109 elsif (scalar(@{$range}) == 2) {
2321 214         304 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
2322             }
2323             else {
2324 0         0 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  214         250  
  214         283  
2325             }
2326             }
2327             }
2328             }
2329              
2330             # return character list
2331 214 100       984 if (scalar(@multipleoctet) >= 1) {
2332 239 100       483 if (scalar(@singleoctet) >= 1) {
2333              
2334             # any character other than multiple-octet and single octet character class
2335 114         321 return '(?!' . join('|', @multipleoctet) . ')(?:[^\x8E\xA1-\xFE' . join('', @singleoctet) . ']|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])';
2336             }
2337             else {
2338              
2339             # any character other than multiple-octet character class
2340 70         523 return '(?!' . join('|', @multipleoctet) . ")(?:$your_char)";
2341             }
2342             }
2343             else {
2344 44 50       261 if (scalar(@singleoctet) >= 1) {
2345              
2346             # any character other than single octet character class
2347 125         200 return '(?:[^\x8E\xA1-\xFE' . join('', @singleoctet) . ']|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])';
2348             }
2349             else {
2350              
2351             # any character
2352 125         773 return "(?:$your_char)";
2353             }
2354             }
2355             }
2356              
2357             #
2358             # open file in read mode
2359             #
2360             sub _open_r {
2361 0     658   0 my(undef,$file) = @_;
2362 329     329   6803 use Fcntl qw(O_RDONLY);
  329         3933  
  329         59841  
2363 658         2181 return CORE::sysopen($_[0], $file, &O_RDONLY);
2364             }
2365              
2366             #
2367             # open file in append mode
2368             #
2369             sub _open_a {
2370 658     329   28122 my(undef,$file) = @_;
2371 329     329   2415 use Fcntl qw(O_WRONLY O_APPEND O_CREAT);
  329         2079  
  329         1132325  
2372 329         1178 return CORE::sysopen($_[0], $file, &O_WRONLY|&O_APPEND|&O_CREAT);
2373             }
2374              
2375             #
2376             # safe system
2377             #
2378             sub _systemx {
2379              
2380             # P.707 29.2.33. exec
2381             # in Chapter 29: Functions
2382             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2383             #
2384             # Be aware that in older releases of Perl, exec (and system) did not flush
2385             # your output buffer, so you needed to enable command buffering by setting $|
2386             # on one or more filehandles to avoid lost output in the case of exec, or
2387             # misordererd output in the case of system. This situation was largely remedied
2388             # in the 5.6 release of Perl. (So, 5.005 release not yet.)
2389              
2390             # P.855 exec
2391             # in Chapter 27: Functions
2392             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2393             #
2394             # In very old release of Perl (before v5.6), exec (and system) did not flush
2395             # your output buffer, so you needed to enable command buffering by setting $|
2396             # on one or more filehandles to avoid lost output with exec or misordered
2397             # output with system.
2398              
2399 329     329   45513 $| = 1;
2400              
2401             # P.565 23.1.2. Cleaning Up Your Environment
2402             # in Chapter 23: Security
2403             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2404              
2405             # P.656 Cleaning Up Your Environment
2406             # in Chapter 20: Security
2407             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2408              
2409             # local $ENV{'PATH'} = '.';
2410 329         1154 local @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Make %ENV safer
2411              
2412             # P.707 29.2.33. exec
2413             # in Chapter 29: Functions
2414             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2415             #
2416             # As we mentioned earlier, exec treats a discrete list of arguments as an
2417             # indication that it should bypass shell processing. However, there is one
2418             # place where you might still get tripped up. The exec call (and system, too)
2419             # will not distinguish between a single scalar argument and an array containing
2420             # only one element.
2421             #
2422             # @args = ("echo surprise"); # just one element in list
2423             # exec @args # still subject to shell escapes
2424             # or die "exec: $!"; # because @args == 1
2425             #
2426             # To avoid this, you can use the PATHNAME syntax, explicitly duplicating the
2427             # first argument as the pathname, which forces the rest of the arguments to be
2428             # interpreted as a list, even if there is only one of them:
2429             #
2430             # exec { $args[0] } @args # safe even with one-argument list
2431             # or die "can't exec @args: $!";
2432              
2433             # P.855 exec
2434             # in Chapter 27: Functions
2435             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2436             #
2437             # As we mentioned earlier, exec treats a discrete list of arguments as a
2438             # directive to bypass shell processing. However, there is one place where
2439             # you might still get tripped up. The exec call (and system, too) cannot
2440             # distinguish between a single scalar argument and an array containing
2441             # only one element.
2442             #
2443             # @args = ("echo surprise"); # just one element in list
2444             # exec @args # still subject to shell escapes
2445             # || die "exec: $!"; # because @args == 1
2446             #
2447             # To avoid this, use the PATHNAME syntax, explicitly duplicating the first
2448             # argument as the pathname, which forces the rest of the arguments to be
2449             # interpreted as a list, even if there is only one of them:
2450             #
2451             # exec { $args[0] } @args # safe even with one-argument list
2452             # || die "can't exec @args: $!";
2453              
2454 329         3224 return CORE::system { $_[0] } @_; # safe even with one-argument list
  329         725  
2455             }
2456              
2457             #
2458             # EUC-TW order to character (with parameter)
2459             #
2460             sub Eeuctw::chr(;$) {
2461              
2462 329 0   0 0 36850666 my $c = @_ ? $_[0] : $_;
2463              
2464 0 0       0 if ($c == 0x00) {
2465 0         0 return "\x00";
2466             }
2467             else {
2468 0         0 my @chr = ();
2469 0         0 while ($c > 0) {
2470 0         0 unshift @chr, ($c % 0x100);
2471 0         0 $c = int($c / 0x100);
2472             }
2473 0         0 return pack 'C*', @chr;
2474             }
2475             }
2476              
2477             #
2478             # EUC-TW order to character (without parameter)
2479             #
2480             sub Eeuctw::chr_() {
2481              
2482 0     0 0 0 my $c = $_;
2483              
2484 0 0       0 if ($c == 0x00) {
2485 0         0 return "\x00";
2486             }
2487             else {
2488 0         0 my @chr = ();
2489 0         0 while ($c > 0) {
2490 0         0 unshift @chr, ($c % 0x100);
2491 0         0 $c = int($c / 0x100);
2492             }
2493 0         0 return pack 'C*', @chr;
2494             }
2495             }
2496              
2497             #
2498             # EUC-TW path globbing (with parameter)
2499             #
2500             sub Eeuctw::glob($) {
2501              
2502 0 0   0 0 0 if (wantarray) {
2503 0         0 my @glob = _DOS_like_glob(@_);
2504 0         0 for my $glob (@glob) {
2505 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2506             }
2507 0         0 return @glob;
2508             }
2509             else {
2510 0         0 my $glob = _DOS_like_glob(@_);
2511 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2512 0         0 return $glob;
2513             }
2514             }
2515              
2516             #
2517             # EUC-TW path globbing (without parameter)
2518             #
2519             sub Eeuctw::glob_() {
2520              
2521 0 0   0 0 0 if (wantarray) {
2522 0         0 my @glob = _DOS_like_glob();
2523 0         0 for my $glob (@glob) {
2524 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2525             }
2526 0         0 return @glob;
2527             }
2528             else {
2529 0         0 my $glob = _DOS_like_glob();
2530 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2531 0         0 return $glob;
2532             }
2533             }
2534              
2535             #
2536             # EUC-TW path globbing via File::DosGlob 1.10
2537             #
2538             # Often I confuse "_dosglob" and "_doglob".
2539             # So, I renamed "_dosglob" to "_DOS_like_glob".
2540             #
2541             my %iter;
2542             my %entries;
2543             sub _DOS_like_glob {
2544              
2545             # context (keyed by second cxix argument provided by core)
2546 0     0   0 my($expr,$cxix) = @_;
2547              
2548             # glob without args defaults to $_
2549 0 0       0 $expr = $_ if not defined $expr;
2550              
2551             # represents the current user's home directory
2552             #
2553             # 7.3. Expanding Tildes in Filenames
2554             # in Chapter 7. File Access
2555             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
2556             #
2557             # and File::HomeDir, File::HomeDir::Windows module
2558              
2559             # DOS-like system
2560 0 0       0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
2561 0         0 $expr =~ s{ \A ~ (?= [^/\\] ) }
  0         0  
2562             { my_home_MSWin32() }oxmse;
2563             }
2564              
2565             # UNIX-like system
2566 0 0 0     0 else {
  0         0  
2567             $expr =~ s{ \A ~ ( (?:[^\x8E\xA1-\xFE/]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])* ) }
2568             { $1 ? (CORE::eval(q{(getpwnam($1))[7]})||my_home()) : my_home() }oxmse;
2569             }
2570 0 0       0  
2571 0 0       0 # assume global context if not provided one
2572             $cxix = '_G_' if not defined $cxix;
2573             $iter{$cxix} = 0 if not exists $iter{$cxix};
2574 0 0       0  
2575 0         0 # if we're just beginning, do it all first
2576             if ($iter{$cxix} == 0) {
2577             $entries{$cxix} = [ _do_glob(1, _parse_line($expr)) ];
2578             }
2579 0 0       0  
2580 0         0 # chuck it all out, quick or slow
2581 0         0 if (wantarray) {
  0         0  
2582             delete $iter{$cxix};
2583             return @{delete $entries{$cxix}};
2584 0 0       0 }
  0         0  
2585 0         0 else {
  0         0  
2586             if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
2587             return shift @{$entries{$cxix}};
2588             }
2589 0         0 else {
2590 0         0 # return undef for EOL
2591 0         0 delete $iter{$cxix};
2592             delete $entries{$cxix};
2593             return undef;
2594             }
2595             }
2596             }
2597              
2598             #
2599             # EUC-TW path globbing subroutine
2600             #
2601 0     0   0 sub _do_glob {
2602 0         0  
2603 0         0 my($cond,@expr) = @_;
2604             my @glob = ();
2605             my $fix_drive_relative_paths = 0;
2606 0         0  
2607 0 0       0 OUTER:
2608 0 0       0 for my $expr (@expr) {
2609             next OUTER if not defined $expr;
2610 0         0 next OUTER if $expr eq '';
2611 0         0  
2612 0         0 my @matched = ();
2613 0         0 my @globdir = ();
2614 0         0 my $head = '.';
2615             my $pathsep = '/';
2616             my $tail;
2617 0 0       0  
2618 0         0 # if argument is within quotes strip em and do no globbing
2619 0 0       0 if ($expr =~ /\A " ((?:$q_char)*?) " \z/oxms) {
2620 0 0       0 $expr = $1;
2621 0         0 if ($cond eq 'd') {
2622             if (-d $expr) {
2623             push @glob, $expr;
2624             }
2625 0 0       0 }
2626 0         0 else {
2627             if (-e $expr) {
2628             push @glob, $expr;
2629 0         0 }
2630             }
2631             next OUTER;
2632             }
2633              
2634 0 0       0 # wildcards with a drive prefix such as h:*.pm must be changed
2635 0 0       0 # to h:./*.pm to expand correctly
2636 0         0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
2637             if ($expr =~ s# \A ((?:[A-Za-z]:)?) ([^\x8E\xA1-\xFE/\\]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF]) #$1./$2#oxms) {
2638             $fix_drive_relative_paths = 1;
2639             }
2640 0 0       0 }
2641 0 0       0  
2642 0         0 if (($head, $tail) = _parse_path($expr,$pathsep)) {
2643 0         0 if ($tail eq '') {
2644             push @glob, $expr;
2645 0 0       0 next OUTER;
2646 0 0       0 }
2647 0         0 if ($head =~ / \A (?:$q_char)*? [*?] /oxms) {
  0         0  
2648 0         0 if (@globdir = _do_glob('d', $head)) {
2649             push @glob, _do_glob($cond, map {"$_$pathsep$tail"} @globdir);
2650             next OUTER;
2651 0 0 0     0 }
2652 0         0 }
2653             if ($head eq '' or $head =~ /\A [A-Za-z]: \z/oxms) {
2654 0         0 $head .= $pathsep;
2655             }
2656             $expr = $tail;
2657             }
2658 0 0       0  
2659 0 0       0 # If file component has no wildcards, we can avoid opendir
2660 0         0 if ($expr !~ / \A (?:$q_char)*? [*?] /oxms) {
2661             if ($head eq '.') {
2662 0 0 0     0 $head = '';
2663 0         0 }
2664             if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
2665 0         0 $head .= $pathsep;
2666 0 0       0 }
2667 0 0       0 $head .= $expr;
2668 0         0 if ($cond eq 'd') {
2669             if (-d $head) {
2670             push @glob, $head;
2671             }
2672 0 0       0 }
2673 0         0 else {
2674             if (-e $head) {
2675             push @glob, $head;
2676 0         0 }
2677             }
2678 0 0       0 next OUTER;
2679 0         0 }
2680 0         0 opendir(*DIR, $head) or next OUTER;
2681             my @leaf = readdir DIR;
2682 0 0       0 closedir DIR;
2683 0         0  
2684             if ($head eq '.') {
2685 0 0 0     0 $head = '';
2686 0         0 }
2687             if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
2688             $head .= $pathsep;
2689 0         0 }
2690 0         0  
2691 0         0 my $pattern = '';
2692             while ($expr =~ / \G ($q_char) /oxgc) {
2693             my $char = $1;
2694              
2695             # 6.9. Matching Shell Globs as Regular Expressions
2696             # in Chapter 6. Pattern Matching
2697             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
2698 0 0       0 # (and so on)
    0          
    0          
2699 0         0  
2700             if ($char eq '*') {
2701             $pattern .= "(?:$your_char)*",
2702 0         0 }
2703             elsif ($char eq '?') {
2704             $pattern .= "(?:$your_char)?", # DOS style
2705             # $pattern .= "(?:$your_char)", # UNIX style
2706 0         0 }
2707             elsif ((my $fc = Eeuctw::fc($char)) ne $char) {
2708             $pattern .= $fc;
2709 0         0 }
2710             else {
2711             $pattern .= quotemeta $char;
2712 0     0   0 }
  0         0  
2713             }
2714             my $matchsub = sub { Eeuctw::fc($_[0]) =~ /\A $pattern \z/xms };
2715              
2716             # if ($@) {
2717             # print STDERR "$0: $@\n";
2718             # next OUTER;
2719             # }
2720 0         0  
2721 0 0 0     0 INNER:
2722 0         0 for my $leaf (@leaf) {
2723             if ($leaf eq '.' or $leaf eq '..') {
2724 0 0 0     0 next INNER;
2725 0         0 }
2726             if ($cond eq 'd' and not -d "$head$leaf") {
2727             next INNER;
2728 0 0       0 }
2729 0         0  
2730 0         0 if (&$matchsub($leaf)) {
2731             push @matched, "$head$leaf";
2732             next INNER;
2733             }
2734              
2735             # [DOS compatibility special case]
2736 0 0 0     0 # Failed, add a trailing dot and try again, but only...
      0        
2737              
2738             if (Eeuctw::index($leaf,'.') == -1 and # if name does not have a dot in it *and*
2739             CORE::length($leaf) <= 8 and # name is shorter than or equal to 8 chars *and*
2740 0 0       0 Eeuctw::index($pattern,'\\.') != -1 # pattern has a dot.
2741 0         0 ) {
2742 0         0 if (&$matchsub("$leaf.")) {
2743             push @matched, "$head$leaf";
2744             next INNER;
2745             }
2746 0 0       0 }
2747 0         0 }
2748             if (@matched) {
2749             push @glob, @matched;
2750 0 0       0 }
2751 0         0 }
2752 0         0 if ($fix_drive_relative_paths) {
2753             for my $glob (@glob) {
2754             $glob =~ s# \A ([A-Za-z]:) \./ #$1#oxms;
2755 0         0 }
2756             }
2757             return @glob;
2758             }
2759              
2760             #
2761             # EUC-TW parse line
2762             #
2763 0     0   0 sub _parse_line {
2764              
2765 0         0 my($line) = @_;
2766 0         0  
2767 0         0 $line .= ' ';
2768             my @piece = ();
2769             while ($line =~ /
2770             " ( (?>(?: [^\x8E\xA1-\xFE"] |[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] )* ) ) " (?>\s+) |
2771             ( (?>(?: [^\x8E\xA1-\xFE"\s]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] )* ) ) (?>\s+)
2772 0 0       0 /oxmsg
2773             ) {
2774 0         0 push @piece, defined($1) ? $1 : $2;
2775             }
2776             return @piece;
2777             }
2778              
2779             #
2780             # EUC-TW parse path
2781             #
2782 0     0   0 sub _parse_path {
2783              
2784 0         0 my($path,$pathsep) = @_;
2785 0         0  
2786 0         0 $path .= '/';
2787             my @subpath = ();
2788             while ($path =~ /
2789             ((?: [^\x8E\xA1-\xFE\/\\]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] )+?) [\/\\]
2790 0         0 /oxmsg
2791             ) {
2792             push @subpath, $1;
2793 0         0 }
2794 0         0  
2795 0         0 my $tail = pop @subpath;
2796             my $head = join $pathsep, @subpath;
2797             return $head, $tail;
2798             }
2799              
2800             #
2801             # via File::HomeDir::Windows 1.00
2802             #
2803             sub my_home_MSWin32 {
2804              
2805             # A lot of unix people and unix-derived tools rely on
2806 0 0 0 0 0 0 # the ability to overload HOME. We will support it too
    0 0        
    0 0        
      0        
      0        
2807 0         0 # so that they can replace raw HOME calls with File::HomeDir.
2808             if (exists $ENV{'HOME'} and $ENV{'HOME'}) {
2809             return $ENV{'HOME'};
2810             }
2811              
2812 0         0 # Do we have a user profile?
2813             elsif (exists $ENV{'USERPROFILE'} and $ENV{'USERPROFILE'}) {
2814             return $ENV{'USERPROFILE'};
2815             }
2816              
2817 0         0 # Some Windows use something like $ENV{'HOME'}
2818             elsif (exists $ENV{'HOMEDRIVE'} and exists $ENV{'HOMEPATH'} and $ENV{'HOMEDRIVE'} and $ENV{'HOMEPATH'}) {
2819             return join '', $ENV{'HOMEDRIVE'}, $ENV{'HOMEPATH'};
2820 0         0 }
2821              
2822             return undef;
2823             }
2824              
2825             #
2826             # via File::HomeDir::Unix 1.00
2827 0     0 0 0 #
2828             sub my_home {
2829 0 0 0     0 my $home;
    0 0        
2830 0         0  
2831             if (exists $ENV{'HOME'} and defined $ENV{'HOME'}) {
2832             $home = $ENV{'HOME'};
2833             }
2834              
2835             # This is from the original code, but I'm guessing
2836 0         0 # it means "login directory" and exists on some Unixes.
2837             elsif (exists $ENV{'LOGDIR'} and $ENV{'LOGDIR'}) {
2838             $home = $ENV{'LOGDIR'};
2839             }
2840              
2841             ### More-desperate methods
2842              
2843 0         0 # Light desperation on any (Unixish) platform
2844             else {
2845             $home = CORE::eval q{ (getpwuid($<))[7] };
2846             }
2847              
2848 0 0 0     0 # On Unix in general, a non-existant home means "no home"
2849 0         0 # For example, "nobody"-like users might use /nonexistant
2850             if (defined $home and ! -d($home)) {
2851 0         0 $home = undef;
2852             }
2853             return $home;
2854             }
2855              
2856             #
2857             # ${^PREMATCH}, $PREMATCH, $` the string preceding what was matched
2858 0 0   0 0 0 #
2859 0 0 0     0 sub Eeuctw::PREMATCH {
2860 0         0 if (defined($&)) {
2861             if (defined($1) and (CORE::substr($&,-CORE::length($1),CORE::length($1)) eq $1)) {
2862             return CORE::substr($&,0,CORE::length($&)-CORE::length($1));
2863 0         0 }
2864             else {
2865             croak 'Use of "$`", $PREMATCH, and ${^PREMATCH} need to /( capture all )/ in regexp';
2866             }
2867 0         0 }
2868             else {
2869 0         0 return '';
2870             }
2871             return $`;
2872             }
2873              
2874             #
2875             # ${^MATCH}, $MATCH, $& the string that matched
2876 0 0   0 0 0 #
2877 0 0       0 sub Eeuctw::MATCH {
2878 0         0 if (defined($&)) {
2879             if (defined($1)) {
2880             return $1;
2881 0         0 }
2882             else {
2883             croak 'Use of "$&", $MATCH, and ${^MATCH} need to /( capture all )/ in regexp';
2884             }
2885 0         0 }
2886             else {
2887 0         0 return '';
2888             }
2889             return $&;
2890             }
2891              
2892             #
2893             # ${^POSTMATCH}, $POSTMATCH, $' the string following what was matched
2894 0     0 0 0 #
2895             sub Eeuctw::POSTMATCH {
2896             return $';
2897             }
2898              
2899             #
2900             # EUC-TW character to order (with parameter)
2901             #
2902 0 0   0 1 0 sub EUCTW::ord(;$) {
2903              
2904 0 0       0 local $_ = shift if @_;
2905 0         0  
2906 0         0 if (/\A ($q_char) /oxms) {
2907 0         0 my @ord = unpack 'C*', $1;
2908 0         0 my $ord = 0;
2909             while (my $o = shift @ord) {
2910 0         0 $ord = $ord * 0x100 + $o;
2911             }
2912             return $ord;
2913 0         0 }
2914             else {
2915             return CORE::ord $_;
2916             }
2917             }
2918              
2919             #
2920             # EUC-TW character to order (without parameter)
2921             #
2922 0 0   0 0 0 sub EUCTW::ord_() {
2923 0         0  
2924 0         0 if (/\A ($q_char) /oxms) {
2925 0         0 my @ord = unpack 'C*', $1;
2926 0         0 my $ord = 0;
2927             while (my $o = shift @ord) {
2928 0         0 $ord = $ord * 0x100 + $o;
2929             }
2930             return $ord;
2931 0         0 }
2932             else {
2933             return CORE::ord $_;
2934             }
2935             }
2936              
2937             #
2938             # EUC-TW reverse
2939             #
2940 0 0   0 0 0 sub EUCTW::reverse(@) {
2941 0         0  
2942             if (wantarray) {
2943             return CORE::reverse @_;
2944             }
2945             else {
2946              
2947             # One of us once cornered Larry in an elevator and asked him what
2948             # problem he was solving with this, but he looked as far off into
2949             # the distance as he could in an elevator and said, "It seemed like
2950 0         0 # a good idea at the time."
2951              
2952             return join '', CORE::reverse(join('',@_) =~ /\G ($q_char) /oxmsg);
2953             }
2954             }
2955              
2956             #
2957             # EUC-TW getc (with parameter, without parameter)
2958             #
2959 0     0 0 0 sub EUCTW::getc(;*@) {
2960 0 0       0  
2961 0 0 0     0 my($package) = caller;
2962             my $fh = @_ ? qualify_to_ref(shift,$package) : \*STDIN;
2963 0         0 croak 'Too many arguments for EUCTW::getc' if @_ and not wantarray;
  0         0  
2964 0         0  
2965 0         0 my @length = sort { $a <=> $b } keys %range_tr;
2966 0         0 my $getc = '';
2967 0 0       0 for my $length ($length[0] .. $length[-1]) {
2968 0 0       0 $getc .= CORE::getc($fh);
2969 0 0       0 if (exists $range_tr{CORE::length($getc)}) {
2970             if ($getc =~ /\A ${Eeuctw::dot_s} \z/oxms) {
2971             return wantarray ? ($getc,@_) : $getc;
2972             }
2973 0 0       0 }
2974             }
2975             return wantarray ? ($getc,@_) : $getc;
2976             }
2977              
2978             #
2979             # EUC-TW length by character
2980             #
2981 0 0   0 1 0 sub EUCTW::length(;$) {
2982              
2983 0         0 local $_ = shift if @_;
2984 0         0  
2985             local @_ = /\G ($q_char) /oxmsg;
2986             return scalar @_;
2987             }
2988              
2989             #
2990             # EUC-TW substr by character
2991             #
2992             BEGIN {
2993              
2994             # P.232 The lvalue Attribute
2995             # in Chapter 6: Subroutines
2996             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2997              
2998             # P.336 The lvalue Attribute
2999             # in Chapter 7: Subroutines
3000             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3001              
3002             # P.144 8.4 Lvalue subroutines
3003             # in Chapter 8: perlsub: Perl subroutines
3004 329 50 0 329 1 272596 # 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  
3005              
3006             CORE::eval sprintf(<<'END', ($] >= 5.014000) ? ':lvalue' : '');
3007             # vv----------------------*******
3008             sub EUCTW::substr($$;$$) %s {
3009              
3010             my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
3011              
3012             # If the substring is beyond either end of the string, substr() returns the undefined
3013             # value and produces a warning. When used as an lvalue, specifying a substring that
3014             # is entirely outside the string raises an exception.
3015             # http://perldoc.perl.org/functions/substr.html
3016              
3017             # A return with no argument returns the scalar value undef in scalar context,
3018             # an empty list () in list context, and (naturally) nothing at all in void
3019             # context.
3020              
3021             my $offset = $_[1];
3022             if (($offset > scalar(@char)) or ($offset < (-1 * scalar(@char)))) {
3023             return;
3024             }
3025              
3026             # substr($string,$offset,$length,$replacement)
3027             if (@_ == 4) {
3028             my(undef,undef,$length,$replacement) = @_;
3029             my $substr = join '', splice(@char, $offset, $length, $replacement);
3030             $_[0] = join '', @char;
3031              
3032             # return $substr; this doesn't work, don't say "return"
3033             $substr;
3034             }
3035              
3036             # substr($string,$offset,$length)
3037             elsif (@_ == 3) {
3038             my(undef,undef,$length) = @_;
3039             my $octet_offset = 0;
3040             my $octet_length = 0;
3041             if ($offset == 0) {
3042             $octet_offset = 0;
3043             }
3044             elsif ($offset > 0) {
3045             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
3046             }
3047             else {
3048             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
3049             }
3050             if ($length == 0) {
3051             $octet_length = 0;
3052             }
3053             elsif ($length > 0) {
3054             $octet_length = CORE::length(join '', @char[$offset..$offset+$length-1]);
3055             }
3056             else {
3057             $octet_length = -1 * CORE::length(join '', @char[$#char+$length+1..$#char]);
3058             }
3059             CORE::substr($_[0], $octet_offset, $octet_length);
3060             }
3061              
3062             # substr($string,$offset)
3063             else {
3064             my $octet_offset = 0;
3065             if ($offset == 0) {
3066             $octet_offset = 0;
3067             }
3068             elsif ($offset > 0) {
3069             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
3070             }
3071             else {
3072             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
3073             }
3074             CORE::substr($_[0], $octet_offset);
3075             }
3076             }
3077             END
3078             }
3079              
3080             #
3081             # EUC-TW index by character
3082             #
3083 0     0 1 0 sub EUCTW::index($$;$) {
3084 0 0       0  
3085 0         0 my $index;
3086             if (@_ == 3) {
3087             $index = Eeuctw::index($_[0], $_[1], CORE::length(EUCTW::substr($_[0], 0, $_[2])));
3088 0         0 }
3089             else {
3090             $index = Eeuctw::index($_[0], $_[1]);
3091 0 0       0 }
3092 0         0  
3093             if ($index == -1) {
3094             return -1;
3095 0         0 }
3096             else {
3097             return EUCTW::length(CORE::substr $_[0], 0, $index);
3098             }
3099             }
3100              
3101             #
3102             # EUC-TW rindex by character
3103             #
3104 0     0 1 0 sub EUCTW::rindex($$;$) {
3105 0 0       0  
3106 0         0 my $rindex;
3107             if (@_ == 3) {
3108             $rindex = Eeuctw::rindex($_[0], $_[1], CORE::length(EUCTW::substr($_[0], 0, $_[2])));
3109 0         0 }
3110             else {
3111             $rindex = Eeuctw::rindex($_[0], $_[1]);
3112 0 0       0 }
3113 0         0  
3114             if ($rindex == -1) {
3115             return -1;
3116 0         0 }
3117             else {
3118             return EUCTW::length(CORE::substr $_[0], 0, $rindex);
3119             }
3120             }
3121              
3122 329     329   3087 # when 'm//', '/' means regexp match 'm//' and '?' means regexp match '??'
  329         744  
  329         40539  
3123             # when 'div', '/' means division operator and '?' means conditional operator (condition ? then : else)
3124             use vars qw($slash); $slash = 'm//';
3125              
3126             # ord() to ord() or EUCTW::ord()
3127             my $function_ord = 'ord';
3128              
3129             # ord to ord or EUCTW::ord_
3130             my $function_ord_ = 'ord';
3131              
3132             # reverse to reverse or EUCTW::reverse
3133             my $function_reverse = 'reverse';
3134              
3135             # getc to getc or EUCTW::getc
3136             my $function_getc = 'getc';
3137              
3138             # P.1023 Appendix W.9 Multibyte Anchoring
3139             # of ISBN 1-56592-224-7 CJKV Information Processing
3140              
3141             my $anchor = '';
3142 329     329   9432 $anchor = q{${Eeuctw::anchor}};
  329     0   2518  
  329         15820321  
3143              
3144             use vars qw($nest);
3145              
3146             # regexp of nested parens in qqXX
3147              
3148             # P.340 Matching Nested Constructs with Embedded Code
3149             # in Chapter 7: Perl
3150             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
3151              
3152             my $qq_paren = qr{(?{local $nest=0}) (?>(?:
3153             [^\x8E\xA1-\xFE\\()] |
3154             \( (?{$nest++}) |
3155             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3156             [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
3157             \\ [^\x8E\xA1-\xFEc] |
3158             \\c[\x40-\x5F] |
3159             \\ [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
3160             [\x00-\xFF]
3161             }xms;
3162              
3163             my $qq_brace = qr{(?{local $nest=0}) (?>(?:
3164             [^\x8E\xA1-\xFE\\{}] |
3165             \{ (?{$nest++}) |
3166             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3167             [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
3168             \\ [^\x8E\xA1-\xFEc] |
3169             \\c[\x40-\x5F] |
3170             \\ [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
3171             [\x00-\xFF]
3172             }xms;
3173              
3174             my $qq_bracket = qr{(?{local $nest=0}) (?>(?:
3175             [^\x8E\xA1-\xFE\\\[\]] |
3176             \[ (?{$nest++}) |
3177             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3178             [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
3179             \\ [^\x8E\xA1-\xFEc] |
3180             \\c[\x40-\x5F] |
3181             \\ [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
3182             [\x00-\xFF]
3183             }xms;
3184              
3185             my $qq_angle = qr{(?{local $nest=0}) (?>(?:
3186             [^\x8E\xA1-\xFE\\<>] |
3187             \< (?{$nest++}) |
3188             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3189             [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
3190             \\ [^\x8E\xA1-\xFEc] |
3191             \\c[\x40-\x5F] |
3192             \\ [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
3193             [\x00-\xFF]
3194             }xms;
3195              
3196             my $qq_scalar = qr{(?: \{ (?:$qq_brace)*? \} |
3197             (?: ::)? (?:
3198             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
3199             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
3200             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
3201             ))
3202             }xms;
3203              
3204             my $qq_variable = qr{(?: \{ (?:$qq_brace)*? \} |
3205             (?: ::)? (?:
3206             (?>[0-9]+) |
3207             [^\x8E\xA1-\xFEa-zA-Z_0-9\[\]] |
3208             ^[A-Z] |
3209             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
3210             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
3211             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
3212             ))
3213             }xms;
3214              
3215             my $qq_substr = qr{(?> Char::substr | EUCTW::substr | CORE::substr | substr ) (?>\s*) \( $qq_paren \)
3216             }xms;
3217              
3218             # regexp of nested parens in qXX
3219             my $q_paren = qr{(?{local $nest=0}) (?>(?:
3220             [^\x8E\xA1-\xFE()] |
3221             [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
3222             \( (?{$nest++}) |
3223             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3224             [\x00-\xFF]
3225             }xms;
3226              
3227             my $q_brace = qr{(?{local $nest=0}) (?>(?:
3228             [^\x8E\xA1-\xFE\{\}] |
3229             [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
3230             \{ (?{$nest++}) |
3231             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3232             [\x00-\xFF]
3233             }xms;
3234              
3235             my $q_bracket = qr{(?{local $nest=0}) (?>(?:
3236             [^\x8E\xA1-\xFE\[\]] |
3237             [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
3238             \[ (?{$nest++}) |
3239             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3240             [\x00-\xFF]
3241             }xms;
3242              
3243             my $q_angle = qr{(?{local $nest=0}) (?>(?:
3244             [^\x8E\xA1-\xFE<>] |
3245             [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
3246             \< (?{$nest++}) |
3247             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3248             [\x00-\xFF]
3249             }xms;
3250              
3251             my $matched = '';
3252             my $s_matched = '';
3253             $matched = q{$Eeuctw::matched};
3254             $s_matched = q{ Eeuctw::s_matched();};
3255              
3256             my $tr_variable = ''; # variable of tr///
3257             my $sub_variable = ''; # variable of s///
3258             my $bind_operator = ''; # =~ or !~
3259              
3260             my @heredoc = (); # here document
3261             my @heredoc_delimiter = ();
3262             my $here_script = ''; # here script
3263              
3264             #
3265             # escape EUC-TW script
3266 0 50   329 0 0 #
3267             sub EUCTW::escape(;$) {
3268             local($_) = $_[0] if @_;
3269              
3270             # P.359 The Study Function
3271             # in Chapter 7: Perl
3272 329         1108 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
3273              
3274             study $_; # Yes, I studied study yesterday.
3275              
3276             # while all script
3277              
3278             # 6.14. Matching from Where the Last Pattern Left Off
3279             # in Chapter 6. Pattern Matching
3280             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
3281             # (and so on)
3282              
3283             # one member of Tag-team
3284             #
3285             # P.128 Start of match (or end of previous match): \G
3286             # P.130 Advanced Use of \G with Perl
3287             # in Chapter 3: Overview of Regular Expression Features and Flavors
3288             # P.255 Use leading anchors
3289             # P.256 Expose ^ and \G at the front expressions
3290             # in Chapter 6: Crafting an Efficient Expression
3291             # P.315 "Tag-team" matching with /gc
3292             # in Chapter 7: Perl
3293 329         665 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
3294 329         637  
3295 329         1461 my $e_script = '';
3296             while (not /\G \z/oxgc) { # member
3297             $e_script .= EUCTW::escape_token();
3298 131742         219866 }
3299              
3300             return $e_script;
3301             }
3302              
3303             #
3304             # escape EUC-TW token of script
3305             #
3306             sub EUCTW::escape_token {
3307              
3308 329     131742 0 4656 # \n output here document
3309              
3310             my $ignore_modules = join('|', qw(
3311             utf8
3312             bytes
3313             charnames
3314             I18N::Japanese
3315             I18N::Collate
3316             I18N::JExt
3317             File::DosGlob
3318             Wild
3319             Wildcard
3320             Japanese
3321             ));
3322              
3323             # another member of Tag-team
3324             #
3325             # P.315 "Tag-team" matching with /gc
3326             # in Chapter 7: Perl
3327 131742 100 100     180658 # 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          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    100          
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    100          
    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          
3328 131742         6213038  
3329 22438 100       30158 if (/\G ( \n ) /oxgc) { # another member (and so on)
3330 22438         39792 my $heredoc = '';
3331             if (scalar(@heredoc_delimiter) >= 1) {
3332 191         245 $slash = 'm//';
3333 191         378  
3334             $heredoc = join '', @heredoc;
3335             @heredoc = ();
3336 191         709  
3337 191         326 # skip here document
3338             for my $heredoc_delimiter (@heredoc_delimiter) {
3339 199         1539 /\G .*? \n $heredoc_delimiter \n/xmsgc;
3340             }
3341 191         435 @heredoc_delimiter = ();
3342              
3343 191         263 $here_script = '';
3344             }
3345             return "\n" . $heredoc;
3346             }
3347 22438         65017  
3348             # ignore space, comment
3349             elsif (/\G ((?>\s+)|\#.*) /oxgc) { return $1; }
3350              
3351             # if (, elsif (, unless (, while (, until (, given (, and when (
3352              
3353             # given, when
3354              
3355             # P.225 The given Statement
3356             # in Chapter 15: Smart Matching and given-when
3357             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
3358              
3359             # P.133 The given Statement
3360             # in Chapter 4: Statements and Declarations
3361             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3362 31196         95003  
3363 2628         4224 elsif (/\G ( (?: if | elsif | unless | while | until | given | when ) (?>\s*) \( ) /oxgc) {
3364             $slash = 'm//';
3365             return $1;
3366             }
3367              
3368             # scalar variable ($scalar = ...) =~ tr///;
3369             # scalar variable ($scalar = ...) =~ s///;
3370              
3371             # state
3372              
3373             # P.68 Persistent, Private Variables
3374             # in Chapter 4: Subroutines
3375             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
3376              
3377             # P.160 Persistent Lexically Scoped Variables: state
3378             # in Chapter 4: Statements and Declarations
3379             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3380              
3381             # (and so on)
3382 2628         7897  
3383             elsif (/\G ( \( (?>\s*) (?: local \b | my \b | our \b | state \b )? (?>\s*) \$ $qq_scalar ) /oxgc) {
3384 145 50       442 my $e_string = e_string($1);
    50          
3385 145         5367  
3386 0         0 if (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
3387 0         0 $tr_variable = $e_string . e_string($1);
3388 0         0 $bind_operator = $2;
3389             $slash = 'm//';
3390             return '';
3391 0         0 }
3392 0         0 elsif (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
3393 0         0 $sub_variable = $e_string . e_string($1);
3394 0         0 $bind_operator = $2;
3395             $slash = 'm//';
3396             return '';
3397 0         0 }
3398 145         296 else {
3399             $slash = 'div';
3400             return $e_string;
3401             }
3402             }
3403              
3404 145         539 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeuctw::PREMATCH()
3405 4         10 elsif (/\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
3406             $slash = 'div';
3407             return q{Eeuctw::PREMATCH()};
3408             }
3409              
3410 4         11 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeuctw::MATCH()
3411 28         53 elsif (/\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
3412             $slash = 'div';
3413             return q{Eeuctw::MATCH()};
3414             }
3415              
3416 28         75 # $', ${'} --> $', ${'}
3417 1         2 elsif (/\G ( \$' | \$\{'\} ) /oxmsgc) {
3418             $slash = 'div';
3419             return $1;
3420             }
3421              
3422 1         3 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeuctw::POSTMATCH()
3423 3         7 elsif (/\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
3424             $slash = 'div';
3425             return q{Eeuctw::POSTMATCH()};
3426             }
3427              
3428             # scalar variable $scalar =~ tr///;
3429             # scalar variable $scalar =~ s///;
3430             # substr() =~ tr///;
3431 3         9 # substr() =~ s///;
3432             elsif (/\G ( \$ $qq_scalar | $qq_substr ) /oxgc) {
3433 2439 100       5592 my $scalar = e_string($1);
    100          
3434 2439         9867  
3435 9         15 if (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
3436 9         20 $tr_variable = $scalar;
3437 9         12 $bind_operator = $1;
3438             $slash = 'm//';
3439             return '';
3440 9         23 }
3441 119         225 elsif (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
3442 119         232 $sub_variable = $scalar;
3443 119         174 $bind_operator = $1;
3444             $slash = 'm//';
3445             return '';
3446 119         337 }
3447 2311         3818 else {
3448             $slash = 'div';
3449             return $scalar;
3450             }
3451             }
3452              
3453 2311         6279 # end of statement
3454             elsif (/\G ( [,;] ) /oxgc) {
3455             $slash = 'm//';
3456 8438         17773  
3457             # clear tr/// variable
3458             $tr_variable = '';
3459 8438         10118  
3460             # clear s/// variable
3461 8438         9787 $sub_variable = '';
3462              
3463 8438         22018 $bind_operator = '';
3464              
3465             return $1;
3466             }
3467              
3468 8438         28778 # bareword
3469             elsif (/\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
3470             return $1;
3471             }
3472              
3473 0         0 # $0 --> $0
3474 2         5 elsif (/\G ( \$ 0 ) /oxmsgc) {
3475             $slash = 'div';
3476             return $1;
3477 2         6 }
3478 0         0 elsif (/\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
3479             $slash = 'div';
3480             return $1;
3481             }
3482              
3483 0         0 # $$ --> $$
3484 1         2 elsif (/\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
3485             $slash = 'div';
3486             return $1;
3487             }
3488              
3489             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
3490 1         3 # $1, $2, $3 --> $1, $2, $3 otherwise
3491 129         255 elsif (/\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
3492             $slash = 'div';
3493             return e_capture($1);
3494 129         260 }
3495 0         0 elsif (/\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
3496             $slash = 'div';
3497             return e_capture($1);
3498             }
3499              
3500 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
3501 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
3502             $slash = 'div';
3503             return e_capture($1.'->'.$2);
3504             }
3505              
3506 0         0 # $$foo{ ... } --> $ $foo->{ ... }
3507 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
3508             $slash = 'div';
3509             return e_capture($1.'->'.$2);
3510             }
3511              
3512 0         0 # $$foo
3513 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
3514             $slash = 'div';
3515             return e_capture($1);
3516             }
3517              
3518 0         0 # ${ foo }
3519 0         0 elsif (/\G \$ (?>\s*) \{ ( (?>\s*) (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* ) (?>\s*) ) \} /oxmsgc) {
3520             $slash = 'div';
3521             return '${' . $1 . '}';
3522             }
3523              
3524 0         0 # ${ ... }
3525 0         0 elsif (/\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
3526             $slash = 'div';
3527             return e_capture($1);
3528             }
3529              
3530             # variable or function
3531 0         0 # $ @ % & * $ #
3532 149         270 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) {
3533             $slash = 'div';
3534             return $1;
3535             }
3536             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
3537 149         579 # $ @ # \ ' " / ? ( ) [ ] < >
3538 91         175 elsif (/\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
3539             $slash = 'div';
3540             return $1;
3541             }
3542              
3543 91         391 # while ()
3544             elsif (/\G \b (while (?>\s*) \( (?>\s*) <[\$]?[A-Za-z_][A-Za-z_0-9]*> (?>\s*) \)) \b /oxgc) {
3545             return $1;
3546             }
3547              
3548             # while () --- glob
3549              
3550             # avoid "Error: Runtime exception" of perl version 5.005_03
3551 0         0  
3552             elsif (/\G \b while (?>\s*) \( (?>\s*) < ((?:[^\x8E\xA1-\xFE>\0\a\e\f\n\r\t]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])+?) > (?>\s*) \) \b /oxgc) {
3553             return 'while ($_ = Eeuctw::glob("' . $1 . '"))';
3554             }
3555              
3556 0         0 # while (glob)
3557             elsif (/\G \b while (?>\s*) \( (?>\s*) glob (?>\s*) \) /oxgc) {
3558             return 'while ($_ = Eeuctw::glob_)';
3559             }
3560              
3561 0         0 # while (glob(WILDCARD))
3562             elsif (/\G \b while (?>\s*) \( (?>\s*) glob \b /oxgc) {
3563             return 'while ($_ = Eeuctw::glob';
3564             }
3565 0         0  
  425         929  
3566             # doit if, doit unless, doit while, doit until, doit for, doit when
3567             elsif (/\G \b ( if | unless | while | until | for | when ) \b /oxgc) { $slash = 'm//'; return $1; }
3568 425         1509  
  19         39  
3569 19         69 # subroutines of package Eeuctw
  0         0  
3570 0         0 elsif (/\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $slash = 'm//'; return $1; }
  13         20  
3571 13         54 elsif (/\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  0         0  
3572 0         0 elsif (/\G \b EUCTW::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  114         243  
3573 114         363 elsif (/\G \b Char::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval Char::escape'; }
  2         4  
3574 2         6 elsif (/\G \b EUCTW::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval EUCTW::escape'; }
  2         4  
3575 2         7 elsif (/\G \b bytes::substr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'substr'; }
  2         3  
3576 2         6 elsif (/\G \b chop \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeuctw::chop'; }
  0         0  
3577 0         0 elsif (/\G \b bytes::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'index'; }
  2         4  
3578 2         5 elsif (/\G \b Char::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::index'; }
  2         4  
3579 2         5 elsif (/\G \b EUCTW::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'EUCTW::index'; }
  2         6  
3580 2         5 elsif (/\G \b index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeuctw::index'; }
  0         0  
3581 0         0 elsif (/\G \b bytes::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'rindex'; }
  2         5  
3582 2         15 elsif (/\G \b Char::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::rindex'; }
  2         4  
3583 2         6 elsif (/\G \b EUCTW::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'EUCTW::rindex'; }
  1         3  
3584 1         3 elsif (/\G \b rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeuctw::rindex'; }
  0         0  
3585 0         0 elsif (/\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeuctw::lc'; }
  0         0  
3586 0         0 elsif (/\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeuctw::lcfirst'; }
  0         0  
3587 0         0 elsif (/\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeuctw::uc'; }
  3         7  
3588             elsif (/\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeuctw::ucfirst'; }
3589             elsif (/\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeuctw::fc'; }
3590 3         8  
  0         0  
3591 0         0 # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
  0         0  
3592 0         0 elsif (/\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $slash = 'm//'; return '-s ' . e_qq('', $1,$3,$2); }
  0         0  
3593 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\#) ((?:$qq_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3594 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\() ((?:$qq_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3595 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\{) ((?:$qq_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3596 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\[) ((?:$qq_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3597             elsif (/\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
3598 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  
3599 0         0  
  0         0  
3600 0         0 elsif (/\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $slash = 'm//'; return '-s ' . e_q ('', $1,$3,$2); }
  0         0  
3601 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\#) ((?:\\\#|\\\\|$q_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3602 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\() ((?:\\\)|\\\\|$q_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3603 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\{) ((?:\\\}|\\\\|$q_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3604 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\[) ((?:\\\]|\\\\|$q_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3605             elsif (/\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
3606             elsif (/\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
3607 0         0  
  0         0  
3608 0         0 elsif (/\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)* ) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ) )*) /oxgc)
  0         0  
3609 0         0 { $slash = 'm//'; return "-s $1"; }
  0         0  
3610 0         0 elsif (/\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $slash = 'm//'; return "-s ($1)"; }
  0         0  
3611             elsif (/\G -s (?= (?>\s+) [a-z]+) /oxgc) { $slash = 'm//'; return '-s'; }
3612 0         0 elsif (/\G -s (?>\s+) ((?>\w+)) /oxgc) { $slash = 'm//'; return "-s $1"; }
  2         4  
3613 2         7  
  2         5  
3614 2         5 elsif (/\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'length'; }
  36         67  
3615 36         114 elsif (/\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'chr'; }
  2         4  
3616 2         6 elsif (/\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeuctw::chr'; }
  2         5  
3617 2         7 elsif (/\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return 'ord'; }
  0         0  
3618 0         0 elsif (/\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return $function_ord; }
  0         0  
3619 0         0 elsif (/\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeuctw::glob'; }
  0         0  
3620 0         0 elsif (/\G \b lc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeuctw::lc_'; }
  0         0  
3621 0         0 elsif (/\G \b lcfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeuctw::lcfirst_'; }
  0         0  
3622 0         0 elsif (/\G \b uc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeuctw::uc_'; }
  0         0  
3623 0         0 elsif (/\G \b ucfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeuctw::ucfirst_'; }
  0         0  
3624             elsif (/\G \b fc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeuctw::fc_'; }
3625 0         0 elsif (/\G -s \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return '-s '; }
  0         0  
3626 0         0  
  0         0  
3627 0         0 elsif (/\G \b bytes::length \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'length'; }
  0         0  
3628 0         0 elsif (/\G \b bytes::chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'chr'; }
  0         0  
3629 0         0 elsif (/\G \b chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeuctw::chr_'; }
  2         5  
3630 2         7 elsif (/\G \b bytes::ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return 'ord'; }
  0         0  
3631 0         0 elsif (/\G \b ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return $function_ord_; }
  4         13  
3632 4         16 elsif (/\G \b glob \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeuctw::glob_'; }
  8         22  
3633             elsif (/\G \b reverse \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_reverse; }
3634             elsif (/\G \b getc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_getc; }
3635 8         30 # split
3636             elsif (/\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
3637 186         360 $slash = 'm//';
3638 186         269  
3639 186         620 my $e = '';
3640             while (/\G ( (?>\s+) | \( | \#.* ) /oxgc) {
3641             $e .= $1;
3642             }
3643 183 100       651  
  186 100       15881  
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    100          
    50          
    50          
    50          
3644             # end of split
3645             if (/\G (?= [,;\)\}\]] ) /oxgc) { return 'Eeuctw::split' . $e; }
3646 3         14  
3647             # split scalar value
3648             elsif (/\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { return 'Eeuctw::split' . $e . e_string($1); }
3649 1         6  
3650 0         0 # split literal space
3651 0         0 elsif (/\G \b qq (\#) [ ] (\#) /oxgc) { return 'Eeuctw::split' . $e . qq {qq$1 $2}; }
3652 0         0 elsif (/\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Eeuctw::split' . $e . qq{$1qq$2 $3}; }
3653 0         0 elsif (/\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Eeuctw::split' . $e . qq{$1qq$2 $3}; }
3654 0         0 elsif (/\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Eeuctw::split' . $e . qq{$1qq$2 $3}; }
3655 0         0 elsif (/\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Eeuctw::split' . $e . qq{$1qq$2 $3}; }
3656 0         0 elsif (/\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Eeuctw::split' . $e . qq{$1qq$2 $3}; }
3657 0         0 elsif (/\G \b q (\#) [ ] (\#) /oxgc) { return 'Eeuctw::split' . $e . qq {q$1 $2}; }
3658 0         0 elsif (/\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Eeuctw::split' . $e . qq {$1q$2 $3}; }
3659 0         0 elsif (/\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Eeuctw::split' . $e . qq {$1q$2 $3}; }
3660 0         0 elsif (/\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Eeuctw::split' . $e . qq {$1q$2 $3}; }
3661 0         0 elsif (/\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Eeuctw::split' . $e . qq {$1q$2 $3}; }
3662 13         62 elsif (/\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Eeuctw::split' . $e . qq {$1q$2 $3}; }
3663             elsif (/\G ' [ ] ' /oxgc) { return 'Eeuctw::split' . $e . qq {' '}; }
3664             elsif (/\G " [ ] " /oxgc) { return 'Eeuctw::split' . $e . qq {" "}; }
3665              
3666 2 0       12 # split qq//
  0         0  
3667             elsif (/\G \b (qq) \b /oxgc) {
3668 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq# # --> qr # #
3669 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
3670 0         0 while (not /\G \z/oxgc) {
3671 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3672 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq ( ) --> qr ( )
3673 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq { } --> qr { }
3674 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq [ ] --> qr [ ]
3675 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq < > --> qr < >
3676             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr','{','}',$2,''); } # qq | | --> qr { }
3677 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq * * --> qr * *
3678             }
3679             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3680             }
3681             }
3682              
3683 0 50       0 # split qr//
  36         640  
3684             elsif (/\G \b (qr) \b /oxgc) {
3685 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # qr# #
3686 36 50       124 else {
  36 50       5500  
    50          
    50          
    50          
    100          
    50          
    50          
3687 0         0 while (not /\G \z/oxgc) {
3688 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3689 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr ( )
3690 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr { }
3691 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr [ ]
3692 12         57 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr < >
3693 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # qr ' '
3694             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # qr | | --> qr { }
3695 24         127 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr * *
3696             }
3697             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3698             }
3699             }
3700              
3701 0 0       0 # split q//
  0         0  
3702             elsif (/\G \b (q) \b /oxgc) {
3703 0         0 if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q# # --> qr # #
3704 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
3705 0         0 while (not /\G \z/oxgc) {
3706 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3707 0         0 elsif (/\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q ( ) --> qr ( )
3708 0         0 elsif (/\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q { } --> qr { }
3709 0         0 elsif (/\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q [ ] --> qr [ ]
3710 0         0 elsif (/\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q < > --> qr < >
3711             elsif (/\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr','{','}',$2,''); } # q | | --> qr { }
3712 0         0 elsif (/\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q * * --> qr * *
3713             }
3714             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3715             }
3716             }
3717              
3718 0 50       0 # split m//
  48         750  
3719             elsif (/\G \b (m) \b /oxgc) {
3720 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # m# # --> qr # #
3721 48 50       155 else {
  48 50       6075  
    50          
    50          
    50          
    100          
    50          
    50          
3722 0         0 while (not /\G \z/oxgc) {
3723 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3724 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m ( ) --> qr ( )
3725 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m { } --> qr { }
3726 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m [ ] --> qr [ ]
3727 12         43 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m < > --> qr < >
3728 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # m ' ' --> qr ' '
3729             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # m | | --> qr { }
3730 36         214 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m * * --> qr * *
3731             }
3732             die __FILE__, ": Search pattern not terminated\n";
3733             }
3734             }
3735              
3736 0         0 # split ''
3737 0         0 elsif (/\G (\') /oxgc) {
3738 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
3739 0         0 while (not /\G \z/oxgc) {
3740 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3741 0         0 elsif (/\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
3742             elsif (/\G \' /oxgc) { return e_split_q($e.q{ qr},"'","'",$q_string,''); } # ' ' --> qr ' '
3743 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3744             }
3745             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3746             }
3747              
3748 0         0 # split ""
3749 0         0 elsif (/\G (\") /oxgc) {
3750 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
3751 0         0 while (not /\G \z/oxgc) {
3752 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
3753 0         0 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
3754             elsif (/\G \" /oxgc) { return e_split($e.q{ qr},'"','"',$qq_string,''); } # " " --> qr " "
3755 0         0 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
3756             }
3757             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3758             }
3759              
3760 0         0 # split //
3761 83         201 elsif (/\G (\/) /oxgc) {
3762 83 50       234 my $regexp = '';
  470 50       3484  
    100          
    50          
3763 0         0 while (not /\G \z/oxgc) {
3764 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
3765 83         419 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
3766             elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_split($e.q{ qr}, '/','/',$regexp,$1); } # / / --> qr / /
3767 387         1016 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
3768             }
3769             die __FILE__, ": Search pattern not terminated\n";
3770             }
3771             }
3772              
3773             # tr/// or y///
3774              
3775             # about [cdsrbB]* (/B modifier)
3776             #
3777             # P.559 appendix C
3778             # of ISBN 4-89052-384-7 Programming perl
3779             # (Japanese title is: Perl puroguramingu)
3780 0         0  
3781             elsif (/\G \b ( tr | y ) \b /oxgc) {
3782             my $ope = $1;
3783 11 50       26  
3784 11         182 # $1 $2 $3 $4 $5 $6
3785 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cdsrbB]*) /oxgc) { # tr# # #
3786             my @tr = ($tr_variable,$2);
3787             return e_tr(@tr,'',$4,$6);
3788 0         0 }
3789 11         19 else {
3790 11 50       31 my $e = '';
  11 50       968  
    50          
    50          
    50          
    50          
3791             while (not /\G \z/oxgc) {
3792 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3793 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
3794 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3795 0         0 while (not /\G \z/oxgc) {
3796 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3797 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) ( )
3798 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) { }
3799 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) [ ]
3800             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) < >
3801 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) * *
3802             }
3803             die __FILE__, ": Transliteration replacement not terminated\n";
3804 0         0 }
3805 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
3806 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3807 0         0 while (not /\G \z/oxgc) {
3808 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3809 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } ( )
3810 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } { }
3811 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } [ ]
3812             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } < >
3813 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } * *
3814             }
3815             die __FILE__, ": Transliteration replacement not terminated\n";
3816 0         0 }
3817 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
3818 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3819 0         0 while (not /\G \z/oxgc) {
3820 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3821 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] ( )
3822 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] { }
3823 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] [ ]
3824             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] < >
3825 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] * *
3826             }
3827             die __FILE__, ": Transliteration replacement not terminated\n";
3828 0         0 }
3829 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
3830 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3831 0         0 while (not /\G \z/oxgc) {
3832 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3833 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > ( )
3834 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > { }
3835 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > [ ]
3836             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > < >
3837 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > * *
3838             }
3839             die __FILE__, ": Transliteration replacement not terminated\n";
3840             }
3841 0         0 # $1 $2 $3 $4 $5 $6
3842 11         41 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { # tr * * *
3843             my @tr = ($tr_variable,$2);
3844             return e_tr(@tr,'',$4,$6);
3845 11         33 }
3846             }
3847             die __FILE__, ": Transliteration pattern not terminated\n";
3848             }
3849             }
3850              
3851 0         0 # qq//
3852             elsif (/\G \b (qq) \b /oxgc) {
3853             my $ope = $1;
3854 4209 100       9884  
3855 4209         8121 # if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_qq($ope,$1,$3,$2); } # qq# #
3856 40         62 if (/\G (\#) /oxgc) { # qq# #
3857 40 100       145 my $qq_string = '';
  1948 50       8702  
    100          
    50          
3858 80         173 while (not /\G \z/oxgc) {
3859 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
3860 40         88 elsif (/\G (\\\#) /oxgc) { $qq_string .= $1; }
3861             elsif (/\G (\#) /oxgc) { return e_qq($ope,'#','#',$qq_string); }
3862 1828         4963 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3863             }
3864             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3865             }
3866 0         0  
3867 4169         5924 else {
3868 4169 50       10000 my $e = '';
  4169 50       20363  
    100          
    50          
    100          
    50          
3869             while (not /\G \z/oxgc) {
3870             if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3871              
3872 0         0 # elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq ( )
3873 0         0 elsif (/\G (\() /oxgc) { # qq ( )
3874 0         0 my $qq_string = '';
3875 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
3876 0         0 while (not /\G \z/oxgc) {
3877 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
3878             elsif (/\G (\\\)) /oxgc) { $qq_string .= $1; }
3879 0 0       0 elsif (/\G (\() /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
3880 0         0 elsif (/\G (\)) /oxgc) {
3881             if (--$nest == 0) { return $e . e_qq($ope,'(',')',$qq_string); }
3882 0         0 else { $qq_string .= $1; }
3883             }
3884 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3885             }
3886             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3887             }
3888              
3889 0         0 # elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq { }
3890 4111         5503 elsif (/\G (\{) /oxgc) { # qq { }
3891 4111         5686 my $qq_string = '';
3892 4111 100       8229 local $nest = 1;
  172633 50       555175  
    100          
    100          
    50          
3893 708         1630 while (not /\G \z/oxgc) {
3894 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  1384         1913  
3895             elsif (/\G (\\\}) /oxgc) { $qq_string .= $1; }
3896 1384 100       2409 elsif (/\G (\{) /oxgc) { $qq_string .= $1; $nest++; }
  5495         8615  
3897 4111         8389 elsif (/\G (\}) /oxgc) {
3898             if (--$nest == 0) { return $e . e_qq($ope,'{','}',$qq_string); }
3899 1384         2800 else { $qq_string .= $1; }
3900             }
3901 165046         325063 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3902             }
3903             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3904             }
3905              
3906 0         0 # elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq [ ]
3907 0         0 elsif (/\G (\[) /oxgc) { # qq [ ]
3908 0         0 my $qq_string = '';
3909 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
3910 0         0 while (not /\G \z/oxgc) {
3911 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
3912             elsif (/\G (\\\]) /oxgc) { $qq_string .= $1; }
3913 0 0       0 elsif (/\G (\[) /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
3914 0         0 elsif (/\G (\]) /oxgc) {
3915             if (--$nest == 0) { return $e . e_qq($ope,'[',']',$qq_string); }
3916 0         0 else { $qq_string .= $1; }
3917             }
3918 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3919             }
3920             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3921             }
3922              
3923 0         0 # elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq < >
3924 38         70 elsif (/\G (\<) /oxgc) { # qq < >
3925 38         64 my $qq_string = '';
3926 38 100       115 local $nest = 1;
  1418 50       6302  
    50          
    100          
    50          
3927 22         53 while (not /\G \z/oxgc) {
3928 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
3929             elsif (/\G (\\\>) /oxgc) { $qq_string .= $1; }
3930 0 50       0 elsif (/\G (\<) /oxgc) { $qq_string .= $1; $nest++; }
  38         102  
3931 38         98 elsif (/\G (\>) /oxgc) {
3932             if (--$nest == 0) { return $e . e_qq($ope,'<','>',$qq_string); }
3933 0         0 else { $qq_string .= $1; }
3934             }
3935 1358         2732 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3936             }
3937             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3938             }
3939              
3940 0         0 # elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq * *
3941 20         26 elsif (/\G (\S) /oxgc) { # qq * *
3942 20         25 my $delimiter = $1;
3943 20 50       39 my $qq_string = '';
  840 50       2415  
    100          
    50          
3944 0         0 while (not /\G \z/oxgc) {
3945 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
3946 20         37 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $qq_string .= $1; }
3947             elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_qq($ope,$delimiter,$delimiter,$qq_string); }
3948 820         1628 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3949             }
3950             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3951 0         0 }
3952             }
3953             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3954             }
3955             }
3956              
3957 0         0 # qr//
3958 60 50       190 elsif (/\G \b (qr) \b /oxgc) {
3959 60         611 my $ope = $1;
3960             if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { # qr# # #
3961             return e_qr($ope,$1,$3,$2,$4);
3962 0         0 }
3963 60         96 else {
3964 60 50       162 my $e = '';
  60 50       4137  
    100          
    50          
    50          
    100          
    50          
    50          
3965 0         0 while (not /\G \z/oxgc) {
3966 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3967 1         7 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr ( )
3968 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr { }
3969 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr [ ]
3970 14         57 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr < >
3971 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # qr ' '
3972             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # qr | | --> qr { }
3973 45         158 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr * *
3974             }
3975             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3976             }
3977             }
3978              
3979 0         0 # qw//
3980 34 50       129 elsif (/\G \b (qw) \b /oxgc) {
3981 34         137 my $ope = $1;
3982             if (/\G (\#) (.*?) (\#) /oxmsgc) { # qw# #
3983             return e_qw($ope,$1,$3,$2);
3984 0         0 }
3985 34         56 else {
3986 34 50       96 my $e = '';
  34 50       186  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
3987             while (not /\G \z/oxgc) {
3988 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3989 34         96  
3990             elsif (/\G (\() ([^(]*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
3991 0         0 elsif (/\G (\() ((?:$q_paren)*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
3992 0         0  
3993             elsif (/\G (\{) ([^{]*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
3994 0         0 elsif (/\G (\{) ((?:$q_brace)*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
3995 0         0  
3996             elsif (/\G (\[) ([^[]*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
3997 0         0 elsif (/\G (\[) ((?:$q_bracket)*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
3998 0         0  
3999             elsif (/\G (\<) ([^<]*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
4000 0         0 elsif (/\G (\<) ((?:$q_angle)*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
4001 0         0  
4002             elsif (/\G ([\x21-\x3F]) (.*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
4003 0         0 elsif (/\G (\S) ((?:$q_char)*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
4004             }
4005             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4006             }
4007             }
4008              
4009 0         0 # qx//
4010 2 50       5 elsif (/\G \b (qx) \b /oxgc) {
4011 2         37 my $ope = $1;
4012             if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
4013             return e_qq($ope,$1,$3,$2);
4014 0         0 }
4015 2         11 else {
4016 2 50       9 my $e = '';
  2 50       142  
    50          
    0          
    0          
    0          
    0          
4017 0         0 while (not /\G \z/oxgc) {
4018 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4019 2         6 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx ( )
4020 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx { }
4021 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx [ ]
4022 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx < >
4023             elsif (/\G (\') ((?:$qq_char)*?) (\') /oxgc) { return $e . e_q ($ope,$1,$3,$2); } # qx ' '
4024 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx * *
4025             }
4026             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4027             }
4028             }
4029              
4030 0         0 # q//
4031             elsif (/\G \b (q) \b /oxgc) {
4032             my $ope = $1;
4033              
4034             # if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_q($ope,$1,$3,$2); } # q# #
4035              
4036             # avoid "Error: Runtime exception" of perl version 5.005_03
4037 550 50       1652 # (and so on)
4038 550         1525  
4039 0         0 if (/\G (\#) /oxgc) { # q# #
4040 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
4041 0         0 while (not /\G \z/oxgc) {
4042 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4043 0         0 elsif (/\G (\\\#) /oxgc) { $q_string .= $1; }
4044             elsif (/\G (\#) /oxgc) { return e_q($ope,'#','#',$q_string); }
4045 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4046             }
4047             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4048             }
4049 0         0  
4050 550         943 else {
4051 550 50       1888 my $e = '';
  550 50       3163  
    100          
    50          
    100          
    50          
4052             while (not /\G \z/oxgc) {
4053             if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4054              
4055 0         0 # elsif (/\G (\() ((?:\\\)|\\\\|$q_paren)*?) (\)) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q ( )
4056 0         0 elsif (/\G (\() /oxgc) { # q ( )
4057 0         0 my $q_string = '';
4058 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
    0          
4059 0         0 while (not /\G \z/oxgc) {
4060 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4061 0         0 elsif (/\G (\\\)) /oxgc) { $q_string .= $1; }
  0         0  
4062             elsif (/\G (\\\() /oxgc) { $q_string .= $1; }
4063 0 0       0 elsif (/\G (\() /oxgc) { $q_string .= $1; $nest++; }
  0         0  
4064 0         0 elsif (/\G (\)) /oxgc) {
4065             if (--$nest == 0) { return $e . e_q($ope,'(',')',$q_string); }
4066 0         0 else { $q_string .= $1; }
4067             }
4068 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4069             }
4070             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4071             }
4072              
4073 0         0 # elsif (/\G (\{) ((?:\\\}|\\\\|$q_brace)*?) (\}) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q { }
4074 544         1040 elsif (/\G (\{) /oxgc) { # q { }
4075 544         966 my $q_string = '';
4076 544 50       1578 local $nest = 1;
  8103 50       36511  
    50          
    100          
    100          
    50          
4077 0         0 while (not /\G \z/oxgc) {
4078 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4079 0         0 elsif (/\G (\\\}) /oxgc) { $q_string .= $1; }
  114         173  
4080             elsif (/\G (\\\{) /oxgc) { $q_string .= $1; }
4081 114 100       198 elsif (/\G (\{) /oxgc) { $q_string .= $1; $nest++; }
  658         1474  
4082 544         1695 elsif (/\G (\}) /oxgc) {
4083             if (--$nest == 0) { return $e . e_q($ope,'{','}',$q_string); }
4084 114         224 else { $q_string .= $1; }
4085             }
4086 7331         14188 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4087             }
4088             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4089             }
4090              
4091 0         0 # elsif (/\G (\[) ((?:\\\]|\\\\|$q_bracket)*?) (\]) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q [ ]
4092 0         0 elsif (/\G (\[) /oxgc) { # q [ ]
4093 0         0 my $q_string = '';
4094 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
    0          
4095 0         0 while (not /\G \z/oxgc) {
4096 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4097 0         0 elsif (/\G (\\\]) /oxgc) { $q_string .= $1; }
  0         0  
4098             elsif (/\G (\\\[) /oxgc) { $q_string .= $1; }
4099 0 0       0 elsif (/\G (\[) /oxgc) { $q_string .= $1; $nest++; }
  0         0  
4100 0         0 elsif (/\G (\]) /oxgc) {
4101             if (--$nest == 0) { return $e . e_q($ope,'[',']',$q_string); }
4102 0         0 else { $q_string .= $1; }
4103             }
4104 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4105             }
4106             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4107             }
4108              
4109 0         0 # elsif (/\G (\<) ((?:\\\>|\\\\|$q_angle)*?) (\>) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q < >
4110 5         20 elsif (/\G (\<) /oxgc) { # q < >
4111 5         10 my $q_string = '';
4112 5 50       17 local $nest = 1;
  82 50       412  
    50          
    50          
    100          
    50          
4113 0         0 while (not /\G \z/oxgc) {
4114 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4115 0         0 elsif (/\G (\\\>) /oxgc) { $q_string .= $1; }
  0         0  
4116             elsif (/\G (\\\<) /oxgc) { $q_string .= $1; }
4117 0 50       0 elsif (/\G (\<) /oxgc) { $q_string .= $1; $nest++; }
  5         15  
4118 5         15 elsif (/\G (\>) /oxgc) {
4119             if (--$nest == 0) { return $e . e_q($ope,'<','>',$q_string); }
4120 0         0 else { $q_string .= $1; }
4121             }
4122 77         230 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4123             }
4124             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4125             }
4126              
4127 0         0 # elsif (/\G (\S) ((?:\\\1|\\\\|$q_char)*?) (\1) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q * *
4128 1         3 elsif (/\G (\S) /oxgc) { # q * *
4129 1         2 my $delimiter = $1;
4130 1 50       5 my $q_string = '';
  14 50       78  
    100          
    50          
4131 0         0 while (not /\G \z/oxgc) {
4132 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4133 1         3 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $q_string .= $1; }
4134             elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_q($ope,$delimiter,$delimiter,$q_string); }
4135 13         27 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4136             }
4137             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4138 0         0 }
4139             }
4140             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4141             }
4142             }
4143              
4144 0         0 # m//
4145 305 50       694 elsif (/\G \b (m) \b /oxgc) {
4146 305         2535 my $ope = $1;
4147             if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { # m# #
4148             return e_qr($ope,$1,$3,$2,$4);
4149 0         0 }
4150 305         502 else {
4151 305 50       945 my $e = '';
  305 50       22639  
    50          
    50          
    50          
    100          
    100          
    50          
    50          
4152 0         0 while (not /\G \z/oxgc) {
4153 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4154 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ( )
4155 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m { }
4156 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m [ ]
4157 30         214 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m < >
4158 25         77 elsif (/\G (\?) ((?:$qq_char)*?) (\?) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ? ?
4159 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # m ' '
4160             elsif (/\G ([*\-:\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # m | | --> m { }
4161 250         983 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m * *
4162             }
4163             die __FILE__, ": Search pattern not terminated\n";
4164             }
4165             }
4166              
4167             # s///
4168              
4169             # about [cegimosxpradlunbB]* (/cg modifier)
4170             #
4171             # P.67 Pattern-Matching Operators
4172             # of ISBN 0-596-00241-6 Perl in a Nutshell, Second Edition.
4173 0         0  
4174             elsif (/\G \b (s) \b /oxgc) {
4175             my $ope = $1;
4176 156 100       426  
4177 156         4468 # $1 $2 $3 $4 $5 $6
4178             if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cegimosxpradlunbB]*) /oxgc) { # s# # #
4179             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
4180 1         6 }
4181 155         321 else {
4182 155 50       481 my $e = '';
  155 50       35610  
    50          
    50          
    50          
    100          
    100          
    50          
    50          
4183             while (not /\G \z/oxgc) {
4184 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4185 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
4186 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
4187             while (not /\G \z/oxgc) {
4188 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4189 0         0 # $1 $2 $3 $4
4190 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4191 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4192 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4193 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4194 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4195 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4196 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4197             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4198 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4199             }
4200             die __FILE__, ": Substitution replacement not terminated\n";
4201 0         0 }
4202 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
4203 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
4204             while (not /\G \z/oxgc) {
4205 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4206 0         0 # $1 $2 $3 $4
4207 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4208 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4209 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4210 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4211 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4212 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4213 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4214             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4215 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4216             }
4217             die __FILE__, ": Substitution replacement not terminated\n";
4218 0         0 }
4219 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
4220 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
4221             while (not /\G \z/oxgc) {
4222 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4223 0         0 # $1 $2 $3 $4
4224 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4225 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4226 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4227 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4228 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4229             elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4230 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4231             }
4232             die __FILE__, ": Substitution replacement not terminated\n";
4233 0         0 }
4234 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
4235 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
4236             while (not /\G \z/oxgc) {
4237 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4238 0         0 # $1 $2 $3 $4
4239 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4240 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4241 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4242 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4243 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4244 0         0 elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4245 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4246             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4247 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4248             }
4249             die __FILE__, ": Substitution replacement not terminated\n";
4250             }
4251 0         0 # $1 $2 $3 $4 $5 $6
4252             elsif (/\G (\') ((?:$qq_char)*?) (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) {
4253             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
4254             }
4255 34         145 # $1 $2 $3 $4 $5 $6
4256             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
4257             return e_sub($sub_variable,'{',$2,'}','{',$4,'}',$6); # s | | | --> s { } { }
4258             }
4259 2         14 # $1 $2 $3 $4 $5 $6
4260             elsif (/\G (\$) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
4261             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
4262             }
4263 0         0 # $1 $2 $3 $4 $5 $6
4264             elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
4265             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
4266 119         666 }
4267             }
4268             die __FILE__, ": Substitution pattern not terminated\n";
4269             }
4270             }
4271 0         0  
4272 0         0 # require ignore module
4273 0         0 elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# require$1$2"; }
4274             elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x8E\xA1-\xFE#]) /oxmsgc) { return "# require$1\n$2"; }
4275             elsif (/\G \b require ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# require$1"; }
4276 0         0  
4277 66         545 # use strict; --> use strict; no strict qw(refs);
4278 0         0 elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "use$1 no strict qw(refs);$2"; }
4279             elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [^\x8E\xA1-\xFE#]) /oxmsgc) { return "use$1 no strict qw(refs);\n$2"; }
4280             elsif (/\G \b use ((?>\s+) strict) \b /oxmsgc) { return "use$1; no strict qw(refs)"; }
4281              
4282 0 50 33     0 # use 5.12.0; --> use 5.12.0; no strict qw(refs);
      33        
4283 3         36 elsif (/\G \b use (?>\s+) ((?>([1-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
4284             if (($2 >= 6) or (($2 == 5) and ($3 ge '012'))) {
4285             return "use $1; no strict qw(refs);";
4286 0         0 }
4287             else {
4288             return "use $1;";
4289             }
4290 3 0 0     17 }
      0        
4291 0         0 elsif (/\G \b use (?>\s+) ((?>v([0-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
4292             if (($2 >= 6) or (($2 == 5) and ($3 >= 12))) {
4293             return "use $1; no strict qw(refs);";
4294 0         0 }
4295             else {
4296             return "use $1;";
4297             }
4298             }
4299 0         0  
4300 2         14 # ignore use module
4301 0         0 elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# use$1$2"; }
4302             elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x8E\xA1-\xFE#]) /oxmsgc) { return "# use$1\n$2"; }
4303             elsif (/\G \b use ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# use$1"; }
4304 0         0  
4305 0         0 # ignore no module
4306 0         0 elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# no$1$2"; }
4307             elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x8E\xA1-\xFE#]) /oxmsgc) { return "# no$1\n$2"; }
4308             elsif (/\G \b no ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# no$1"; }
4309 0         0  
4310             # use else
4311             elsif (/\G \b use \b /oxmsgc) { return "use"; }
4312 0         0  
4313             # use else
4314             elsif (/\G \b no \b /oxmsgc) { return "no"; }
4315              
4316 2         9 # ''
4317 1850         3910 elsif (/\G (?
4318 1850 100       4821 my $q_string = '';
  11488 100       46958  
    100          
    50          
4319 4         11 while (not /\G \z/oxgc) {
4320 48         129 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4321 1850         4236 elsif (/\G (\\\') /oxgc) { $q_string .= $1; }
4322             elsif (/\G \' /oxgc) { return e_q('', "'","'",$q_string); }
4323 9586         20578 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4324             }
4325             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4326             }
4327              
4328 0         0 # ""
4329 2669         6700 elsif (/\G (\") /oxgc) {
4330 2669 100       6941 my $qq_string = '';
  50532 100       156090  
    100          
    50          
4331 109         235 while (not /\G \z/oxgc) {
4332 12         24 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
4333 2669         6192 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; }
4334             elsif (/\G \" /oxgc) { return e_qq('', '"','"',$qq_string); }
4335 47742         96826 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
4336             }
4337             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4338             }
4339              
4340 0         0 # ``
4341 1         4 elsif (/\G (\`) /oxgc) {
4342 1 50       5 my $qx_string = '';
  19 50       84  
    100          
    50          
4343 0         0 while (not /\G \z/oxgc) {
4344 0         0 if (/\G (\\\\) /oxgc) { $qx_string .= $1; }
4345 1         3 elsif (/\G (\\\`) /oxgc) { $qx_string .= $1; }
4346             elsif (/\G \` /oxgc) { return e_qq('', '`','`',$qx_string); }
4347 18         36 elsif (/\G ($q_char) /oxgc) { $qx_string .= $1; }
4348             }
4349             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4350             }
4351              
4352 0         0 # // --- not divide operator (num / num), not defined-or
4353 1070         2364 elsif (($slash eq 'm//') and /\G (\/) /oxgc) {
4354 1070 100       2852 my $regexp = '';
  10084 50       36868  
    100          
    50          
4355 1         3 while (not /\G \z/oxgc) {
4356 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
4357 1070         3263 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; }
4358             elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_qr('', '/','/',$regexp,$1); }
4359 9013         18643 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
4360             }
4361             die __FILE__, ": Search pattern not terminated\n";
4362             }
4363              
4364 0         0 # ?? --- not conditional operator (condition ? then : else)
4365 30         66 elsif (($slash eq 'm//') and /\G (\?) /oxgc) {
4366 30 50       75 my $regexp = '';
  122 50       492  
    100          
    50          
4367 0         0 while (not /\G \z/oxgc) {
4368 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
4369 30         73 elsif (/\G (\\\?) /oxgc) { $regexp .= $1; }
4370             elsif (/\G \? ([cgimosxpadlunbB]*) /oxgc) { return e_qr('m','?','?',$regexp,$1); }
4371 92         206 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
4372             }
4373             die __FILE__, ": Search pattern not terminated\n";
4374             }
4375 0         0  
  0         0  
4376             # <<>> (a safer ARGV)
4377             elsif (/\G ( <<>> ) /oxgc) { $slash = 'm//'; return $1; }
4378 0         0  
  0         0  
4379             # << (bit shift) --- not here document
4380             elsif (/\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) { $slash = 'm//'; return $1; }
4381              
4382 0         0 # <<~'HEREDOC'
4383 6         11 elsif (/\G ( <<~ [\t ]* '([a-zA-Z_0-9]*)' ) /oxgc) {
4384 6         10 $slash = 'm//';
4385             my $here_quote = $1;
4386             my $delimiter = $2;
4387 6 50       10  
4388 6         11 # get here document
4389 6         28 if ($here_script eq '') {
4390             $here_script = CORE::substr $_, pos $_;
4391 6 50       28 $here_script =~ s/.*?\n//oxm;
4392 6         53 }
4393 6         13 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4394 6         8 my $heredoc = $1;
4395 6         50 my $indent = $2;
4396 6         18 $heredoc =~ s{^$indent}{}msg; # no /ox
4397             push @heredoc, $heredoc . qq{\n$delimiter\n};
4398             push @heredoc_delimiter, qq{\\s*$delimiter};
4399 6         11 }
4400             else {
4401 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4402             }
4403             return qq{<<'$delimiter'};
4404             }
4405              
4406             # <<~\HEREDOC
4407              
4408             # P.66 2.6.6. "Here" Documents
4409             # in Chapter 2: Bits and Pieces
4410             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4411              
4412             # P.73 "Here" Documents
4413             # in Chapter 2: Bits and Pieces
4414             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4415 6         22  
4416 3         7 elsif (/\G ( <<~ \\([a-zA-Z_0-9]+) ) /oxgc) {
4417 3         7 $slash = 'm//';
4418             my $here_quote = $1;
4419             my $delimiter = $2;
4420 3 50       5  
4421 3         7 # get here document
4422 3         9 if ($here_script eq '') {
4423             $here_script = CORE::substr $_, pos $_;
4424 3 50       15 $here_script =~ s/.*?\n//oxm;
4425 3         41 }
4426 3         8 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4427 3         4 my $heredoc = $1;
4428 3         33 my $indent = $2;
4429 3         10 $heredoc =~ s{^$indent}{}msg; # no /ox
4430             push @heredoc, $heredoc . qq{\n$delimiter\n};
4431             push @heredoc_delimiter, qq{\\s*$delimiter};
4432 3         7 }
4433             else {
4434 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4435             }
4436             return qq{<<\\$delimiter};
4437             }
4438              
4439 3         12 # <<~"HEREDOC"
4440 6         11 elsif (/\G ( <<~ [\t ]* "([a-zA-Z_0-9]*)" ) /oxgc) {
4441 6         12 $slash = 'm//';
4442             my $here_quote = $1;
4443             my $delimiter = $2;
4444 6 50       8  
4445 6         12 # get here document
4446 6         27 if ($here_script eq '') {
4447             $here_script = CORE::substr $_, pos $_;
4448 6 50       35 $here_script =~ s/.*?\n//oxm;
4449 6         58 }
4450 6         9 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4451 6         10 my $heredoc = $1;
4452 6         54 my $indent = $2;
4453 6         14 $heredoc =~ s{^$indent}{}msg; # no /ox
4454             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4455             push @heredoc_delimiter, qq{\\s*$delimiter};
4456 6         14 }
4457             else {
4458 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4459             }
4460             return qq{<<"$delimiter"};
4461             }
4462              
4463 6         22 # <<~HEREDOC
4464 3         6 elsif (/\G ( <<~ ([a-zA-Z_0-9]+) ) /oxgc) {
4465 3         7 $slash = 'm//';
4466             my $here_quote = $1;
4467             my $delimiter = $2;
4468 3 50       5  
4469 3         8 # get here document
4470 3         10 if ($here_script eq '') {
4471             $here_script = CORE::substr $_, pos $_;
4472 3 50       23 $here_script =~ s/.*?\n//oxm;
4473 3         38 }
4474 3         7 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4475 3         5 my $heredoc = $1;
4476 3         39 my $indent = $2;
4477 3         12 $heredoc =~ s{^$indent}{}msg; # no /ox
4478             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4479             push @heredoc_delimiter, qq{\\s*$delimiter};
4480 3         8 }
4481             else {
4482 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4483             }
4484             return qq{<<$delimiter};
4485             }
4486              
4487 3         11 # <<~`HEREDOC`
4488 6         11 elsif (/\G ( <<~ [\t ]* `([a-zA-Z_0-9]*)` ) /oxgc) {
4489 6         10 $slash = 'm//';
4490             my $here_quote = $1;
4491             my $delimiter = $2;
4492 6 50       10  
4493 6         19 # get here document
4494 6         16 if ($here_script eq '') {
4495             $here_script = CORE::substr $_, pos $_;
4496 6 50       27 $here_script =~ s/.*?\n//oxm;
4497 6         52 }
4498 6         13 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4499 6         9 my $heredoc = $1;
4500 6         53 my $indent = $2;
4501 6         17 $heredoc =~ s{^$indent}{}msg; # no /ox
4502             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4503             push @heredoc_delimiter, qq{\\s*$delimiter};
4504 6         14 }
4505             else {
4506 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4507             }
4508             return qq{<<`$delimiter`};
4509             }
4510              
4511 6         24 # <<'HEREDOC'
4512 80         159 elsif (/\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
4513 80         176 $slash = 'm//';
4514             my $here_quote = $1;
4515             my $delimiter = $2;
4516 80 100       126  
4517 80         148 # get here document
4518 77         337 if ($here_script eq '') {
4519             $here_script = CORE::substr $_, pos $_;
4520 77 50       401 $here_script =~ s/.*?\n//oxm;
4521 80         664 }
4522 80         300 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4523             push @heredoc, $1 . qq{\n$delimiter\n};
4524             push @heredoc_delimiter, $delimiter;
4525 80         135 }
4526             else {
4527 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4528             }
4529             return $here_quote;
4530             }
4531              
4532             # <<\HEREDOC
4533              
4534             # P.66 2.6.6. "Here" Documents
4535             # in Chapter 2: Bits and Pieces
4536             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4537              
4538             # P.73 "Here" Documents
4539             # in Chapter 2: Bits and Pieces
4540             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4541 80         293  
4542 2         5 elsif (/\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
4543 2         5 $slash = 'm//';
4544             my $here_quote = $1;
4545             my $delimiter = $2;
4546 2 100       3  
4547 2         7 # get here document
4548 1         6 if ($here_script eq '') {
4549             $here_script = CORE::substr $_, pos $_;
4550 1 50       6 $here_script =~ s/.*?\n//oxm;
4551 2         37 }
4552 2         8 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4553             push @heredoc, $1 . qq{\n$delimiter\n};
4554             push @heredoc_delimiter, $delimiter;
4555 2         4 }
4556             else {
4557 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4558             }
4559             return $here_quote;
4560             }
4561              
4562 2         9 # <<"HEREDOC"
4563 39         93 elsif (/\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
4564 39         90 $slash = 'm//';
4565             my $here_quote = $1;
4566             my $delimiter = $2;
4567 39 100       431  
4568 39         99 # get here document
4569 38         286 if ($here_script eq '') {
4570             $here_script = CORE::substr $_, pos $_;
4571 38 50       208 $here_script =~ s/.*?\n//oxm;
4572 39         480 }
4573 39         134 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4574             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4575             push @heredoc_delimiter, $delimiter;
4576 39         106 }
4577             else {
4578 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4579             }
4580             return $here_quote;
4581             }
4582              
4583 39         163 # <
4584 54         127 elsif (/\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
4585 54         114 $slash = 'm//';
4586             my $here_quote = $1;
4587             my $delimiter = $2;
4588 54 100       106  
4589 54         129 # get here document
4590 51         441 if ($here_script eq '') {
4591             $here_script = CORE::substr $_, pos $_;
4592 51 50       392 $here_script =~ s/.*?\n//oxm;
4593 54         716 }
4594 54         184 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4595             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4596             push @heredoc_delimiter, $delimiter;
4597 54         519 }
4598             else {
4599 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4600             }
4601             return $here_quote;
4602             }
4603              
4604 54         297 # <<`HEREDOC`
4605 0         0 elsif (/\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
4606 0         0 $slash = 'm//';
4607             my $here_quote = $1;
4608             my $delimiter = $2;
4609 0 0       0  
4610 0         0 # get here document
4611 0         0 if ($here_script eq '') {
4612             $here_script = CORE::substr $_, pos $_;
4613 0 0       0 $here_script =~ s/.*?\n//oxm;
4614 0         0 }
4615 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4616             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4617             push @heredoc_delimiter, $delimiter;
4618 0         0 }
4619             else {
4620 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4621             }
4622             return $here_quote;
4623             }
4624              
4625 0         0 # <<= <=> <= < operator
4626             elsif (/\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) {
4627             return $1;
4628             }
4629              
4630 13         63 #
4631             elsif (/\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) {
4632             return $1;
4633             }
4634              
4635             # --- glob
4636              
4637             # avoid "Error: Runtime exception" of perl version 5.005_03
4638 0         0  
4639             elsif (/\G < ((?:[^\x8E\xA1-\xFE>\0\a\e\f\n\r\t]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF])+?) > /oxgc) {
4640             return 'Eeuctw::glob("' . $1 . '")';
4641             }
4642 0         0  
4643             # __DATA__
4644             elsif (/\G ^ ( __DATA__ \n .*) \z /oxmsgc) { return $1; }
4645 0         0  
4646             # __END__
4647             elsif (/\G ^ ( __END__ \n .*) \z /oxmsgc) { return $1; }
4648              
4649             # \cD Control-D
4650              
4651             # P.68 2.6.8. Other Literal Tokens
4652             # in Chapter 2: Bits and Pieces
4653             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4654              
4655             # P.76 Other Literal Tokens
4656             # in Chapter 2: Bits and Pieces
4657 329         2841 # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4658              
4659             elsif (/\G ( \cD .*) \z /oxmsgc) { return $1; }
4660 0         0  
4661             # \cZ Control-Z
4662             elsif (/\G ( \cZ .*) \z /oxmsgc) { return $1; }
4663              
4664             # any operator before div
4665             elsif (/\G (
4666             -- | \+\+ |
4667 0         0 [\)\}\]]
  9450         19842  
4668              
4669             ) /oxgc) { $slash = 'div'; return $1; }
4670              
4671             # yada-yada or triple-dot operator
4672             elsif (/\G (
4673 9450         45357 \.\.\.
  7         12  
4674              
4675             ) /oxgc) { $slash = 'm//'; return q{die('Unimplemented')}; }
4676              
4677             # any operator before m//
4678              
4679             # //, //= (defined-or)
4680              
4681             # P.164 Logical Operators
4682             # in Chapter 10: More Control Structures
4683             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
4684              
4685             # P.119 C-Style Logical (Short-Circuit) Operators
4686             # in Chapter 3: Unary and Binary Operators
4687             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4688              
4689             # (and so on)
4690              
4691             # ~~
4692              
4693             # P.221 The Smart Match Operator
4694             # in Chapter 15: Smart Matching and given-when
4695             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
4696              
4697             # P.112 Smartmatch Operator
4698             # in Chapter 3: Unary and Binary Operators
4699             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4700              
4701             # (and so on)
4702              
4703             elsif (/\G ((?>
4704              
4705             !~~ | !~ | != | ! |
4706             %= | % |
4707             &&= | && | &= | &\.= | &\. | & |
4708             -= | -> | - |
4709             :(?>\s*)= |
4710             : |
4711             <<>> |
4712             <<= | <=> | <= | < |
4713             == | => | =~ | = |
4714             >>= | >> | >= | > |
4715             \*\*= | \*\* | \*= | \* |
4716             \+= | \+ |
4717             \.\. | \.= | \. |
4718             \/\/= | \/\/ |
4719             \/= | \/ |
4720             \? |
4721             \\ |
4722             \^= | \^\.= | \^\. | \^ |
4723             \b x= |
4724             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
4725             ~~ | ~\. | ~ |
4726             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
4727             \b(?: print )\b |
4728              
4729 7         36 [,;\(\{\[]
  16286         31690  
4730              
4731             )) /oxgc) { $slash = 'm//'; return $1; }
4732 16286         75613  
  25911         51664  
4733             # other any character
4734             elsif (/\G ($q_char) /oxgc) { $slash = 'div'; return $1; }
4735              
4736 25911         125424 # system error
4737             else {
4738             die __FILE__, ": Oops, this shouldn't happen!\n";
4739             }
4740             }
4741              
4742 0     2626 0 0 # escape EUC-TW string
4743 2626         6483 sub e_string {
4744             my($string) = @_;
4745 2626         5087 my $e_string = '';
4746              
4747             local $slash = 'm//';
4748              
4749             # P.1024 Appendix W.10 Multibyte Processing
4750             # of ISBN 1-56592-224-7 CJKV Information Processing
4751 2626         3669 # (and so on)
4752              
4753             my @char = $string =~ / \G (?>[^\x8E\xA1-\xFE\\]|\\$q_char|$q_char) /oxmsg;
4754 2626 100 66     28468  
4755 2626 50       11551 # without { ... }
4756 2588         5984 if (not (grep(/\A \{ \z/xms, @char) and grep(/\A \} \z/xms, @char))) {
4757             if ($string !~ /<
4758             return $string;
4759             }
4760             }
4761 2588         6157  
4762 38 50       111 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          
    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          
4763             while ($string !~ /\G \z/oxgc) {
4764             if (0) {
4765             }
4766 288         22485  
4767 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> @{[Eeuctw::PREMATCH()]}
4768 0         0 elsif ($string =~ /\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
4769             $e_string .= q{Eeuctw::PREMATCH()};
4770             $slash = 'div';
4771             }
4772              
4773 0         0 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> @{[Eeuctw::MATCH()]}
4774 0         0 elsif ($string =~ /\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
4775             $e_string .= q{Eeuctw::MATCH()};
4776             $slash = 'div';
4777             }
4778              
4779 0         0 # $', ${'} --> $', ${'}
4780 0         0 elsif ($string =~ /\G ( \$' | \$\{'\} ) /oxmsgc) {
4781             $e_string .= $1;
4782             $slash = 'div';
4783             }
4784              
4785 0         0 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> @{[Eeuctw::POSTMATCH()]}
4786 0         0 elsif ($string =~ /\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
4787             $e_string .= q{Eeuctw::POSTMATCH()};
4788             $slash = 'div';
4789             }
4790              
4791 0         0 # bareword
4792 0         0 elsif ($string =~ /\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
4793             $e_string .= $1;
4794             $slash = 'div';
4795             }
4796              
4797 0         0 # $0 --> $0
4798 0         0 elsif ($string =~ /\G ( \$ 0 ) /oxmsgc) {
4799             $e_string .= $1;
4800             $slash = 'div';
4801 0         0 }
4802 0         0 elsif ($string =~ /\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
4803             $e_string .= $1;
4804             $slash = 'div';
4805             }
4806              
4807 0         0 # $$ --> $$
4808 0         0 elsif ($string =~ /\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
4809             $e_string .= $1;
4810             $slash = 'div';
4811             }
4812              
4813             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
4814 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
4815 0         0 elsif ($string =~ /\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
4816             $e_string .= e_capture($1);
4817             $slash = 'div';
4818 0         0 }
4819 0         0 elsif ($string =~ /\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
4820             $e_string .= e_capture($1);
4821             $slash = 'div';
4822             }
4823              
4824 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
4825 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
4826             $e_string .= e_capture($1.'->'.$2);
4827             $slash = 'div';
4828             }
4829              
4830 0         0 # $$foo{ ... } --> $ $foo->{ ... }
4831 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
4832             $e_string .= e_capture($1.'->'.$2);
4833             $slash = 'div';
4834             }
4835              
4836 0         0 # $$foo
4837 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
4838             $e_string .= e_capture($1);
4839             $slash = 'div';
4840             }
4841              
4842 0         0 # ${ foo }
4843 0         0 elsif ($string =~ /\G \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} /oxmsgc) {
4844             $e_string .= '${' . $1 . '}';
4845             $slash = 'div';
4846             }
4847              
4848 0         0 # ${ ... }
4849 3         9 elsif ($string =~ /\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
4850             $e_string .= e_capture($1);
4851             $slash = 'div';
4852             }
4853              
4854             # variable or function
4855 3         17 # $ @ % & * $ #
4856 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) {
4857             $e_string .= $1;
4858             $slash = 'div';
4859             }
4860             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
4861 0         0 # $ @ # \ ' " / ? ( ) [ ] < >
4862 0         0 elsif ($string =~ /\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
4863             $e_string .= $1;
4864             $slash = 'div';
4865             }
4866 0         0  
  0         0  
4867 0         0 # subroutines of package Eeuctw
  0         0  
4868 0         0 elsif ($string =~ /\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $e_string .= $1; $slash = 'm//'; }
  0         0  
4869 0         0 elsif ($string =~ /\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
4870 0         0 elsif ($string =~ /\G \b EUCTW::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
4871 0         0 elsif ($string =~ /\G \b Char::eval \b /oxgc) { $e_string .= 'eval Char::escape'; $slash = 'm//'; }
  0         0  
4872 0         0 elsif ($string =~ /\G \b EUCTW::eval \b /oxgc) { $e_string .= 'eval EUCTW::escape'; $slash = 'm//'; }
  0         0  
4873 0         0 elsif ($string =~ /\G \b bytes::substr \b /oxgc) { $e_string .= 'substr'; $slash = 'm//'; }
  0         0  
4874 0         0 elsif ($string =~ /\G \b chop \b /oxgc) { $e_string .= 'Eeuctw::chop'; $slash = 'm//'; }
  0         0  
4875 0         0 elsif ($string =~ /\G \b bytes::index \b /oxgc) { $e_string .= 'index'; $slash = 'm//'; }
  0         0  
4876 0         0 elsif ($string =~ /\G \b Char::index \b /oxgc) { $e_string .= 'Char::index'; $slash = 'm//'; }
  0         0  
4877 0         0 elsif ($string =~ /\G \b EUCTW::index \b /oxgc) { $e_string .= 'EUCTW::index'; $slash = 'm//'; }
  0         0  
4878 0         0 elsif ($string =~ /\G \b index \b /oxgc) { $e_string .= 'Eeuctw::index'; $slash = 'm//'; }
  0         0  
4879 0         0 elsif ($string =~ /\G \b bytes::rindex \b /oxgc) { $e_string .= 'rindex'; $slash = 'm//'; }
  0         0  
4880 0         0 elsif ($string =~ /\G \b Char::rindex \b /oxgc) { $e_string .= 'Char::rindex'; $slash = 'm//'; }
  0         0  
4881 0         0 elsif ($string =~ /\G \b EUCTW::rindex \b /oxgc) { $e_string .= 'EUCTW::rindex'; $slash = 'm//'; }
  0         0  
4882 0         0 elsif ($string =~ /\G \b rindex \b /oxgc) { $e_string .= 'Eeuctw::rindex'; $slash = 'm//'; }
  0         0  
4883 0         0 elsif ($string =~ /\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeuctw::lc'; $slash = 'm//'; }
  0         0  
4884 0         0 elsif ($string =~ /\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeuctw::lcfirst'; $slash = 'm//'; }
  0         0  
4885 0         0 elsif ($string =~ /\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeuctw::uc'; $slash = 'm//'; }
  0         0  
4886             elsif ($string =~ /\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeuctw::ucfirst'; $slash = 'm//'; }
4887             elsif ($string =~ /\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeuctw::fc'; $slash = 'm//'; }
4888 0         0  
  0         0  
4889 0         0 # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
  0         0  
4890 0         0 elsif ($string =~ /\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $e_string .= '-s ' . e_qq('', $1,$3,$2); $slash = 'm//'; }
  0         0  
4891 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  
4892 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  
4893 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  
4894 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  
4895             elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
4896 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  
4897 0         0  
  0         0  
4898 0         0 elsif ($string =~ /\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $e_string .= '-s ' . e_q ('', $1,$3,$2); $slash = 'm//'; }
  0         0  
4899 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  
4900 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  
4901 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  
4902 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  
4903             elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
4904             elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
4905 0         0  
  0         0  
4906 0         0 elsif ($string =~ /\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)*) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ))*) /oxgc)
  0         0  
4907 0         0 { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
4908 0         0 elsif ($string =~ /\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $e_string .= "-s ($1)"; $slash = 'm//'; }
  0         0  
4909             elsif ($string =~ /\G -s (?= (?>\s+) [a-z]+) /oxgc) { $e_string .= '-s'; $slash = 'm//'; }
4910 0         0 elsif ($string =~ /\G -s (?>\s+) ((?>\w+)) /oxgc) { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
4911 0         0  
  0         0  
4912 0         0 elsif ($string =~ /\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
4913 0         0 elsif ($string =~ /\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
4914 0         0 elsif ($string =~ /\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeuctw::chr'; $slash = 'm//'; }
  0         0  
4915 0         0 elsif ($string =~ /\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
4916 0         0 elsif ($string =~ /\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= $function_ord; $slash = 'div'; }
  0         0  
4917 0         0 elsif ($string =~ /\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeuctw::glob'; $slash = 'm//'; }
  0         0  
4918 0         0 elsif ($string =~ /\G \b lc \b /oxgc) { $e_string .= 'Eeuctw::lc_'; $slash = 'm//'; }
  0         0  
4919 0         0 elsif ($string =~ /\G \b lcfirst \b /oxgc) { $e_string .= 'Eeuctw::lcfirst_'; $slash = 'm//'; }
  0         0  
4920 0         0 elsif ($string =~ /\G \b uc \b /oxgc) { $e_string .= 'Eeuctw::uc_'; $slash = 'm//'; }
  0         0  
4921 0         0 elsif ($string =~ /\G \b ucfirst \b /oxgc) { $e_string .= 'Eeuctw::ucfirst_'; $slash = 'm//'; }
  0         0  
4922             elsif ($string =~ /\G \b fc \b /oxgc) { $e_string .= 'Eeuctw::fc_'; $slash = 'm//'; }
4923 0         0 elsif ($string =~ /\G -s \b /oxgc) { $e_string .= '-s '; $slash = 'm//'; }
  0         0  
4924 0         0  
  0         0  
4925 0         0 elsif ($string =~ /\G \b bytes::length \b /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
4926 0         0 elsif ($string =~ /\G \b bytes::chr \b /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
4927 0         0 elsif ($string =~ /\G \b chr \b /oxgc) { $e_string .= 'Eeuctw::chr_'; $slash = 'm//'; }
  0         0  
4928 0         0 elsif ($string =~ /\G \b bytes::ord \b /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
4929 0         0 elsif ($string =~ /\G \b ord \b /oxgc) { $e_string .= $function_ord_; $slash = 'div'; }
  0         0  
4930 0         0 elsif ($string =~ /\G \b glob \b /oxgc) { $e_string .= 'Eeuctw::glob_'; $slash = 'm//'; }
  0         0  
4931             elsif ($string =~ /\G \b reverse \b /oxgc) { $e_string .= $function_reverse; $slash = 'm//'; }
4932             elsif ($string =~ /\G \b getc \b /oxgc) { $e_string .= $function_getc; $slash = 'm//'; }
4933 0         0 # split
4934             elsif ($string =~ /\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
4935 0         0 $slash = 'm//';
4936 0         0  
4937 0         0 my $e = '';
4938             while ($string =~ /\G ( (?>\s+) | \( | \#.* ) /oxgc) {
4939             $e .= $1;
4940             }
4941 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          
4942             # end of split
4943             if ($string =~ /\G (?= [,;\)\}\]] ) /oxgc) { return 'Eeuctw::split' . $e; }
4944 0         0  
  0         0  
4945             # split scalar value
4946             elsif ($string =~ /\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { $e_string .= 'Eeuctw::split' . $e . e_string($1); next E_STRING_LOOP; }
4947 0         0  
  0         0  
4948 0         0 # split literal space
  0         0  
4949 0         0 elsif ($string =~ /\G \b qq (\#) [ ] (\#) /oxgc) { $e_string .= 'Eeuctw::split' . $e . qq {qq$1 $2}; next E_STRING_LOOP; }
  0         0  
4950 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Eeuctw::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4951 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Eeuctw::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4952 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Eeuctw::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4953 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Eeuctw::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4954 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { $e_string .= 'Eeuctw::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4955 0         0 elsif ($string =~ /\G \b q (\#) [ ] (\#) /oxgc) { $e_string .= 'Eeuctw::split' . $e . qq {q$1 $2}; next E_STRING_LOOP; }
  0         0  
4956 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Eeuctw::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4957 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Eeuctw::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4958 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Eeuctw::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4959 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Eeuctw::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4960 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { $e_string .= 'Eeuctw::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4961             elsif ($string =~ /\G ' [ ] ' /oxgc) { $e_string .= 'Eeuctw::split' . $e . qq {' '}; next E_STRING_LOOP; }
4962             elsif ($string =~ /\G " [ ] " /oxgc) { $e_string .= 'Eeuctw::split' . $e . qq {" "}; next E_STRING_LOOP; }
4963              
4964 0 0       0 # split qq//
  0         0  
  0         0  
4965             elsif ($string =~ /\G \b (qq) \b /oxgc) {
4966 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq# # --> qr # #
4967 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4968 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4969 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
4970 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  
4971 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  
4972 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  
4973 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  
4974             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= e_split($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # qq | | --> qr { }
4975 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 * *
4976             }
4977             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4978             }
4979             }
4980              
4981 0 0       0 # split qr//
  0         0  
  0         0  
4982             elsif ($string =~ /\G \b (qr) \b /oxgc) {
4983 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1,$3,$2,$4); next E_STRING_LOOP; } # qr# #
4984 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
4985 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4986 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
4987 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  
4988 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  
4989 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  
4990 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  
4991 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  
4992             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # qr | | --> qr { }
4993 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 * *
4994             }
4995             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4996             }
4997             }
4998              
4999 0 0       0 # split q//
  0         0  
  0         0  
5000             elsif ($string =~ /\G \b (q) \b /oxgc) {
5001 0         0 if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q# # --> qr # #
5002 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
5003 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
5004 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
5005 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  
5006 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  
5007 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  
5008 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  
5009             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { $e_string .= e_split_q($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # q | | --> qr { }
5010 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 * *
5011             }
5012             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5013             }
5014             }
5015              
5016 0 0       0 # split m//
  0         0  
  0         0  
5017             elsif ($string =~ /\G \b (m) \b /oxgc) {
5018 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 # #
5019 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
5020 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
5021 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
5022 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  
5023 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  
5024 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  
5025 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  
5026 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  
5027             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # m | | --> qr { }
5028 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 * *
5029             }
5030             die __FILE__, ": Search pattern not terminated\n";
5031             }
5032             }
5033              
5034 0         0 # split ''
5035 0         0 elsif ($string =~ /\G (\') /oxgc) {
5036 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
5037 0         0 while ($string !~ /\G \z/oxgc) {
5038 0         0 if ($string =~ /\G (\\\\) /oxgc) { $q_string .= $1; }
  0         0  
5039 0         0 elsif ($string =~ /\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
5040             elsif ($string =~ /\G \' /oxgc) { $e_string .= e_split_q($e.q{ qr},"'","'",$q_string,''); next E_STRING_LOOP; } # ' ' --> qr ' '
5041 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $q_string .= $1; }
5042             }
5043             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5044             }
5045              
5046 0         0 # split ""
5047 0         0 elsif ($string =~ /\G (\") /oxgc) {
5048 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
5049 0         0 while ($string !~ /\G \z/oxgc) {
5050 0         0 if ($string =~ /\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
5051 0         0 elsif ($string =~ /\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
5052             elsif ($string =~ /\G \" /oxgc) { $e_string .= e_split($e.q{ qr},'"','"',$qq_string,''); next E_STRING_LOOP; } # " " --> qr " "
5053 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $qq_string .= $1; }
5054             }
5055             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5056             }
5057              
5058 0         0 # split //
5059 0         0 elsif ($string =~ /\G (\/) /oxgc) {
5060 0 0       0 my $regexp = '';
  0 0       0  
    0          
    0          
5061 0         0 while ($string !~ /\G \z/oxgc) {
5062 0         0 if ($string =~ /\G (\\\\) /oxgc) { $regexp .= $1; }
  0         0  
5063 0         0 elsif ($string =~ /\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
5064             elsif ($string =~ /\G \/ ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split($e.q{ qr}, '/','/',$regexp,$1); next E_STRING_LOOP; } # / / --> qr / /
5065 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $regexp .= $1; }
5066             }
5067             die __FILE__, ": Search pattern not terminated\n";
5068             }
5069             }
5070              
5071 0         0 # qq//
5072 0 0       0 elsif ($string =~ /\G \b (qq) \b /oxgc) {
5073 0         0 my $ope = $1;
5074             if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qq# #
5075             $e_string .= e_qq($ope,$1,$3,$2);
5076 0         0 }
5077 0         0 else {
5078 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
5079 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
5080 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
5081 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq ( )
  0         0  
5082 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq { }
  0         0  
5083 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq [ ]
  0         0  
5084             elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq < >
5085 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq * *
5086             }
5087             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5088             }
5089             }
5090              
5091 0         0 # qx//
5092 0 0       0 elsif ($string =~ /\G \b (qx) \b /oxgc) {
5093 0         0 my $ope = $1;
5094             if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
5095             $e_string .= e_qq($ope,$1,$3,$2);
5096 0         0 }
5097 0         0 else {
5098 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
    0          
5099 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
5100 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
5101 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ( )
  0         0  
5102 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx { }
  0         0  
5103 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx [ ]
  0         0  
5104 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx < >
  0         0  
5105             elsif ($string =~ /\G (\') ((?:$qq_char)*?) (\') /oxgc) { $e_string .= $e . e_q ($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ' '
5106 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx * *
5107             }
5108             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5109             }
5110             }
5111              
5112 0         0 # q//
5113 0 0       0 elsif ($string =~ /\G \b (q) \b /oxgc) {
5114 0         0 my $ope = $1;
5115             if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { # q# #
5116             $e_string .= e_q($ope,$1,$3,$2);
5117 0         0 }
5118 0         0 else {
5119 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
5120 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
5121 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
5122 0         0 elsif ($string =~ /\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q ( )
  0         0  
5123 0         0 elsif ($string =~ /\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q { }
  0         0  
5124 0         0 elsif ($string =~ /\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q [ ]
  0         0  
5125             elsif ($string =~ /\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q < >
5126 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 * *
5127             }
5128             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5129             }
5130             }
5131 0         0  
5132             # ''
5133             elsif ($string =~ /\G (?
5134 12         51  
5135             # ""
5136             elsif ($string =~ /\G (\") ((?:$qq_char)*?) (\") /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
5137 6         119  
5138             # ``
5139             elsif ($string =~ /\G (\`) ((?:$qq_char)*?) (\`) /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
5140 0         0  
5141             # <<>> (a safer ARGV)
5142             elsif ($string =~ /\G ( <<>> ) /oxgc) { $e_string .= $1; }
5143 0         0  
5144             # <<= <=> <= < operator
5145             elsif ($string =~ /\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) { $e_string .= $1; }
5146 0         0  
5147             #
5148             elsif ($string =~ /\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) { $e_string .= $1; }
5149              
5150 0         0 # --- glob
5151             elsif ($string =~ /\G < ((?:$q_char)+?) > /oxgc) {
5152             $e_string .= 'Eeuctw::glob("' . $1 . '")';
5153             }
5154              
5155 0         0 # << (bit shift) --- not here document
5156 0         0 elsif ($string =~ /\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) {
5157             $slash = 'm//';
5158             $e_string .= $1;
5159             }
5160              
5161 0         0 # <<~'HEREDOC'
5162 0         0 elsif ($string =~ /\G ( <<~ [\t ]* '([a-zA-Z_0-9]*)' ) /oxgc) {
5163 0         0 $slash = 'm//';
5164             my $here_quote = $1;
5165             my $delimiter = $2;
5166 0 0       0  
5167 0         0 # get here document
5168 0         0 if ($here_script eq '') {
5169             $here_script = CORE::substr $_, pos $_;
5170 0 0       0 $here_script =~ s/.*?\n//oxm;
5171 0         0 }
5172 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5173 0         0 my $heredoc = $1;
5174 0         0 my $indent = $2;
5175 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
5176             push @heredoc, $heredoc . qq{\n$delimiter\n};
5177             push @heredoc_delimiter, qq{\\s*$delimiter};
5178 0         0 }
5179             else {
5180 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5181             }
5182             $e_string .= qq{<<'$delimiter'};
5183             }
5184              
5185 0         0 # <<~\HEREDOC
5186 0         0 elsif ($string =~ /\G ( <<~ \\([a-zA-Z_0-9]+) ) /oxgc) {
5187 0         0 $slash = 'm//';
5188             my $here_quote = $1;
5189             my $delimiter = $2;
5190 0 0       0  
5191 0         0 # get here document
5192 0         0 if ($here_script eq '') {
5193             $here_script = CORE::substr $_, pos $_;
5194 0 0       0 $here_script =~ s/.*?\n//oxm;
5195 0         0 }
5196 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5197 0         0 my $heredoc = $1;
5198 0         0 my $indent = $2;
5199 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
5200             push @heredoc, $heredoc . qq{\n$delimiter\n};
5201             push @heredoc_delimiter, qq{\\s*$delimiter};
5202 0         0 }
5203             else {
5204 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5205             }
5206             $e_string .= qq{<<\\$delimiter};
5207             }
5208              
5209 0         0 # <<~"HEREDOC"
5210 0         0 elsif ($string =~ /\G ( <<~ [\t ]* "([a-zA-Z_0-9]*)" ) /oxgc) {
5211 0         0 $slash = 'm//';
5212             my $here_quote = $1;
5213             my $delimiter = $2;
5214 0 0       0  
5215 0         0 # get here document
5216 0         0 if ($here_script eq '') {
5217             $here_script = CORE::substr $_, pos $_;
5218 0 0       0 $here_script =~ s/.*?\n//oxm;
5219 0         0 }
5220 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5221 0         0 my $heredoc = $1;
5222 0         0 my $indent = $2;
5223 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
5224             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
5225             push @heredoc_delimiter, qq{\\s*$delimiter};
5226 0         0 }
5227             else {
5228 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5229             }
5230             $e_string .= qq{<<"$delimiter"};
5231             }
5232              
5233 0         0 # <<~HEREDOC
5234 0         0 elsif ($string =~ /\G ( <<~ ([a-zA-Z_0-9]+) ) /oxgc) {
5235 0         0 $slash = 'm//';
5236             my $here_quote = $1;
5237             my $delimiter = $2;
5238 0 0       0  
5239 0         0 # get here document
5240 0         0 if ($here_script eq '') {
5241             $here_script = CORE::substr $_, pos $_;
5242 0 0       0 $here_script =~ s/.*?\n//oxm;
5243 0         0 }
5244 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5245 0         0 my $heredoc = $1;
5246 0         0 my $indent = $2;
5247 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
5248             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
5249             push @heredoc_delimiter, qq{\\s*$delimiter};
5250 0         0 }
5251             else {
5252 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5253             }
5254             $e_string .= qq{<<$delimiter};
5255             }
5256              
5257 0         0 # <<~`HEREDOC`
5258 0         0 elsif ($string =~ /\G ( <<~ [\t ]* `([a-zA-Z_0-9]*)` ) /oxgc) {
5259 0         0 $slash = 'm//';
5260             my $here_quote = $1;
5261             my $delimiter = $2;
5262 0 0       0  
5263 0         0 # get here document
5264 0         0 if ($here_script eq '') {
5265             $here_script = CORE::substr $_, pos $_;
5266 0 0       0 $here_script =~ s/.*?\n//oxm;
5267 0         0 }
5268 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5269 0         0 my $heredoc = $1;
5270 0         0 my $indent = $2;
5271 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
5272             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
5273             push @heredoc_delimiter, qq{\\s*$delimiter};
5274 0         0 }
5275             else {
5276 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5277             }
5278             $e_string .= qq{<<`$delimiter`};
5279             }
5280              
5281 0         0 # <<'HEREDOC'
5282 0         0 elsif ($string =~ /\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
5283 0         0 $slash = 'm//';
5284             my $here_quote = $1;
5285             my $delimiter = $2;
5286 0 0       0  
5287 0         0 # get here document
5288 0         0 if ($here_script eq '') {
5289             $here_script = CORE::substr $_, pos $_;
5290 0 0       0 $here_script =~ s/.*?\n//oxm;
5291 0         0 }
5292 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5293             push @heredoc, $1 . qq{\n$delimiter\n};
5294             push @heredoc_delimiter, $delimiter;
5295 0         0 }
5296             else {
5297 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5298             }
5299             $e_string .= $here_quote;
5300             }
5301              
5302 0         0 # <<\HEREDOC
5303 0         0 elsif ($string =~ /\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
5304 0         0 $slash = 'm//';
5305             my $here_quote = $1;
5306             my $delimiter = $2;
5307 0 0       0  
5308 0         0 # get here document
5309 0         0 if ($here_script eq '') {
5310             $here_script = CORE::substr $_, pos $_;
5311 0 0       0 $here_script =~ s/.*?\n//oxm;
5312 0         0 }
5313 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5314             push @heredoc, $1 . qq{\n$delimiter\n};
5315             push @heredoc_delimiter, $delimiter;
5316 0         0 }
5317             else {
5318 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5319             }
5320             $e_string .= $here_quote;
5321             }
5322              
5323 0         0 # <<"HEREDOC"
5324 0         0 elsif ($string =~ /\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
5325 0         0 $slash = 'm//';
5326             my $here_quote = $1;
5327             my $delimiter = $2;
5328 0 0       0  
5329 0         0 # get here document
5330 0         0 if ($here_script eq '') {
5331             $here_script = CORE::substr $_, pos $_;
5332 0 0       0 $here_script =~ s/.*?\n//oxm;
5333 0         0 }
5334 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5335             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5336             push @heredoc_delimiter, $delimiter;
5337 0         0 }
5338             else {
5339 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5340             }
5341             $e_string .= $here_quote;
5342             }
5343              
5344 0         0 # <
5345 0         0 elsif ($string =~ /\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
5346 0         0 $slash = 'm//';
5347             my $here_quote = $1;
5348             my $delimiter = $2;
5349 0 0       0  
5350 0         0 # get here document
5351 0         0 if ($here_script eq '') {
5352             $here_script = CORE::substr $_, pos $_;
5353 0 0       0 $here_script =~ s/.*?\n//oxm;
5354 0         0 }
5355 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5356             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5357             push @heredoc_delimiter, $delimiter;
5358 0         0 }
5359             else {
5360 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5361             }
5362             $e_string .= $here_quote;
5363             }
5364              
5365 0         0 # <<`HEREDOC`
5366 0         0 elsif ($string =~ /\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
5367 0         0 $slash = 'm//';
5368             my $here_quote = $1;
5369             my $delimiter = $2;
5370 0 0       0  
5371 0         0 # get here document
5372 0         0 if ($here_script eq '') {
5373             $here_script = CORE::substr $_, pos $_;
5374 0 0       0 $here_script =~ s/.*?\n//oxm;
5375 0         0 }
5376 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5377             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5378             push @heredoc_delimiter, $delimiter;
5379 0         0 }
5380             else {
5381 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5382             }
5383             $e_string .= $here_quote;
5384             }
5385              
5386             # any operator before div
5387             elsif ($string =~ /\G (
5388             -- | \+\+ |
5389 0         0 [\)\}\]]
  39         81  
5390              
5391             ) /oxgc) { $slash = 'div'; $e_string .= $1; }
5392              
5393             # yada-yada or triple-dot operator
5394             elsif ($string =~ /\G (
5395 39         120 \.\.\.
  0         0  
5396              
5397             ) /oxgc) { $slash = 'm//'; $e_string .= q{die('Unimplemented')}; }
5398              
5399             # any operator before m//
5400             elsif ($string =~ /\G ((?>
5401              
5402             !~~ | !~ | != | ! |
5403             %= | % |
5404             &&= | && | &= | &\.= | &\. | & |
5405             -= | -> | - |
5406             :(?>\s*)= |
5407             : |
5408             <<>> |
5409             <<= | <=> | <= | < |
5410             == | => | =~ | = |
5411             >>= | >> | >= | > |
5412             \*\*= | \*\* | \*= | \* |
5413             \+= | \+ |
5414             \.\. | \.= | \. |
5415             \/\/= | \/\/ |
5416             \/= | \/ |
5417             \? |
5418             \\ |
5419             \^= | \^\.= | \^\. | \^ |
5420             \b x= |
5421             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
5422             ~~ | ~\. | ~ |
5423             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
5424             \b(?: print )\b |
5425              
5426 0         0 [,;\(\{\[]
  49         91  
5427              
5428             )) /oxgc) { $slash = 'm//'; $e_string .= $1; }
5429 49         296  
5430             # other any character
5431             elsif ($string =~ /\G ($q_char) /oxgc) { $e_string .= $1; }
5432              
5433 179         749 # system error
5434             else {
5435             die __FILE__, ": Oops, this shouldn't happen!\n";
5436             }
5437 0         0 }
5438              
5439             return $e_string;
5440             }
5441              
5442             #
5443             # character class
5444 38     3065 0 143 #
5445             sub character_class {
5446 3065 100       5963 my($char,$modifier) = @_;
5447 3065 100       4914  
5448 115         218 if ($char eq '.') {
5449             if ($modifier =~ /s/) {
5450             return '${Eeuctw::dot_s}';
5451 23         58 }
5452             else {
5453             return '${Eeuctw::dot}';
5454             }
5455 92         395 }
5456             else {
5457             return Eeuctw::classic_character_class($char);
5458             }
5459             }
5460              
5461             #
5462             # escape capture ($1, $2, $3, ...)
5463             #
5464 2950     547 0 26112 sub e_capture {
5465 547         2364  
5466             return join '', '${Eeuctw::capture(', $_[0], ')}';
5467             return join '', '${', $_[0], '}';
5468             }
5469              
5470             #
5471             # escape transliteration (tr/// or y///)
5472 0     11 0 0 #
5473 11         61 sub e_tr {
5474 11   100     21 my($variable,$charclass,$e,$charclass2,$modifier) = @_;
5475             my $e_tr = '';
5476 11         31 $modifier ||= '';
5477              
5478             $slash = 'div';
5479 11         17  
5480             # quote character class 1
5481             $charclass = q_tr($charclass);
5482 11         27  
5483             # quote character class 2
5484             $charclass2 = q_tr($charclass2);
5485 11 50       19  
5486 11 0       34 # /b /B modifier
5487 0         0 if ($modifier =~ tr/bB//d) {
5488             if ($variable eq '') {
5489             $e_tr = qq{tr$charclass$e$charclass2$modifier};
5490 0         0 }
5491             else {
5492             $e_tr = qq{$variable${bind_operator}tr$charclass$e$charclass2$modifier};
5493             }
5494 0 100       0 }
5495 11         24 else {
5496             if ($variable eq '') {
5497             $e_tr = qq{Eeuctw::tr(\$_,' =~ ',$charclass,$e$charclass2,'$modifier')};
5498 2         7 }
5499             else {
5500             $e_tr = qq{Eeuctw::tr($variable,'$bind_operator',$charclass,$e$charclass2,'$modifier')};
5501             }
5502             }
5503 9         31  
5504 11         15 # clear tr/// variable
5505             $tr_variable = '';
5506 11         12 $bind_operator = '';
5507              
5508             return $e_tr;
5509             }
5510              
5511             #
5512             # quote for escape transliteration (tr/// or y///)
5513 11     22 0 69 #
5514             sub q_tr {
5515             my($charclass) = @_;
5516 22 50       29  
    0          
    0          
    0          
    0          
    0          
5517 22         44 # quote character class
5518             if ($charclass !~ /'/oxms) {
5519             return e_q('', "'", "'", $charclass); # --> q' '
5520 22         35 }
5521             elsif ($charclass !~ /\//oxms) {
5522             return e_q('q', '/', '/', $charclass); # --> q/ /
5523 0         0 }
5524             elsif ($charclass !~ /\#/oxms) {
5525             return e_q('q', '#', '#', $charclass); # --> q# #
5526 0         0 }
5527             elsif ($charclass !~ /[\<\>]/oxms) {
5528             return e_q('q', '<', '>', $charclass); # --> q< >
5529 0         0 }
5530             elsif ($charclass !~ /[\(\)]/oxms) {
5531             return e_q('q', '(', ')', $charclass); # --> q( )
5532 0         0 }
5533             elsif ($charclass !~ /[\{\}]/oxms) {
5534             return e_q('q', '{', '}', $charclass); # --> q{ }
5535 0         0 }
5536 0 0       0 else {
5537 0         0 for my $char (qw( ! " $ % & * + . : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5538             if ($charclass !~ /\Q$char\E/xms) {
5539             return e_q('q', $char, $char, $charclass);
5540             }
5541             }
5542 0         0 }
5543              
5544             return e_q('q', '{', '}', $charclass);
5545             }
5546              
5547             #
5548             # escape q string (q//, '')
5549 0     2434 0 0 #
5550             sub e_q {
5551 2434         5763 my($ope,$delimiter,$end_delimiter,$string) = @_;
5552              
5553 2434         3408 $slash = 'div';
5554              
5555             return join '', $ope, $delimiter, $string, $end_delimiter;
5556             }
5557              
5558             #
5559             # escape qq string (qq//, "", qx//, ``)
5560 2434     7014 0 11583 #
5561             sub e_qq {
5562 7014         17678 my($ope,$delimiter,$end_delimiter,$string) = @_;
5563              
5564 7014         9467 $slash = 'div';
5565 7014         8747  
5566             my $left_e = 0;
5567             my $right_e = 0;
5568 7014         8161  
5569             # split regexp
5570             my @char = $string =~ /\G((?>
5571             [^\x8E\xA1-\xFE\\\$]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
5572             \\x\{ (?>[0-9A-Fa-f]+) \} |
5573             \\o\{ (?>[0-7]+) \} |
5574             \\N\{ (?>[^\x8E\xA1-\xFE0-9\}][^\x8E\xA1-\xFE\}]*) \} |
5575             \\ $q_char |
5576             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5577             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5578             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5579             \$ (?>\s* [0-9]+) |
5580             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5581             \$ \$ (?![\w\{]) |
5582             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5583             $q_char
5584 7014         283826 ))/oxmsg;
5585              
5586             for (my $i=0; $i <= $#char; $i++) {
5587 7014 50 66     22612  
    50 33        
    100          
    100          
    50          
5588 217311         702735 # "\L\u" --> "\u\L"
5589             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
5590             @char[$i,$i+1] = @char[$i+1,$i];
5591             }
5592              
5593 0         0 # "\U\l" --> "\l\U"
5594             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5595             @char[$i,$i+1] = @char[$i+1,$i];
5596             }
5597              
5598 0         0 # octal escape sequence
5599             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5600             $char[$i] = Eeuctw::octchr($1);
5601             }
5602              
5603 1         5 # hexadecimal escape sequence
5604             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5605             $char[$i] = Eeuctw::hexchr($1);
5606             }
5607              
5608 1         4 # \N{CHARNAME} --> N{CHARNAME}
5609             elsif ($char[$i] =~ /\A \\ ( N\{ ([^\x8E\xA1-\xFE0-9\}][^\x8E\xA1-\xFE\}]*) \} ) \z/oxms) {
5610             $char[$i] = $1;
5611 0 100       0 }
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
5612              
5613             if (0) {
5614             }
5615              
5616             # \F
5617             #
5618             # P.69 Table 2-6. Translation escapes
5619             # in Chapter 2: Bits and Pieces
5620             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5621             # (and so on)
5622 217311         1783217  
5623 0 50       0 # \u \l \U \L \F \Q \E
5624 602         1244 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
5625             if ($right_e < $left_e) {
5626             $char[$i] = '\\' . $char[$i];
5627             }
5628             }
5629             elsif ($char[$i] eq '\u') {
5630              
5631             # "STRING @{[ LIST EXPR ]} MORE STRING"
5632              
5633             # P.257 Other Tricks You Can Do with Hard References
5634             # in Chapter 8: References
5635             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
5636              
5637             # P.353 Other Tricks You Can Do with Hard References
5638             # in Chapter 8: References
5639             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5640              
5641 0         0 # (and so on)
5642 0         0  
5643             $char[$i] = '@{[Eeuctw::ucfirst qq<';
5644             $left_e++;
5645 0         0 }
5646 0         0 elsif ($char[$i] eq '\l') {
5647             $char[$i] = '@{[Eeuctw::lcfirst qq<';
5648             $left_e++;
5649 0         0 }
5650 0         0 elsif ($char[$i] eq '\U') {
5651             $char[$i] = '@{[Eeuctw::uc qq<';
5652             $left_e++;
5653 0         0 }
5654 6         10 elsif ($char[$i] eq '\L') {
5655             $char[$i] = '@{[Eeuctw::lc qq<';
5656             $left_e++;
5657 6         11 }
5658 9         13 elsif ($char[$i] eq '\F') {
5659             $char[$i] = '@{[Eeuctw::fc qq<';
5660             $left_e++;
5661 9         16 }
5662 0         0 elsif ($char[$i] eq '\Q') {
5663             $char[$i] = '@{[CORE::quotemeta qq<';
5664             $left_e++;
5665 0 50       0 }
5666 12         23 elsif ($char[$i] eq '\E') {
5667 12         14 if ($right_e < $left_e) {
5668             $char[$i] = '>]}';
5669             $right_e++;
5670 12         20 }
5671             else {
5672             $char[$i] = '';
5673             }
5674 0         0 }
5675 0 0       0 elsif ($char[$i] eq '\Q') {
5676 0         0 while (1) {
5677             if (++$i > $#char) {
5678 0 0       0 last;
5679 0         0 }
5680             if ($char[$i] eq '\E') {
5681             last;
5682             }
5683             }
5684             }
5685             elsif ($char[$i] eq '\E') {
5686             }
5687              
5688             # $0 --> $0
5689             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
5690             }
5691             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
5692             }
5693              
5694             # $$ --> $$
5695             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
5696             }
5697              
5698             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
5699 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
5700             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
5701             $char[$i] = e_capture($1);
5702 415         876 }
5703             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
5704             $char[$i] = e_capture($1);
5705             }
5706              
5707 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
5708             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
5709             $char[$i] = e_capture($1.'->'.$2);
5710             }
5711              
5712 0         0 # $$foo{ ... } --> $ $foo->{ ... }
5713             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
5714             $char[$i] = e_capture($1.'->'.$2);
5715             }
5716              
5717 0         0 # $$foo
5718             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
5719             $char[$i] = e_capture($1);
5720             }
5721              
5722 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeuctw::PREMATCH()
5723             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
5724             $char[$i] = '@{[Eeuctw::PREMATCH()]}';
5725             }
5726              
5727 44         121 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeuctw::MATCH()
5728             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
5729             $char[$i] = '@{[Eeuctw::MATCH()]}';
5730             }
5731              
5732 45         118 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeuctw::POSTMATCH()
5733             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
5734             $char[$i] = '@{[Eeuctw::POSTMATCH()]}';
5735             }
5736              
5737             # ${ foo } --> ${ foo }
5738             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
5739             }
5740              
5741 33         85 # ${ ... }
5742             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
5743             $char[$i] = e_capture($1);
5744             }
5745             }
5746 0 100       0  
5747 7014         13469 # return string
5748             if ($left_e > $right_e) {
5749 3         18 return join '', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter;
5750             }
5751             return join '', $ope, $delimiter, @char, $end_delimiter;
5752             }
5753              
5754             #
5755             # escape qw string (qw//)
5756 7011     34 0 61103 #
5757             sub e_qw {
5758 34         152 my($ope,$delimiter,$end_delimiter,$string) = @_;
5759              
5760             $slash = 'div';
5761 34         65  
  34         294  
5762 621 50       1242 # choice again delimiter
    0          
    0          
    0          
    0          
5763 34         162 my %octet = map {$_ => 1} ($string =~ /\G ([\x00-\xFF]) /oxmsg);
5764             if (not $octet{$end_delimiter}) {
5765             return join '', $ope, $delimiter, $string, $end_delimiter;
5766 34         213 }
5767             elsif (not $octet{')'}) {
5768             return join '', $ope, '(', $string, ')';
5769 0         0 }
5770             elsif (not $octet{'}'}) {
5771             return join '', $ope, '{', $string, '}';
5772 0         0 }
5773             elsif (not $octet{']'}) {
5774             return join '', $ope, '[', $string, ']';
5775 0         0 }
5776             elsif (not $octet{'>'}) {
5777             return join '', $ope, '<', $string, '>';
5778 0         0 }
5779 0 0       0 else {
5780 0         0 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5781             if (not $octet{$char}) {
5782             return join '', $ope, $char, $string, $char;
5783             }
5784             }
5785             }
5786 0         0  
5787 0         0 # qw/AAA BBB C'CC/ --> ('AAA', 'BBB', 'C\'CC')
5788 0         0 my @string = CORE::split(/\s+/, $string);
5789 0         0 for my $string (@string) {
5790 0 0       0 my @octet = $string =~ /\G ([\x00-\xFF]) /oxmsg;
5791 0         0 for my $octet (@octet) {
5792             if ($octet =~ /\A (['\\]) \z/oxms) {
5793             $octet = '\\' . $1;
5794 0         0 }
5795             }
5796 0         0 $string = join '', @octet;
  0         0  
5797             }
5798             return join '', '(', (join ', ', map { "'$_'" } @string), ')';
5799             }
5800              
5801             #
5802             # escape here document (<<"HEREDOC", <
5803 0     108 0 0 #
5804             sub e_heredoc {
5805 108         285 my($string) = @_;
5806              
5807 108         172 $slash = 'm//';
5808              
5809 108         379 my $metachar = qr/[\@\\|]/oxms; # '|' is for <<`HEREDOC`
5810 108         275  
5811             my $left_e = 0;
5812             my $right_e = 0;
5813 108         140  
5814             # split regexp
5815             my @char = $string =~ /\G((?>
5816             [^\x8E\xA1-\xFE\\\$]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
5817             \\x\{ (?>[0-9A-Fa-f]+) \} |
5818             \\o\{ (?>[0-7]+) \} |
5819             \\N\{ (?>[^\x8E\xA1-\xFE0-9\}][^\x8E\xA1-\xFE\}]*) \} |
5820             \\ $q_char |
5821             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5822             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5823             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5824             \$ (?>\s* [0-9]+) |
5825             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5826             \$ \$ (?![\w\{]) |
5827             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5828             $q_char
5829 108         12945 ))/oxmsg;
5830              
5831             for (my $i=0; $i <= $#char; $i++) {
5832 108 50 66     603  
    50 33        
    100          
    100          
    50          
5833 3265         10622 # "\L\u" --> "\u\L"
5834             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
5835             @char[$i,$i+1] = @char[$i+1,$i];
5836             }
5837              
5838 0         0 # "\U\l" --> "\l\U"
5839             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5840             @char[$i,$i+1] = @char[$i+1,$i];
5841             }
5842              
5843 0         0 # octal escape sequence
5844             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5845             $char[$i] = Eeuctw::octchr($1);
5846             }
5847              
5848 1         3 # hexadecimal escape sequence
5849             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5850             $char[$i] = Eeuctw::hexchr($1);
5851             }
5852              
5853 1         3 # \N{CHARNAME} --> N{CHARNAME}
5854             elsif ($char[$i] =~ /\A \\ ( N\{ ([^\x8E\xA1-\xFE0-9\}][^\x8E\xA1-\xFE\}]*) \} ) \z/oxms) {
5855             $char[$i] = $1;
5856 0 100       0 }
    50          
    50          
    50          
    100          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    100          
    50          
    50          
5857              
5858             if (0) {
5859             }
5860 3265         30070  
5861 0 50       0 # \u \l \U \L \F \Q \E
5862 72         292 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
5863             if ($right_e < $left_e) {
5864             $char[$i] = '\\' . $char[$i];
5865             }
5866 0         0 }
5867 0         0 elsif ($char[$i] eq '\u') {
5868             $char[$i] = '@{[Eeuctw::ucfirst qq<';
5869             $left_e++;
5870 0         0 }
5871 0         0 elsif ($char[$i] eq '\l') {
5872             $char[$i] = '@{[Eeuctw::lcfirst qq<';
5873             $left_e++;
5874 0         0 }
5875 0         0 elsif ($char[$i] eq '\U') {
5876             $char[$i] = '@{[Eeuctw::uc qq<';
5877             $left_e++;
5878 0         0 }
5879 6         9 elsif ($char[$i] eq '\L') {
5880             $char[$i] = '@{[Eeuctw::lc qq<';
5881             $left_e++;
5882 6         11 }
5883 0         0 elsif ($char[$i] eq '\F') {
5884             $char[$i] = '@{[Eeuctw::fc qq<';
5885             $left_e++;
5886 0         0 }
5887 0         0 elsif ($char[$i] eq '\Q') {
5888             $char[$i] = '@{[CORE::quotemeta qq<';
5889             $left_e++;
5890 0 50       0 }
5891 3         6 elsif ($char[$i] eq '\E') {
5892 3         5 if ($right_e < $left_e) {
5893             $char[$i] = '>]}';
5894             $right_e++;
5895 3         5 }
5896             else {
5897             $char[$i] = '';
5898             }
5899 0         0 }
5900 0 0       0 elsif ($char[$i] eq '\Q') {
5901 0         0 while (1) {
5902             if (++$i > $#char) {
5903 0 0       0 last;
5904 0         0 }
5905             if ($char[$i] eq '\E') {
5906             last;
5907             }
5908             }
5909             }
5910             elsif ($char[$i] eq '\E') {
5911             }
5912              
5913             # $0 --> $0
5914             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
5915             }
5916             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
5917             }
5918              
5919             # $$ --> $$
5920             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
5921             }
5922              
5923             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
5924 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
5925             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
5926             $char[$i] = e_capture($1);
5927 0         0 }
5928             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
5929             $char[$i] = e_capture($1);
5930             }
5931              
5932 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
5933             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
5934             $char[$i] = e_capture($1.'->'.$2);
5935             }
5936              
5937 0         0 # $$foo{ ... } --> $ $foo->{ ... }
5938             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
5939             $char[$i] = e_capture($1.'->'.$2);
5940             }
5941              
5942 0         0 # $$foo
5943             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
5944             $char[$i] = e_capture($1);
5945             }
5946              
5947 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeuctw::PREMATCH()
5948             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
5949             $char[$i] = '@{[Eeuctw::PREMATCH()]}';
5950             }
5951              
5952 8         47 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeuctw::MATCH()
5953             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
5954             $char[$i] = '@{[Eeuctw::MATCH()]}';
5955             }
5956              
5957 8         45 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeuctw::POSTMATCH()
5958             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
5959             $char[$i] = '@{[Eeuctw::POSTMATCH()]}';
5960             }
5961              
5962             # ${ foo } --> ${ foo }
5963             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
5964             }
5965              
5966 6         36 # ${ ... }
5967             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
5968             $char[$i] = e_capture($1);
5969             }
5970             }
5971 0 100       0  
5972 108         239 # return string
5973             if ($left_e > $right_e) {
5974 3         23 return join '', @char, '>]}' x ($left_e - $right_e);
5975             }
5976             return join '', @char;
5977             }
5978              
5979             #
5980             # escape regexp (m//, qr//)
5981 105     1426 0 840 #
5982 1426   100     6270 sub e_qr {
5983             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
5984 1426         5104 $modifier ||= '';
5985 1426 50       2585  
5986 1426         3486 $modifier =~ tr/p//d;
5987 0         0 if ($modifier =~ /([adlu])/oxms) {
5988 0 0       0 my $line = 0;
5989 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
5990 0         0 if ($filename ne __FILE__) {
5991             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
5992             last;
5993 0         0 }
5994             }
5995             die qq{Unsupported modifier "$1" used at line $line.\n};
5996 0         0 }
5997              
5998             $slash = 'div';
5999 1426 100       2225  
    100          
6000 1426         4215 # literal null string pattern
6001 8         11 if ($string eq '') {
6002 8         10 $modifier =~ tr/bB//d;
6003             $modifier =~ tr/i//d;
6004             return join '', $ope, $delimiter, $end_delimiter, $modifier;
6005             }
6006              
6007             # /b /B modifier
6008             elsif ($modifier =~ tr/bB//d) {
6009 8 50       38  
6010 60         251 # choice again delimiter
6011 0         0 if ($delimiter =~ / [\@:] /oxms) {
  0         0  
6012 0 0       0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
    0          
    0          
    0          
6013 0         0 my %octet = map {$_ => 1} @char;
6014 0         0 if (not $octet{')'}) {
6015             $delimiter = '(';
6016             $end_delimiter = ')';
6017 0         0 }
6018 0         0 elsif (not $octet{'}'}) {
6019             $delimiter = '{';
6020             $end_delimiter = '}';
6021 0         0 }
6022 0         0 elsif (not $octet{']'}) {
6023             $delimiter = '[';
6024             $end_delimiter = ']';
6025 0         0 }
6026 0         0 elsif (not $octet{'>'}) {
6027             $delimiter = '<';
6028             $end_delimiter = '>';
6029 0         0 }
6030 0 0       0 else {
6031 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6032 0         0 if (not $octet{$char}) {
6033 0         0 $delimiter = $char;
6034             $end_delimiter = $char;
6035             last;
6036             }
6037             }
6038             }
6039 0 100 100     0 }
6040 60         327  
6041             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6042             return join '', $ope, $delimiter, $string, $matched, $end_delimiter, $modifier;
6043 18         105 }
6044             else {
6045             return join '', $ope, $delimiter, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
6046             }
6047 42 100       265 }
6048 1358         3842  
6049             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6050             my $metachar = qr/[\@\\|[\]{^]/oxms;
6051 1358         4702  
6052             # split regexp
6053             my @char = $string =~ /\G((?>
6054             [^\x8E\xA1-\xFE\\\$\@\[\(]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
6055             \\x (?>[0-9A-Fa-f]{1,2}) |
6056             \\ (?>[0-7]{2,3}) |
6057             \\c [\x40-\x5F] |
6058             \\x\{ (?>[0-9A-Fa-f]+) \} |
6059             \\o\{ (?>[0-7]+) \} |
6060             \\[bBNpP]\{ (?>[^\x8E\xA1-\xFE0-9\}][^\x8E\xA1-\xFE\}]*) \} |
6061             \\ $q_char |
6062             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
6063             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
6064             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
6065             [\$\@] $qq_variable |
6066             \$ (?>\s* [0-9]+) |
6067             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
6068             \$ \$ (?![\w\{]) |
6069             \$ (?>\s*) \$ (?>\s*) $qq_variable |
6070             \[\^ |
6071             \[\: (?>[a-z]+) :\] |
6072             \[\:\^ (?>[a-z]+) :\] |
6073             \(\? |
6074             $q_char
6075             ))/oxmsg;
6076 1358 50       138665  
6077 1358         7082 # choice again delimiter
  0         0  
6078 0 0       0 if ($delimiter =~ / [\@:] /oxms) {
    0          
    0          
    0          
6079 0         0 my %octet = map {$_ => 1} @char;
6080 0         0 if (not $octet{')'}) {
6081             $delimiter = '(';
6082             $end_delimiter = ')';
6083 0         0 }
6084 0         0 elsif (not $octet{'}'}) {
6085             $delimiter = '{';
6086             $end_delimiter = '}';
6087 0         0 }
6088 0         0 elsif (not $octet{']'}) {
6089             $delimiter = '[';
6090             $end_delimiter = ']';
6091 0         0 }
6092 0         0 elsif (not $octet{'>'}) {
6093             $delimiter = '<';
6094             $end_delimiter = '>';
6095 0         0 }
6096 0 0       0 else {
6097 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6098 0         0 if (not $octet{$char}) {
6099 0         0 $delimiter = $char;
6100             $end_delimiter = $char;
6101             last;
6102             }
6103             }
6104             }
6105 0         0 }
6106 1358         2058  
6107 1358         1769 my $left_e = 0;
6108             my $right_e = 0;
6109             for (my $i=0; $i <= $#char; $i++) {
6110 1358 50 66     3393  
    50 66        
    100          
    100          
    100          
    100          
6111 3269         18229 # "\L\u" --> "\u\L"
6112             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
6113             @char[$i,$i+1] = @char[$i+1,$i];
6114             }
6115              
6116 0         0 # "\U\l" --> "\l\U"
6117             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
6118             @char[$i,$i+1] = @char[$i+1,$i];
6119             }
6120              
6121 0         0 # octal escape sequence
6122             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
6123             $char[$i] = Eeuctw::octchr($1);
6124             }
6125              
6126 1         3 # hexadecimal escape sequence
6127             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
6128             $char[$i] = Eeuctw::hexchr($1);
6129             }
6130              
6131             # \b{...} --> b\{...}
6132             # \B{...} --> B\{...}
6133             # \N{CHARNAME} --> N\{CHARNAME}
6134             # \p{PROPERTY} --> p\{PROPERTY}
6135 1         4 # \P{PROPERTY} --> P\{PROPERTY}
6136             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x8E\xA1-\xFE0-9\}][^\x8E\xA1-\xFE\}]*) \} ) \z/oxms) {
6137             $char[$i] = $1 . '\\' . $2;
6138             }
6139              
6140 6         19 # \p, \P, \X --> p, P, X
6141             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
6142             $char[$i] = $1;
6143 4 100 100     13 }
    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          
6144              
6145             if (0) {
6146             }
6147 3269         9846  
6148 0 50 33     0 # join separated multiple-octet
    50 33        
    50 33        
      33        
      66        
      33        
6149 6         92 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
6150             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)) {
6151             $char[$i] .= join '', splice @char, $i+1, 3;
6152 0         0 }
6153             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)) {
6154             $char[$i] .= join '', splice @char, $i+1, 2;
6155 0         0 }
6156             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)) {
6157             $char[$i] .= join '', splice @char, $i+1, 1;
6158             }
6159             }
6160              
6161 0         0 # open character class [...]
6162             elsif ($char[$i] eq '[') {
6163             my $left = $i;
6164              
6165             # [] make die "Unmatched [] in regexp ...\n"
6166 586 100       803 # (and so on)
6167 586         1401  
6168             if ($char[$i+1] eq ']') {
6169             $i++;
6170 3         6 }
6171 586 50       820  
6172 2583         3587 while (1) {
6173             if (++$i > $#char) {
6174 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
6175 2583         3778 }
6176             if ($char[$i] eq ']') {
6177             my $right = $i;
6178 586 100       703  
6179 586         2803 # [...]
  90         194  
6180             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6181             splice @char, $left, $right-$left+1, sprintf(q{@{[Eeuctw::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
6182 270         460 }
6183             else {
6184             splice @char, $left, $right-$left+1, Eeuctw::charlist_qr(@char[$left+1..$right-1], $modifier);
6185 496         1615 }
6186 586         1203  
6187             $i = $left;
6188             last;
6189             }
6190             }
6191             }
6192              
6193 586         1657 # open character class [^...]
6194             elsif ($char[$i] eq '[^') {
6195             my $left = $i;
6196              
6197             # [^] make die "Unmatched [] in regexp ...\n"
6198 328 100       429 # (and so on)
6199 328         737  
6200             if ($char[$i+1] eq ']') {
6201             $i++;
6202 5         6 }
6203 328 50       578  
6204 1447         2374 while (1) {
6205             if (++$i > $#char) {
6206 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
6207 1447         2481 }
6208             if ($char[$i] eq ']') {
6209             my $right = $i;
6210 328 100       386  
6211 328         1753 # [^...]
  90         261  
6212             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6213             splice @char, $left, $right-$left+1, sprintf(q{@{[Eeuctw::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
6214 270         456 }
6215             else {
6216             splice @char, $left, $right-$left+1, Eeuctw::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6217 238         882 }
6218 328         641  
6219             $i = $left;
6220             last;
6221             }
6222             }
6223             }
6224              
6225 328         921 # rewrite character class or escape character
6226             elsif (my $char = character_class($char[$i],$modifier)) {
6227             $char[$i] = $char;
6228             }
6229              
6230 215 50       564 # /i modifier
6231 54         129 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeuctw::uc($char[$i]) ne Eeuctw::fc($char[$i]))) {
6232             if (CORE::length(Eeuctw::fc($char[$i])) == 1) {
6233             $char[$i] = '[' . Eeuctw::uc($char[$i]) . Eeuctw::fc($char[$i]) . ']';
6234 54         138 }
6235             else {
6236             $char[$i] = '(?:' . Eeuctw::uc($char[$i]) . '|' . Eeuctw::fc($char[$i]) . ')';
6237             }
6238             }
6239              
6240 0 50       0 # \u \l \U \L \F \Q \E
6241 1         5 elsif ($char[$i] =~ /\A [<>] \z/oxms) {
6242             if ($right_e < $left_e) {
6243             $char[$i] = '\\' . $char[$i];
6244             }
6245 0         0 }
6246 0         0 elsif ($char[$i] eq '\u') {
6247             $char[$i] = '@{[Eeuctw::ucfirst qq<';
6248             $left_e++;
6249 0         0 }
6250 0         0 elsif ($char[$i] eq '\l') {
6251             $char[$i] = '@{[Eeuctw::lcfirst qq<';
6252             $left_e++;
6253 0         0 }
6254 1         2 elsif ($char[$i] eq '\U') {
6255             $char[$i] = '@{[Eeuctw::uc qq<';
6256             $left_e++;
6257 1         3 }
6258 1         3 elsif ($char[$i] eq '\L') {
6259             $char[$i] = '@{[Eeuctw::lc qq<';
6260             $left_e++;
6261 1         2 }
6262 9         14 elsif ($char[$i] eq '\F') {
6263             $char[$i] = '@{[Eeuctw::fc qq<';
6264             $left_e++;
6265 9         21 }
6266 20         42 elsif ($char[$i] eq '\Q') {
6267             $char[$i] = '@{[CORE::quotemeta qq<';
6268             $left_e++;
6269 20 50       98 }
6270 31         268 elsif ($char[$i] eq '\E') {
6271 31         52 if ($right_e < $left_e) {
6272             $char[$i] = '>]}';
6273             $right_e++;
6274 31         70 }
6275             else {
6276             $char[$i] = '';
6277             }
6278 0         0 }
6279 0 0       0 elsif ($char[$i] eq '\Q') {
6280 0         0 while (1) {
6281             if (++$i > $#char) {
6282 0 0       0 last;
6283 0         0 }
6284             if ($char[$i] eq '\E') {
6285             last;
6286             }
6287             }
6288             }
6289             elsif ($char[$i] eq '\E') {
6290             }
6291              
6292 0 0       0 # $0 --> $0
6293 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
6294             if ($ignorecase) {
6295             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
6296             }
6297 0 0       0 }
6298 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
6299             if ($ignorecase) {
6300             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
6301             }
6302             }
6303              
6304             # $$ --> $$
6305             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
6306             }
6307              
6308             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6309 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
6310 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
6311 0         0 $char[$i] = e_capture($1);
6312             if ($ignorecase) {
6313             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
6314             }
6315 0         0 }
6316 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6317 0         0 $char[$i] = e_capture($1);
6318             if ($ignorecase) {
6319             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
6320             }
6321             }
6322              
6323 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
6324 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) {
6325 0         0 $char[$i] = e_capture($1.'->'.$2);
6326             if ($ignorecase) {
6327             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
6328             }
6329             }
6330              
6331 0         0 # $$foo{ ... } --> $ $foo->{ ... }
6332 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) {
6333 0         0 $char[$i] = e_capture($1.'->'.$2);
6334             if ($ignorecase) {
6335             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
6336             }
6337             }
6338              
6339 0         0 # $$foo
6340 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
6341 0         0 $char[$i] = e_capture($1);
6342             if ($ignorecase) {
6343             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
6344             }
6345             }
6346              
6347 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeuctw::PREMATCH()
6348 8         23 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
6349             if ($ignorecase) {
6350             $char[$i] = '@{[Eeuctw::ignorecase(Eeuctw::PREMATCH())]}';
6351 0         0 }
6352             else {
6353             $char[$i] = '@{[Eeuctw::PREMATCH()]}';
6354             }
6355             }
6356              
6357 8 50       22 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeuctw::MATCH()
6358 8         20 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
6359             if ($ignorecase) {
6360             $char[$i] = '@{[Eeuctw::ignorecase(Eeuctw::MATCH())]}';
6361 0         0 }
6362             else {
6363             $char[$i] = '@{[Eeuctw::MATCH()]}';
6364             }
6365             }
6366              
6367 8 50       27 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeuctw::POSTMATCH()
6368 6         17 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
6369             if ($ignorecase) {
6370             $char[$i] = '@{[Eeuctw::ignorecase(Eeuctw::POSTMATCH())]}';
6371 0         0 }
6372             else {
6373             $char[$i] = '@{[Eeuctw::POSTMATCH()]}';
6374             }
6375             }
6376              
6377 6 0       19 # ${ foo }
6378 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) {
6379             if ($ignorecase) {
6380             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
6381             }
6382             }
6383              
6384 0         0 # ${ ... }
6385 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
6386 0         0 $char[$i] = e_capture($1);
6387             if ($ignorecase) {
6388             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
6389             }
6390             }
6391              
6392 0         0 # $scalar or @array
6393 29 100       117 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
6394 29         416 $char[$i] = e_string($char[$i]);
6395             if ($ignorecase) {
6396             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
6397             }
6398             }
6399              
6400 4 100 66     15 # quote character before ? + * {
    50          
6401             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6402             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
6403 188         1472 }
6404 0 0       0 elsif (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6405 0         0 my $char = $char[$i-1];
6406             if ($char[$i] eq '{') {
6407             die __FILE__, qq{: "MULTIBYTE{n}" should be "(MULTIBYTE){n}" in m?? (and shift \$1,\$2,\$3,...) ($char){n}\n};
6408 0         0 }
6409             else {
6410             die __FILE__, qq{: "MULTIBYTE$char[$i]" should be "(MULTIBYTE)$char[$i]" in m?? (and shift \$1,\$2,\$3,...) ($char)$char[$i]\n};
6411             }
6412 0         0 }
6413             else {
6414             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6415             }
6416             }
6417             }
6418 187         726  
6419 1358 50       2589 # make regexp string
6420 1358 0 0     2943 $modifier =~ tr/i//d;
6421 0         0 if ($left_e > $right_e) {
6422             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6423             return join '', $ope, $delimiter, $anchor, @char, '>]}' x ($left_e - $right_e), $matched, $end_delimiter, $modifier;
6424 0         0 }
6425             else {
6426             return join '', $ope, $delimiter, $anchor, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
6427 0 100 100     0 }
6428 1358         8102 }
6429             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6430             return join '', $ope, $delimiter, $anchor, @char, $matched, $end_delimiter, $modifier;
6431 42         483 }
6432             else {
6433             return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6434             }
6435             }
6436              
6437             #
6438             # double quote stuff
6439 1316     540 0 11264 #
6440             sub qq_stuff {
6441             my($delimiter,$end_delimiter,$stuff) = @_;
6442 540 100       1141  
6443 540         1056 # scalar variable or array variable
6444             if ($stuff =~ /\A [\$\@] /oxms) {
6445             return $stuff;
6446             }
6447 300         1034  
  240         623  
6448 280         834 # quote by delimiter
6449 240 50       580 my %octet = map {$_ => 1} ($stuff =~ /\G ([\x00-\xFF]) /oxmsg);
6450 240 50       413 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6451 240 50       359 next if $char eq $delimiter;
6452 240         411 next if $char eq $end_delimiter;
6453             if (not $octet{$char}) {
6454             return join '', 'qq', $char, $stuff, $char;
6455 240         1080 }
6456             }
6457             return join '', 'qq', '<', $stuff, '>';
6458             }
6459              
6460             #
6461             # escape regexp (m'', qr'', and m''b, qr''b)
6462 0     39 0 0 #
6463 39   100     211 sub e_qr_q {
6464             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6465 39         168 $modifier ||= '';
6466 39 50       72  
6467 39         103 $modifier =~ tr/p//d;
6468 0         0 if ($modifier =~ /([adlu])/oxms) {
6469 0 0       0 my $line = 0;
6470 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6471 0         0 if ($filename ne __FILE__) {
6472             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6473             last;
6474 0         0 }
6475             }
6476             die qq{Unsupported modifier "$1" used at line $line.\n};
6477 0         0 }
6478              
6479             $slash = 'div';
6480 39 100       75  
    100          
6481 39         107 # literal null string pattern
6482 8         8 if ($string eq '') {
6483 8         11 $modifier =~ tr/bB//d;
6484             $modifier =~ tr/i//d;
6485             return join '', $ope, $delimiter, $end_delimiter, $modifier;
6486             }
6487              
6488 8         38 # with /b /B modifier
6489             elsif ($modifier =~ tr/bB//d) {
6490             return e_qr_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
6491             }
6492              
6493 17         50 # without /b /B modifier
6494             else {
6495             return e_qr_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
6496             }
6497             }
6498              
6499             #
6500             # escape regexp (m'', qr'')
6501 14     14 0 63 #
6502             sub e_qr_qt {
6503 14 100       51 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6504              
6505             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6506 14         47  
6507             # split regexp
6508             my @char = $string =~ /\G((?>
6509             [^\x8E\xA1-\xFE\\\[\$\@\/] |
6510             [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
6511             \[\^ |
6512             \[\: (?>[a-z]+) \:\] |
6513             \[\:\^ (?>[a-z]+) \:\] |
6514             [\$\@\/] |
6515             \\ (?:$q_char) |
6516             (?:$q_char)
6517             ))/oxmsg;
6518 14         623  
6519 14 50 100     76 # unescape character
    50 100        
    50 66        
    50          
    100          
    50          
6520             for (my $i=0; $i <= $#char; $i++) {
6521             if (0) {
6522             }
6523 27         172  
6524 0         0 # open character class [...]
6525 0 0       0 elsif ($char[$i] eq '[') {
6526 0         0 my $left = $i;
6527             if ($char[$i+1] eq ']') {
6528 0         0 $i++;
6529 0 0       0 }
6530 0         0 while (1) {
6531             if (++$i > $#char) {
6532 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6533 0         0 }
6534             if ($char[$i] eq ']') {
6535             my $right = $i;
6536 0         0  
6537             # [...]
6538 0         0 splice @char, $left, $right-$left+1, Eeuctw::charlist_qr(@char[$left+1..$right-1], $modifier);
6539 0         0  
6540             $i = $left;
6541             last;
6542             }
6543             }
6544             }
6545              
6546 0         0 # open character class [^...]
6547 0 0       0 elsif ($char[$i] eq '[^') {
6548 0         0 my $left = $i;
6549             if ($char[$i+1] eq ']') {
6550 0         0 $i++;
6551 0 0       0 }
6552 0         0 while (1) {
6553             if (++$i > $#char) {
6554 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6555 0         0 }
6556             if ($char[$i] eq ']') {
6557             my $right = $i;
6558 0         0  
6559             # [^...]
6560 0         0 splice @char, $left, $right-$left+1, Eeuctw::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6561 0         0  
6562             $i = $left;
6563             last;
6564             }
6565             }
6566             }
6567              
6568 0         0 # escape $ @ / and \
6569             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6570             $char[$i] = '\\' . $char[$i];
6571             }
6572              
6573 0         0 # rewrite character class or escape character
6574             elsif (my $char = character_class($char[$i],$modifier)) {
6575             $char[$i] = $char;
6576             }
6577              
6578 0 50       0 # /i modifier
6579 4         11 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeuctw::uc($char[$i]) ne Eeuctw::fc($char[$i]))) {
6580             if (CORE::length(Eeuctw::fc($char[$i])) == 1) {
6581             $char[$i] = '[' . Eeuctw::uc($char[$i]) . Eeuctw::fc($char[$i]) . ']';
6582 4         10 }
6583             else {
6584             $char[$i] = '(?:' . Eeuctw::uc($char[$i]) . '|' . Eeuctw::fc($char[$i]) . ')';
6585             }
6586             }
6587              
6588 0 0       0 # quote character before ? + * {
6589             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6590             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
6591 0         0 }
6592             else {
6593             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6594             }
6595             }
6596 0         0 }
6597 14         31  
6598             $delimiter = '/';
6599 14         24 $end_delimiter = '/';
6600 14         110  
6601             $modifier =~ tr/i//d;
6602             return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6603             }
6604              
6605             #
6606             # escape regexp (m''b, qr''b)
6607 14     17 0 211 #
6608             sub e_qr_qb {
6609             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6610 17         49  
6611             # split regexp
6612             my @char = $string =~ /\G ((?>[^\\]|\\\\|[\x00-\xFF])) /oxmsg;
6613 17         84  
6614 17 50       76 # unescape character
    50          
6615             for (my $i=0; $i <= $#char; $i++) {
6616             if (0) {
6617             }
6618 51         393  
6619             # remain \\
6620             elsif ($char[$i] eq '\\\\') {
6621             }
6622              
6623 0         0 # escape $ @ / and \
6624             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6625             $char[$i] = '\\' . $char[$i];
6626             }
6627 0         0 }
6628 17         31  
6629 17         24 $delimiter = '/';
6630             $end_delimiter = '/';
6631             return join '', $ope, $delimiter, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6632             }
6633              
6634             #
6635             # escape regexp (s/here//)
6636 17     122 0 110 #
6637 122   100     376 sub e_s1 {
6638             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6639 122         476 $modifier ||= '';
6640 122 50       215  
6641 122         378 $modifier =~ tr/p//d;
6642 0         0 if ($modifier =~ /([adlu])/oxms) {
6643 0 0       0 my $line = 0;
6644 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6645 0         0 if ($filename ne __FILE__) {
6646             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6647             last;
6648 0         0 }
6649             }
6650             die qq{Unsupported modifier "$1" used at line $line.\n};
6651 0         0 }
6652              
6653             $slash = 'div';
6654 122 100       294  
    100          
6655 122         516 # literal null string pattern
6656 8         11 if ($string eq '') {
6657 8         9 $modifier =~ tr/bB//d;
6658             $modifier =~ tr/i//d;
6659             return join '', $ope, $delimiter, $end_delimiter, $modifier;
6660             }
6661              
6662             # /b /B modifier
6663             elsif ($modifier =~ tr/bB//d) {
6664 8 50       52  
6665 8         19 # choice again delimiter
6666 0         0 if ($delimiter =~ / [\@:] /oxms) {
  0         0  
6667 0 0       0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
    0          
    0          
    0          
6668 0         0 my %octet = map {$_ => 1} @char;
6669 0         0 if (not $octet{')'}) {
6670             $delimiter = '(';
6671             $end_delimiter = ')';
6672 0         0 }
6673 0         0 elsif (not $octet{'}'}) {
6674             $delimiter = '{';
6675             $end_delimiter = '}';
6676 0         0 }
6677 0         0 elsif (not $octet{']'}) {
6678             $delimiter = '[';
6679             $end_delimiter = ']';
6680 0         0 }
6681 0         0 elsif (not $octet{'>'}) {
6682             $delimiter = '<';
6683             $end_delimiter = '>';
6684 0         0 }
6685 0 0       0 else {
6686 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6687 0         0 if (not $octet{$char}) {
6688 0         0 $delimiter = $char;
6689             $end_delimiter = $char;
6690             last;
6691             }
6692             }
6693             }
6694 0         0 }
6695 8         13  
6696 8         11 my $prematch = '';
6697             $prematch = q{(\G[\x00-\xFF]*?)};
6698             return join '', $ope, $delimiter, $prematch, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
6699 8 100       57 }
6700 106         320  
6701             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6702             my $metachar = qr/[\@\\|[\]{^]/oxms;
6703 106         552  
6704             # split regexp
6705             my @char = $string =~ /\G((?>
6706             [^\x8E\xA1-\xFE\\\$\@\[\(]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
6707             \\ (?>[1-9][0-9]*) |
6708             \\g (?>\s*) (?>[1-9][0-9]*) |
6709             \\g (?>\s*) \{ (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
6710             \\g (?>\s*) \{ (?>\s*) - (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
6711             \\x (?>[0-9A-Fa-f]{1,2}) |
6712             \\ (?>[0-7]{2,3}) |
6713             \\c [\x40-\x5F] |
6714             \\x\{ (?>[0-9A-Fa-f]+) \} |
6715             \\o\{ (?>[0-7]+) \} |
6716             \\[bBNpP]\{ (?>[^\x8E\xA1-\xFE0-9\}][^\x8E\xA1-\xFE\}]*) \} |
6717             \\ $q_char |
6718             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
6719             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
6720             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
6721             [\$\@] $qq_variable |
6722             \$ (?>\s* [0-9]+) |
6723             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
6724             \$ \$ (?![\w\{]) |
6725             \$ (?>\s*) \$ (?>\s*) $qq_variable |
6726             \[\^ |
6727             \[\: (?>[a-z]+) :\] |
6728             \[\:\^ (?>[a-z]+) :\] |
6729             \(\? |
6730             $q_char
6731             ))/oxmsg;
6732 106 50       44422  
6733 106         1509 # choice again delimiter
  0         0  
6734 0 0       0 if ($delimiter =~ / [\@:] /oxms) {
    0          
    0          
    0          
6735 0         0 my %octet = map {$_ => 1} @char;
6736 0         0 if (not $octet{')'}) {
6737             $delimiter = '(';
6738             $end_delimiter = ')';
6739 0         0 }
6740 0         0 elsif (not $octet{'}'}) {
6741             $delimiter = '{';
6742             $end_delimiter = '}';
6743 0         0 }
6744 0         0 elsif (not $octet{']'}) {
6745             $delimiter = '[';
6746             $end_delimiter = ']';
6747 0         0 }
6748 0         0 elsif (not $octet{'>'}) {
6749             $delimiter = '<';
6750             $end_delimiter = '>';
6751 0         0 }
6752 0 0       0 else {
6753 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6754 0         0 if (not $octet{$char}) {
6755 0         0 $delimiter = $char;
6756             $end_delimiter = $char;
6757             last;
6758             }
6759             }
6760             }
6761             }
6762 0         0  
  106         239  
6763             # count '('
6764 436         942 my $parens = grep { $_ eq '(' } @char;
6765 106         237  
6766 106         235 my $left_e = 0;
6767             my $right_e = 0;
6768             for (my $i=0; $i <= $#char; $i++) {
6769 106 50 33     587  
    50 33        
    100          
    100          
    50          
    50          
6770 357         2413 # "\L\u" --> "\u\L"
6771             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
6772             @char[$i,$i+1] = @char[$i+1,$i];
6773             }
6774              
6775 0         0 # "\U\l" --> "\l\U"
6776             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
6777             @char[$i,$i+1] = @char[$i+1,$i];
6778             }
6779              
6780 0         0 # octal escape sequence
6781             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
6782             $char[$i] = Eeuctw::octchr($1);
6783             }
6784              
6785 1         4 # hexadecimal escape sequence
6786             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
6787             $char[$i] = Eeuctw::hexchr($1);
6788             }
6789              
6790             # \b{...} --> b\{...}
6791             # \B{...} --> B\{...}
6792             # \N{CHARNAME} --> N\{CHARNAME}
6793             # \p{PROPERTY} --> p\{PROPERTY}
6794 1         3 # \P{PROPERTY} --> P\{PROPERTY}
6795             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x8E\xA1-\xFE0-9\}][^\x8E\xA1-\xFE\}]*) \} ) \z/oxms) {
6796             $char[$i] = $1 . '\\' . $2;
6797             }
6798              
6799 0         0 # \p, \P, \X --> p, P, X
6800             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
6801             $char[$i] = $1;
6802 0 50 100     0 }
    100 100        
    50 100        
    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          
6803              
6804             if (0) {
6805             }
6806 357         1252  
6807 0 0 0     0 # join separated multiple-octet
    0 0        
    0 0        
      0        
      0        
      0        
6808 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
6809             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)) {
6810             $char[$i] .= join '', splice @char, $i+1, 3;
6811 0         0 }
6812             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)) {
6813             $char[$i] .= join '', splice @char, $i+1, 2;
6814 0         0 }
6815             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)) {
6816             $char[$i] .= join '', splice @char, $i+1, 1;
6817             }
6818             }
6819              
6820 0         0 # open character class [...]
6821 20 50       34 elsif ($char[$i] eq '[') {
6822 20         82 my $left = $i;
6823             if ($char[$i+1] eq ']') {
6824 0         0 $i++;
6825 20 50       108 }
6826 79         130 while (1) {
6827             if (++$i > $#char) {
6828 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
6829 79         185 }
6830             if ($char[$i] eq ']') {
6831             my $right = $i;
6832 20 50       40  
6833 20         142 # [...]
  0         0  
6834             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6835             splice @char, $left, $right-$left+1, sprintf(q{@{[Eeuctw::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
6836 0         0 }
6837             else {
6838             splice @char, $left, $right-$left+1, Eeuctw::charlist_qr(@char[$left+1..$right-1], $modifier);
6839 20         103 }
6840 20         53  
6841             $i = $left;
6842             last;
6843             }
6844             }
6845             }
6846              
6847 20         57 # open character class [^...]
6848 0 0       0 elsif ($char[$i] eq '[^') {
6849 0         0 my $left = $i;
6850             if ($char[$i+1] eq ']') {
6851 0         0 $i++;
6852 0 0       0 }
6853 0         0 while (1) {
6854             if (++$i > $#char) {
6855 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6856 0         0 }
6857             if ($char[$i] eq ']') {
6858             my $right = $i;
6859 0 0       0  
6860 0         0 # [^...]
  0         0  
6861             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6862             splice @char, $left, $right-$left+1, sprintf(q{@{[Eeuctw::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
6863 0         0 }
6864             else {
6865             splice @char, $left, $right-$left+1, Eeuctw::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6866 0         0 }
6867 0         0  
6868             $i = $left;
6869             last;
6870             }
6871             }
6872             }
6873              
6874 0         0 # rewrite character class or escape character
6875             elsif (my $char = character_class($char[$i],$modifier)) {
6876             $char[$i] = $char;
6877             }
6878              
6879 11 50       28 # /i modifier
6880 5         9 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeuctw::uc($char[$i]) ne Eeuctw::fc($char[$i]))) {
6881             if (CORE::length(Eeuctw::fc($char[$i])) == 1) {
6882             $char[$i] = '[' . Eeuctw::uc($char[$i]) . Eeuctw::fc($char[$i]) . ']';
6883 5         11 }
6884             else {
6885             $char[$i] = '(?:' . Eeuctw::uc($char[$i]) . '|' . Eeuctw::fc($char[$i]) . ')';
6886             }
6887             }
6888              
6889 0 50       0 # \u \l \U \L \F \Q \E
6890 8         24 elsif ($char[$i] =~ /\A [<>] \z/oxms) {
6891             if ($right_e < $left_e) {
6892             $char[$i] = '\\' . $char[$i];
6893             }
6894 0         0 }
6895 0         0 elsif ($char[$i] eq '\u') {
6896             $char[$i] = '@{[Eeuctw::ucfirst qq<';
6897             $left_e++;
6898 0         0 }
6899 0         0 elsif ($char[$i] eq '\l') {
6900             $char[$i] = '@{[Eeuctw::lcfirst qq<';
6901             $left_e++;
6902 0         0 }
6903 0         0 elsif ($char[$i] eq '\U') {
6904             $char[$i] = '@{[Eeuctw::uc qq<';
6905             $left_e++;
6906 0         0 }
6907 0         0 elsif ($char[$i] eq '\L') {
6908             $char[$i] = '@{[Eeuctw::lc qq<';
6909             $left_e++;
6910 0         0 }
6911 0         0 elsif ($char[$i] eq '\F') {
6912             $char[$i] = '@{[Eeuctw::fc qq<';
6913             $left_e++;
6914 0         0 }
6915 5         11 elsif ($char[$i] eq '\Q') {
6916             $char[$i] = '@{[CORE::quotemeta qq<';
6917             $left_e++;
6918 5 50       11 }
6919 5         13 elsif ($char[$i] eq '\E') {
6920 5         7 if ($right_e < $left_e) {
6921             $char[$i] = '>]}';
6922             $right_e++;
6923 5         10 }
6924             else {
6925             $char[$i] = '';
6926             }
6927 0         0 }
6928 0 0       0 elsif ($char[$i] eq '\Q') {
6929 0         0 while (1) {
6930             if (++$i > $#char) {
6931 0 0       0 last;
6932 0         0 }
6933             if ($char[$i] eq '\E') {
6934             last;
6935             }
6936             }
6937             }
6938             elsif ($char[$i] eq '\E') {
6939             }
6940              
6941             # \0 --> \0
6942             elsif ($char[$i] =~ /\A \\ (?>\s*) 0 \z/oxms) {
6943             }
6944              
6945             # \g{N}, \g{-N}
6946              
6947             # P.108 Using Simple Patterns
6948             # in Chapter 7: In the World of Regular Expressions
6949             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
6950              
6951             # P.221 Capturing
6952             # in Chapter 5: Pattern Matching
6953             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
6954              
6955             # \g{-1}, \g{-2}, \g{-3} --> \g{-1}, \g{-2}, \g{-3}
6956             elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) - (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6957             }
6958              
6959 0 0       0 # \g{1}, \g{2}, \g{3} --> \g{2}, \g{3}, \g{4} (only when multibyte anchoring is enable)
6960 0         0 elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6961             if ($1 <= $parens) {
6962             $char[$i] = '\\g{' . ($1 + 1) . '}';
6963             }
6964             }
6965              
6966 0 0       0 # \g1, \g2, \g3 --> \g2, \g3, \g4 (only when multibyte anchoring is enable)
6967 0         0 elsif ($char[$i] =~ /\A \\g (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
6968             if ($1 <= $parens) {
6969             $char[$i] = '\\g' . ($1 + 1);
6970             }
6971             }
6972              
6973 0 0       0 # \1, \2, \3 --> \2, \3, \4 (only when multibyte anchoring is enable)
6974 0         0 elsif ($char[$i] =~ /\A \\ (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
6975             if ($1 <= $parens) {
6976             $char[$i] = '\\' . ($1 + 1);
6977             }
6978             }
6979              
6980 0 0       0 # $0 --> $0
6981 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
6982             if ($ignorecase) {
6983             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
6984             }
6985 0 0       0 }
6986 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
6987             if ($ignorecase) {
6988             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
6989             }
6990             }
6991              
6992             # $$ --> $$
6993             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
6994             }
6995              
6996             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6997 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
6998 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
6999 0         0 $char[$i] = e_capture($1);
7000             if ($ignorecase) {
7001             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7002             }
7003 0         0 }
7004 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
7005 0         0 $char[$i] = e_capture($1);
7006             if ($ignorecase) {
7007             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7008             }
7009             }
7010              
7011 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
7012 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) {
7013 0         0 $char[$i] = e_capture($1.'->'.$2);
7014             if ($ignorecase) {
7015             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7016             }
7017             }
7018              
7019 0         0 # $$foo{ ... } --> $ $foo->{ ... }
7020 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) {
7021 0         0 $char[$i] = e_capture($1.'->'.$2);
7022             if ($ignorecase) {
7023             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7024             }
7025             }
7026              
7027 0         0 # $$foo
7028 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
7029 0         0 $char[$i] = e_capture($1);
7030             if ($ignorecase) {
7031             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7032             }
7033             }
7034              
7035 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeuctw::PREMATCH()
7036 4         13 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
7037             if ($ignorecase) {
7038             $char[$i] = '@{[Eeuctw::ignorecase(Eeuctw::PREMATCH())]}';
7039 0         0 }
7040             else {
7041             $char[$i] = '@{[Eeuctw::PREMATCH()]}';
7042             }
7043             }
7044              
7045 4 50       17 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeuctw::MATCH()
7046 4         14 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
7047             if ($ignorecase) {
7048             $char[$i] = '@{[Eeuctw::ignorecase(Eeuctw::MATCH())]}';
7049 0         0 }
7050             else {
7051             $char[$i] = '@{[Eeuctw::MATCH()]}';
7052             }
7053             }
7054              
7055 4 50       13 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeuctw::POSTMATCH()
7056 3         10 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
7057             if ($ignorecase) {
7058             $char[$i] = '@{[Eeuctw::ignorecase(Eeuctw::POSTMATCH())]}';
7059 0         0 }
7060             else {
7061             $char[$i] = '@{[Eeuctw::POSTMATCH()]}';
7062             }
7063             }
7064              
7065 3 0       12 # ${ foo }
7066 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) {
7067             if ($ignorecase) {
7068             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7069             }
7070             }
7071              
7072 0         0 # ${ ... }
7073 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
7074 0         0 $char[$i] = e_capture($1);
7075             if ($ignorecase) {
7076             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7077             }
7078             }
7079              
7080 0         0 # $scalar or @array
7081 9 50       25 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
7082 9         48 $char[$i] = e_string($char[$i]);
7083             if ($ignorecase) {
7084             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7085             }
7086             }
7087              
7088 0 50       0 # quote character before ? + * {
7089             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7090             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
7091 23         138 }
7092             else {
7093             $char[$i-1] = '(?:' . $char[$i-1] . ')';
7094             }
7095             }
7096             }
7097 23         125  
7098 106         334 # make regexp string
7099 106         295 my $prematch = '';
7100 106 50       175 $prematch = "($anchor)";
7101 106         472 $modifier =~ tr/i//d;
7102             if ($left_e > $right_e) {
7103 0         0 return join '', $ope, $delimiter, $prematch, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
7104             }
7105             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
7106             }
7107              
7108             #
7109             # escape regexp (s'here'' or s'here''b)
7110 106     34 0 1296 #
7111 34   100     91 sub e_s1_q {
7112             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7113 34         105 $modifier ||= '';
7114 34 50       45  
7115 34         77 $modifier =~ tr/p//d;
7116 0         0 if ($modifier =~ /([adlu])/oxms) {
7117 0 0       0 my $line = 0;
7118 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7119 0         0 if ($filename ne __FILE__) {
7120             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7121             last;
7122 0         0 }
7123             }
7124             die qq{Unsupported modifier "$1" used at line $line.\n};
7125 0         0 }
7126              
7127             $slash = 'div';
7128 34 100       52  
    100          
7129 34         96 # literal null string pattern
7130 8         11 if ($string eq '') {
7131 8         10 $modifier =~ tr/bB//d;
7132             $modifier =~ tr/i//d;
7133             return join '', $ope, $delimiter, $end_delimiter, $modifier;
7134             }
7135              
7136 8         45 # with /b /B modifier
7137             elsif ($modifier =~ tr/bB//d) {
7138             return e_s1_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
7139             }
7140              
7141 8         43 # without /b /B modifier
7142             else {
7143             return e_s1_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
7144             }
7145             }
7146              
7147             #
7148             # escape regexp (s'here'')
7149 18     18 0 51 #
7150             sub e_s1_qt {
7151 18 100       41 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7152              
7153             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7154 18         42  
7155             # split regexp
7156             my @char = $string =~ /\G((?>
7157             [^\x8E\xA1-\xFE\\\[\$\@\/] |
7158             [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
7159             \[\^ |
7160             \[\: (?>[a-z]+) \:\] |
7161             \[\:\^ (?>[a-z]+) \:\] |
7162             [\$\@\/] |
7163             \\ (?:$q_char) |
7164             (?:$q_char)
7165             ))/oxmsg;
7166 18         500  
7167 18 50 100     71 # unescape character
    50 100        
    50 66        
    100          
    100          
    50          
7168             for (my $i=0; $i <= $#char; $i++) {
7169             if (0) {
7170             }
7171 36         182  
7172 0         0 # open character class [...]
7173 0 0       0 elsif ($char[$i] eq '[') {
7174 0         0 my $left = $i;
7175             if ($char[$i+1] eq ']') {
7176 0         0 $i++;
7177 0 0       0 }
7178 0         0 while (1) {
7179             if (++$i > $#char) {
7180 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
7181 0         0 }
7182             if ($char[$i] eq ']') {
7183             my $right = $i;
7184 0         0  
7185             # [...]
7186 0         0 splice @char, $left, $right-$left+1, Eeuctw::charlist_qr(@char[$left+1..$right-1], $modifier);
7187 0         0  
7188             $i = $left;
7189             last;
7190             }
7191             }
7192             }
7193              
7194 0         0 # open character class [^...]
7195 0 0       0 elsif ($char[$i] eq '[^') {
7196 0         0 my $left = $i;
7197             if ($char[$i+1] eq ']') {
7198 0         0 $i++;
7199 0 0       0 }
7200 0         0 while (1) {
7201             if (++$i > $#char) {
7202 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
7203 0         0 }
7204             if ($char[$i] eq ']') {
7205             my $right = $i;
7206 0         0  
7207             # [^...]
7208 0         0 splice @char, $left, $right-$left+1, Eeuctw::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7209 0         0  
7210             $i = $left;
7211             last;
7212             }
7213             }
7214             }
7215              
7216 0         0 # escape $ @ / and \
7217             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
7218             $char[$i] = '\\' . $char[$i];
7219             }
7220              
7221 0         0 # rewrite character class or escape character
7222             elsif (my $char = character_class($char[$i],$modifier)) {
7223             $char[$i] = $char;
7224             }
7225              
7226 6 50       33 # /i modifier
7227 2         5 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeuctw::uc($char[$i]) ne Eeuctw::fc($char[$i]))) {
7228             if (CORE::length(Eeuctw::fc($char[$i])) == 1) {
7229             $char[$i] = '[' . Eeuctw::uc($char[$i]) . Eeuctw::fc($char[$i]) . ']';
7230 2         5 }
7231             else {
7232             $char[$i] = '(?:' . Eeuctw::uc($char[$i]) . '|' . Eeuctw::fc($char[$i]) . ')';
7233             }
7234             }
7235              
7236 0 0       0 # quote character before ? + * {
7237             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7238             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
7239 0         0 }
7240             else {
7241             $char[$i-1] = '(?:' . $char[$i-1] . ')';
7242             }
7243             }
7244 0         0 }
7245 18         42  
7246 18         31 $modifier =~ tr/i//d;
7247 18         22 $delimiter = '/';
7248 18         23 $end_delimiter = '/';
7249 18         42 my $prematch = '';
7250             $prematch = "($anchor)";
7251             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
7252             }
7253              
7254             #
7255             # escape regexp (s'here''b)
7256 18     8 0 136 #
7257             sub e_s1_qb {
7258             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7259 8         23  
7260             # split regexp
7261             my @char = $string =~ /\G (?>[^\\]|\\\\|[\x00-\xFF]) /oxmsg;
7262 8         38  
7263 8 50       49 # unescape character
    50          
7264             for (my $i=0; $i <= $#char; $i++) {
7265             if (0) {
7266             }
7267 24         98  
7268             # remain \\
7269             elsif ($char[$i] eq '\\\\') {
7270             }
7271              
7272 0         0 # escape $ @ / and \
7273             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
7274             $char[$i] = '\\' . $char[$i];
7275             }
7276 0         0 }
7277 8         15  
7278 8         10 $delimiter = '/';
7279 8         11 $end_delimiter = '/';
7280 8         11 my $prematch = '';
7281             $prematch = q{(\G[\x00-\xFF]*?)};
7282             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
7283             }
7284              
7285             #
7286             # escape regexp (s''here')
7287 8     29 0 65 #
7288             sub e_s2_q {
7289 29         69 my($ope,$delimiter,$end_delimiter,$string) = @_;
7290              
7291 29         42 $slash = 'div';
7292 29         255  
7293 29 100       88 my @char = $string =~ / \G (?>[^\x8E\xA1-\xFE\\]|\\\\|$q_char) /oxmsg;
    100          
7294             for (my $i=0; $i <= $#char; $i++) {
7295             if (0) {
7296             }
7297 9         32  
7298             # not escape \\
7299             elsif ($char[$i] =~ /\A \\\\ \z/oxms) {
7300             }
7301              
7302 0         0 # escape $ @ / and \
7303             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
7304             $char[$i] = '\\' . $char[$i];
7305             }
7306 5         15 }
7307              
7308             return join '', $ope, $delimiter, @char, $end_delimiter;
7309             }
7310              
7311             #
7312             # escape regexp (s/here/and here/modifier)
7313 29     156 0 95 #
7314 156   100     1439 sub e_sub {
7315             my($variable,$delimiter1,$pattern,$end_delimiter1,$delimiter2,$replacement,$end_delimiter2,$modifier) = @_;
7316 156         691 $modifier ||= '';
7317 156 50       347  
7318 156         466 $modifier =~ tr/p//d;
7319 0         0 if ($modifier =~ /([adlu])/oxms) {
7320 0 0       0 my $line = 0;
7321 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7322 0         0 if ($filename ne __FILE__) {
7323             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7324             last;
7325 0         0 }
7326             }
7327             die qq{Unsupported modifier "$1" used at line $line.\n};
7328 0 100       0 }
7329 156         424  
7330 37         51 if ($variable eq '') {
7331             $variable = '$_';
7332             $bind_operator = ' =~ ';
7333 37         44 }
7334              
7335             $slash = 'div';
7336              
7337             # P.128 Start of match (or end of previous match): \G
7338             # P.130 Advanced Use of \G with Perl
7339             # in Chapter 3: Overview of Regular Expression Features and Flavors
7340             # P.312 Iterative Matching: Scalar Context, with /g
7341             # in Chapter 7: Perl
7342             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
7343              
7344             # P.181 Where You Left Off: The \G Assertion
7345             # in Chapter 5: Pattern Matching
7346             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
7347              
7348             # P.220 Where You Left Off: The \G Assertion
7349             # in Chapter 5: Pattern Matching
7350 156         292 # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7351 156         260  
7352             my $e_modifier = $modifier =~ tr/e//d;
7353 156         241 my $r_modifier = $modifier =~ tr/r//d;
7354 156 50       253  
7355 156         428 my $my = '';
7356 0         0 if ($variable =~ s/\A \( (?>\s*) ( (?>(?: local \b | my \b | our \b | state \b )?) .+ ) \) \z/$1/oxms) {
7357 0         0 $my = $variable;
7358             $variable =~ s/ (?: local \b | my \b | our \b | state \b ) (?>\s*) //oxms;
7359             $variable =~ s/ = .+ \z//oxms;
7360 0         0 }
7361 156         517  
7362             (my $variable_basename = $variable) =~ s/ [\[\{].* \z//oxms;
7363             $variable_basename =~ s/ \s+ \z//oxms;
7364 156         297  
7365 156 100       246 # quote replacement string
7366 156         446 my $e_replacement = '';
7367 17         35 if ($e_modifier >= 1) {
7368             $e_replacement = e_qq('', '', '', $replacement);
7369             $e_modifier--;
7370 17 100       27 }
7371 139         338 else {
7372             if ($delimiter2 eq "'") {
7373             $e_replacement = e_s2_q('qq', '/', '/', $replacement);
7374 29         70 }
7375             else {
7376             $e_replacement = e_qq ('qq', $delimiter2, $end_delimiter2, $replacement);
7377             }
7378 110         348 }
7379              
7380             my $sub = '';
7381 156 100       288  
7382 156 100       393 # with /r
    50          
7383             if ($r_modifier) {
7384             if (0) {
7385             }
7386 8         22  
7387 0 50       0 # s///gr with multibyte anchoring
7388             elsif ($modifier =~ /g/oxms) {
7389             $sub = sprintf(
7390             # 1 2 3 4 5
7391             q,
7392              
7393             $variable, # 1
7394             ($delimiter1 eq "'") ? # 2
7395             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7396             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7397             $s_matched, # 3
7398             $e_replacement, # 4
7399             '$Eeuctw::re_r=CORE::eval $Eeuctw::re_r; ' x $e_modifier, # 5
7400             );
7401             }
7402              
7403 4 0       16 # s///gr without multibyte anchoring
7404             elsif ($modifier =~ /g/oxms) {
7405             $sub = sprintf(
7406             # 1 2 3 4 5
7407             q,
7408              
7409             $variable, # 1
7410             ($delimiter1 eq "'") ? # 2
7411             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7412             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7413             $s_matched, # 3
7414             $e_replacement, # 4
7415             '$Eeuctw::re_r=CORE::eval $Eeuctw::re_r; ' x $e_modifier, # 5
7416             );
7417             }
7418              
7419             # s///r
7420 0         0 else {
7421 4         5  
7422             my $prematch = q{$`};
7423 4 50       5 $prematch = q{${1}};
7424              
7425             $sub = sprintf(
7426             # 1 2 3 4 5 6 7
7427             q<(%s =~ %s) ? CORE::eval{%s local $^W=0; local $Eeuctw::re_r=%s; %s"%s$Eeuctw::re_r$'" } : %s>,
7428              
7429             $variable, # 1
7430             ($delimiter1 eq "'") ? # 2
7431             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7432             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7433             $s_matched, # 3
7434             $e_replacement, # 4
7435             '$Eeuctw::re_r=CORE::eval $Eeuctw::re_r; ' x $e_modifier, # 5
7436             $prematch, # 6
7437             $variable, # 7
7438             );
7439             }
7440 4 50       13  
7441 8         22 # $var !~ s///r doesn't make sense
7442             if ($bind_operator =~ / !~ /oxms) {
7443             $sub = q{die("$0: Using !~ with s///r doesn't make sense"), } . $sub;
7444             }
7445             }
7446              
7447 0 100       0 # without /r
    50          
7448             else {
7449             if (0) {
7450             }
7451 148         502  
7452 0 100       0 # s///g with multibyte anchoring
    100          
7453             elsif ($modifier =~ /g/oxms) {
7454             $sub = sprintf(
7455             # 1 2 3 4 5 6 7 8 9 10
7456             q,
7457              
7458             $variable, # 1
7459             ($delimiter1 eq "'") ? # 2
7460             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7461             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7462             $s_matched, # 3
7463             $e_replacement, # 4
7464             '$Eeuctw::re_r=CORE::eval $Eeuctw::re_r; ' x $e_modifier, # 5
7465             $variable, # 6
7466             $variable, # 7
7467             $variable, # 8
7468             $variable, # 9
7469              
7470             # Binary "!~" is just like "=~" except the return value is negated in the logical sense.
7471             # It returns false if the match succeeds, and true if it fails.
7472             # (and so on)
7473              
7474             ($bind_operator =~ / !~ /oxms) ? '!' : '', # 10
7475             );
7476             }
7477              
7478 29 0       142 # s///g without multibyte anchoring
    0          
7479             elsif ($modifier =~ /g/oxms) {
7480             $sub = sprintf(
7481             # 1 2 3 4 5 6 7 8
7482             q,
7483              
7484             $variable, # 1
7485             ($delimiter1 eq "'") ? # 2
7486             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7487             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7488             $s_matched, # 3
7489             $e_replacement, # 4
7490             '$Eeuctw::re_r=CORE::eval $Eeuctw::re_r; ' x $e_modifier, # 5
7491             $variable, # 6
7492             $variable, # 7
7493             ($bind_operator =~ / !~ /oxms) ? '!' : '', # 8
7494             );
7495             }
7496              
7497             # s///
7498 0         0 else {
7499 119         220  
7500             my $prematch = q{$`};
7501 119 100       175 $prematch = q{${1}};
    100          
7502              
7503             $sub = sprintf(
7504              
7505             ($bind_operator =~ / =~ /oxms) ?
7506              
7507             # 1 2 3 4 5 6 7 8
7508             q<(%s%s%s) ? CORE::eval{%s local $^W=0; local $Eeuctw::re_r=%s; %s%s="%s$Eeuctw::re_r$'"; 1 } : undef> :
7509              
7510             # 1 2 3 4 5 6 7 8
7511             q<(%s%s%s) ? 1 : CORE::eval{%s local $^W=0; local $Eeuctw::re_r=%s; %s%s="%s$Eeuctw::re_r$'"; undef }>,
7512              
7513             $variable, # 1
7514             $bind_operator, # 2
7515             ($delimiter1 eq "'") ? # 3
7516             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7517             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7518             $s_matched, # 4
7519             $e_replacement, # 5
7520             '$Eeuctw::re_r=CORE::eval $Eeuctw::re_r; ' x $e_modifier, # 6
7521             $variable, # 7
7522             $prematch, # 8
7523             );
7524             }
7525             }
7526 119 50       874  
7527 156         464 # (my $foo = $bar) =~ s/// --> (my $foo = $bar, CORE::eval { ... })[1]
7528             if ($my ne '') {
7529             $sub = "($my, $sub)[1]";
7530             }
7531 0         0  
7532 156         258 # clear s/// variable
7533             $sub_variable = '';
7534 156         219 $bind_operator = '';
7535              
7536             return $sub;
7537             }
7538              
7539             #
7540             # escape regexp of split qr//
7541 156     143 0 1618 #
7542 143   100     639 sub e_split {
7543             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7544 143         582 $modifier ||= '';
7545 143 50       281  
7546 143         440 $modifier =~ tr/p//d;
7547 0         0 if ($modifier =~ /([adlu])/oxms) {
7548 0 0       0 my $line = 0;
7549 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7550 0         0 if ($filename ne __FILE__) {
7551             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7552             last;
7553 0         0 }
7554             }
7555             die qq{Unsupported modifier "$1" used at line $line.\n};
7556 0         0 }
7557              
7558             $slash = 'div';
7559 143 100       230  
7560 143         283 # /b /B modifier
7561             if ($modifier =~ tr/bB//d) {
7562             return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
7563 18 100       82 }
7564 125         321  
7565             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7566             my $metachar = qr/[\@\\|[\]{^]/oxms;
7567 125         424  
7568             # split regexp
7569             my @char = $string =~ /\G((?>
7570             [^\x8E\xA1-\xFE\\\$\@\[\(]|[\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
7571             \\x (?>[0-9A-Fa-f]{1,2}) |
7572             \\ (?>[0-7]{2,3}) |
7573             \\c [\x40-\x5F] |
7574             \\x\{ (?>[0-9A-Fa-f]+) \} |
7575             \\o\{ (?>[0-7]+) \} |
7576             \\[bBNpP]\{ (?>[^\x8E\xA1-\xFE0-9\}][^\x8E\xA1-\xFE\}]*) \} |
7577             \\ $q_char |
7578             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
7579             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
7580             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
7581             [\$\@] $qq_variable |
7582             \$ (?>\s* [0-9]+) |
7583             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
7584             \$ \$ (?![\w\{]) |
7585             \$ (?>\s*) \$ (?>\s*) $qq_variable |
7586             \[\^ |
7587             \[\: (?>[a-z]+) :\] |
7588             \[\:\^ (?>[a-z]+) :\] |
7589             \(\? |
7590             $q_char
7591 125         20525 ))/oxmsg;
7592 125         605  
7593 125         399 my $left_e = 0;
7594             my $right_e = 0;
7595             for (my $i=0; $i <= $#char; $i++) {
7596 125 50 33     505  
    50 33        
    100          
    100          
    50          
    50          
7597 308         1768 # "\L\u" --> "\u\L"
7598             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
7599             @char[$i,$i+1] = @char[$i+1,$i];
7600             }
7601              
7602 0         0 # "\U\l" --> "\l\U"
7603             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
7604             @char[$i,$i+1] = @char[$i+1,$i];
7605             }
7606              
7607 0         0 # octal escape sequence
7608             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
7609             $char[$i] = Eeuctw::octchr($1);
7610             }
7611              
7612 1         4 # hexadecimal escape sequence
7613             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
7614             $char[$i] = Eeuctw::hexchr($1);
7615             }
7616              
7617             # \b{...} --> b\{...}
7618             # \B{...} --> B\{...}
7619             # \N{CHARNAME} --> N\{CHARNAME}
7620             # \p{PROPERTY} --> p\{PROPERTY}
7621 1         3 # \P{PROPERTY} --> P\{PROPERTY}
7622             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x8E\xA1-\xFE0-9\}][^\x8E\xA1-\xFE\}]*) \} ) \z/oxms) {
7623             $char[$i] = $1 . '\\' . $2;
7624             }
7625              
7626 0         0 # \p, \P, \X --> p, P, X
7627             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
7628             $char[$i] = $1;
7629 0 50 100     0 }
    100 100        
    100 66        
    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          
7630              
7631             if (0) {
7632             }
7633 308         1161  
7634 0 0 0     0 # join separated multiple-octet
    0 0        
    0 0        
      0        
      0        
      0        
7635 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
7636             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)) {
7637             $char[$i] .= join '', splice @char, $i+1, 3;
7638 0         0 }
7639             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)) {
7640             $char[$i] .= join '', splice @char, $i+1, 2;
7641 0         0 }
7642             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)) {
7643             $char[$i] .= join '', splice @char, $i+1, 1;
7644             }
7645             }
7646              
7647 0         0 # open character class [...]
7648 3 50       7 elsif ($char[$i] eq '[') {
7649 3         12 my $left = $i;
7650             if ($char[$i+1] eq ']') {
7651 0         0 $i++;
7652 3 50       7 }
7653 7         13 while (1) {
7654             if (++$i > $#char) {
7655 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
7656 7         16 }
7657             if ($char[$i] eq ']') {
7658             my $right = $i;
7659 3 50       51  
7660 3         25 # [...]
  0         0  
7661             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7662             splice @char, $left, $right-$left+1, sprintf(q{@{[Eeuctw::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
7663 0         0 }
7664             else {
7665             splice @char, $left, $right-$left+1, Eeuctw::charlist_qr(@char[$left+1..$right-1], $modifier);
7666 3         20 }
7667 3         7  
7668             $i = $left;
7669             last;
7670             }
7671             }
7672             }
7673              
7674 3         11 # open character class [^...]
7675 1 50       2 elsif ($char[$i] eq '[^') {
7676 1         3 my $left = $i;
7677             if ($char[$i+1] eq ']') {
7678 0         0 $i++;
7679 1 50       2 }
7680 2         5 while (1) {
7681             if (++$i > $#char) {
7682 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
7683 2         6 }
7684             if ($char[$i] eq ']') {
7685             my $right = $i;
7686 1 50       2  
7687 1         6 # [^...]
  0         0  
7688             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7689             splice @char, $left, $right-$left+1, sprintf(q{@{[Eeuctw::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
7690 0         0 }
7691             else {
7692             splice @char, $left, $right-$left+1, Eeuctw::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7693 1         5 }
7694 1         2  
7695             $i = $left;
7696             last;
7697             }
7698             }
7699             }
7700              
7701 1         3 # rewrite character class or escape character
7702             elsif (my $char = character_class($char[$i],$modifier)) {
7703             $char[$i] = $char;
7704             }
7705              
7706             # P.794 29.2.161. split
7707             # in Chapter 29: Functions
7708             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
7709              
7710             # P.951 split
7711             # in Chapter 27: Functions
7712             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7713              
7714             # said "The //m modifier is assumed when you split on the pattern /^/",
7715             # but perl5.008 is not so. Therefore, this software adds //m.
7716             # (and so on)
7717              
7718 5         16 # split(m/^/) --> split(m/^/m)
7719             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
7720             $modifier .= 'm';
7721             }
7722              
7723 11 50       34 # /i modifier
7724 6         11 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeuctw::uc($char[$i]) ne Eeuctw::fc($char[$i]))) {
7725             if (CORE::length(Eeuctw::fc($char[$i])) == 1) {
7726             $char[$i] = '[' . Eeuctw::uc($char[$i]) . Eeuctw::fc($char[$i]) . ']';
7727 6         13 }
7728             else {
7729             $char[$i] = '(?:' . Eeuctw::uc($char[$i]) . '|' . Eeuctw::fc($char[$i]) . ')';
7730             }
7731             }
7732              
7733 0 50       0 # \u \l \U \L \F \Q \E
7734 2         9 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
7735             if ($right_e < $left_e) {
7736             $char[$i] = '\\' . $char[$i];
7737             }
7738 0         0 }
7739 0         0 elsif ($char[$i] eq '\u') {
7740             $char[$i] = '@{[Eeuctw::ucfirst qq<';
7741             $left_e++;
7742 0         0 }
7743 0         0 elsif ($char[$i] eq '\l') {
7744             $char[$i] = '@{[Eeuctw::lcfirst qq<';
7745             $left_e++;
7746 0         0 }
7747 0         0 elsif ($char[$i] eq '\U') {
7748             $char[$i] = '@{[Eeuctw::uc qq<';
7749             $left_e++;
7750 0         0 }
7751 0         0 elsif ($char[$i] eq '\L') {
7752             $char[$i] = '@{[Eeuctw::lc qq<';
7753             $left_e++;
7754 0         0 }
7755 0         0 elsif ($char[$i] eq '\F') {
7756             $char[$i] = '@{[Eeuctw::fc qq<';
7757             $left_e++;
7758 0         0 }
7759 0         0 elsif ($char[$i] eq '\Q') {
7760             $char[$i] = '@{[CORE::quotemeta qq<';
7761             $left_e++;
7762 0 0       0 }
7763 0         0 elsif ($char[$i] eq '\E') {
7764 0         0 if ($right_e < $left_e) {
7765             $char[$i] = '>]}';
7766             $right_e++;
7767 0         0 }
7768             else {
7769             $char[$i] = '';
7770             }
7771 0         0 }
7772 0 0       0 elsif ($char[$i] eq '\Q') {
7773 0         0 while (1) {
7774             if (++$i > $#char) {
7775 0 0       0 last;
7776 0         0 }
7777             if ($char[$i] eq '\E') {
7778             last;
7779             }
7780             }
7781             }
7782             elsif ($char[$i] eq '\E') {
7783             }
7784              
7785 0 0       0 # $0 --> $0
7786 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
7787             if ($ignorecase) {
7788             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7789             }
7790 0 0       0 }
7791 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
7792             if ($ignorecase) {
7793             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7794             }
7795             }
7796              
7797             # $$ --> $$
7798             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
7799             }
7800              
7801             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
7802 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
7803 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
7804 0         0 $char[$i] = e_capture($1);
7805             if ($ignorecase) {
7806             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7807             }
7808 0         0 }
7809 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
7810 0         0 $char[$i] = e_capture($1);
7811             if ($ignorecase) {
7812             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7813             }
7814             }
7815              
7816 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
7817 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) {
7818 0         0 $char[$i] = e_capture($1.'->'.$2);
7819             if ($ignorecase) {
7820             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7821             }
7822             }
7823              
7824 0         0 # $$foo{ ... } --> $ $foo->{ ... }
7825 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) {
7826 0         0 $char[$i] = e_capture($1.'->'.$2);
7827             if ($ignorecase) {
7828             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7829             }
7830             }
7831              
7832 0         0 # $$foo
7833 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
7834 0         0 $char[$i] = e_capture($1);
7835             if ($ignorecase) {
7836             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7837             }
7838             }
7839              
7840 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeuctw::PREMATCH()
7841 12         30 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
7842             if ($ignorecase) {
7843             $char[$i] = '@{[Eeuctw::ignorecase(Eeuctw::PREMATCH())]}';
7844 0         0 }
7845             else {
7846             $char[$i] = '@{[Eeuctw::PREMATCH()]}';
7847             }
7848             }
7849              
7850 12 50       55 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeuctw::MATCH()
7851 12         34 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
7852             if ($ignorecase) {
7853             $char[$i] = '@{[Eeuctw::ignorecase(Eeuctw::MATCH())]}';
7854 0         0 }
7855             else {
7856             $char[$i] = '@{[Eeuctw::MATCH()]}';
7857             }
7858             }
7859              
7860 12 50       58 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeuctw::POSTMATCH()
7861 9         24 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
7862             if ($ignorecase) {
7863             $char[$i] = '@{[Eeuctw::ignorecase(Eeuctw::POSTMATCH())]}';
7864 0         0 }
7865             else {
7866             $char[$i] = '@{[Eeuctw::POSTMATCH()]}';
7867             }
7868             }
7869              
7870 9 0       41 # ${ foo }
7871 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) {
7872             if ($ignorecase) {
7873             $char[$i] = '@{[Eeuctw::ignorecase(' . $1 . ')]}';
7874             }
7875             }
7876              
7877 0         0 # ${ ... }
7878 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
7879 0         0 $char[$i] = e_capture($1);
7880             if ($ignorecase) {
7881             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7882             }
7883             }
7884              
7885 0         0 # $scalar or @array
7886 3 50       10 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
7887 3         13 $char[$i] = e_string($char[$i]);
7888             if ($ignorecase) {
7889             $char[$i] = '@{[Eeuctw::ignorecase(' . $char[$i] . ')]}';
7890             }
7891             }
7892              
7893 0 100       0 # quote character before ? + * {
7894             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7895             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
7896 7         37 }
7897             else {
7898             $char[$i-1] = '(?:' . $char[$i-1] . ')';
7899             }
7900             }
7901             }
7902 4         21  
7903 125 50       281 # make regexp string
7904 125         282 $modifier =~ tr/i//d;
7905             if ($left_e > $right_e) {
7906 0         0 return join '', 'Eeuctw::split', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter, $modifier;
7907             }
7908             return join '', 'Eeuctw::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
7909             }
7910              
7911             #
7912             # escape regexp of split qr''
7913 125     24 0 1349 #
7914 24   100     107 sub e_split_q {
7915             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7916 24         77 $modifier ||= '';
7917 24 50       42  
7918 24         64 $modifier =~ tr/p//d;
7919 0         0 if ($modifier =~ /([adlu])/oxms) {
7920 0 0       0 my $line = 0;
7921 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7922 0         0 if ($filename ne __FILE__) {
7923             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7924             last;
7925 0         0 }
7926             }
7927             die qq{Unsupported modifier "$1" used at line $line.\n};
7928 0         0 }
7929              
7930             $slash = 'div';
7931 24 100       38  
7932 24         50 # /b /B modifier
7933             if ($modifier =~ tr/bB//d) {
7934             return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
7935 12 100       56 }
7936              
7937             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7938 12         32  
7939             # split regexp
7940             my @char = $string =~ /\G((?>
7941             [^\x8E\xA1-\xFE\\\[] |
7942             [\xA1-\xFE][\xA1-\xFE]|\x8E[\xA1-\xB0][\xA1-\xFE][\x00-\xFF] |
7943             \[\^ |
7944             \[\: (?>[a-z]+) \:\] |
7945             \[\:\^ (?>[a-z]+) \:\] |
7946             \\ (?:$q_char) |
7947             (?:$q_char)
7948             ))/oxmsg;
7949 12         193  
7950 12 50 33     91 # unescape character
    50 100        
    50 66        
    50 33        
    100          
    50          
7951             for (my $i=0; $i <= $#char; $i++) {
7952             if (0) {
7953             }
7954 12         63  
7955 0         0 # open character class [...]
7956 0 0       0 elsif ($char[$i] eq '[') {
7957 0         0 my $left = $i;
7958             if ($char[$i+1] eq ']') {
7959 0         0 $i++;
7960 0 0       0 }
7961 0         0 while (1) {
7962             if (++$i > $#char) {
7963 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
7964 0         0 }
7965             if ($char[$i] eq ']') {
7966             my $right = $i;
7967 0         0  
7968             # [...]
7969 0         0 splice @char, $left, $right-$left+1, Eeuctw::charlist_qr(@char[$left+1..$right-1], $modifier);
7970 0         0  
7971             $i = $left;
7972             last;
7973             }
7974             }
7975             }
7976              
7977 0         0 # open character class [^...]
7978 0 0       0 elsif ($char[$i] eq '[^') {
7979 0         0 my $left = $i;
7980             if ($char[$i+1] eq ']') {
7981 0         0 $i++;
7982 0 0       0 }
7983 0         0 while (1) {
7984             if (++$i > $#char) {
7985 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
7986 0         0 }
7987             if ($char[$i] eq ']') {
7988             my $right = $i;
7989 0         0  
7990             # [^...]
7991 0         0 splice @char, $left, $right-$left+1, Eeuctw::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7992 0         0  
7993             $i = $left;
7994             last;
7995             }
7996             }
7997             }
7998              
7999 0         0 # rewrite character class or escape character
8000             elsif (my $char = character_class($char[$i],$modifier)) {
8001             $char[$i] = $char;
8002             }
8003              
8004 0         0 # split(m/^/) --> split(m/^/m)
8005             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
8006             $modifier .= 'm';
8007             }
8008              
8009 0 50       0 # /i modifier
8010 4         11 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeuctw::uc($char[$i]) ne Eeuctw::fc($char[$i]))) {
8011             if (CORE::length(Eeuctw::fc($char[$i])) == 1) {
8012             $char[$i] = '[' . Eeuctw::uc($char[$i]) . Eeuctw::fc($char[$i]) . ']';
8013 4         11 }
8014             else {
8015             $char[$i] = '(?:' . Eeuctw::uc($char[$i]) . '|' . Eeuctw::fc($char[$i]) . ')';
8016             }
8017             }
8018              
8019 0 0       0 # quote character before ? + * {
8020             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
8021             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
8022 0         0 }
8023             else {
8024             $char[$i-1] = '(?:' . $char[$i-1] . ')';
8025             }
8026             }
8027 0         0 }
8028 12         24  
8029             $modifier =~ tr/i//d;
8030             return join '', 'Eeuctw::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
8031             }
8032              
8033             #
8034             # instead of Carp::carp
8035 12     0 0 86 #
8036 0           sub carp {
8037             my($package,$filename,$line) = caller(1);
8038             print STDERR "@_ at $filename line $line.\n";
8039             }
8040              
8041             #
8042             # instead of Carp::croak
8043 0     0 0   #
8044 0           sub croak {
8045 0           my($package,$filename,$line) = caller(1);
8046             print STDERR "@_ at $filename line $line.\n";
8047             die "\n";
8048             }
8049              
8050             #
8051             # instead of Carp::cluck
8052 0     0 0   #
8053 0           sub cluck {
8054 0           my $i = 0;
8055 0           my @cluck = ();
8056 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
8057             push @cluck, "[$i] $filename($line) $package::$subroutine\n";
8058 0           $i++;
8059 0           }
8060 0           print STDERR CORE::reverse @cluck;
8061             print STDERR "\n";
8062             print STDERR @_;
8063             }
8064              
8065             #
8066             # instead of Carp::confess
8067 0     0 0   #
8068 0           sub confess {
8069 0           my $i = 0;
8070 0           my @confess = ();
8071 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
8072             push @confess, "[$i] $filename($line) $package::$subroutine\n";
8073 0           $i++;
8074 0           }
8075 0           print STDERR CORE::reverse @confess;
8076 0           print STDERR "\n";
8077             print STDERR @_;
8078             die "\n";
8079             }
8080              
8081             1;
8082              
8083             __END__