File Coverage

blib/lib/Eeucjp.pm
Criterion Covered Total %
statement 1072 3265 32.8
branch 1116 2802 39.8
condition 145 361 40.1
subroutine 57 113 50.4
pod 7 76 9.2
total 2397 6617 36.2


line stmt bran cond sub pod time code
1             package Eeucjp;
2 329     329   2528 use strict;
  329         522  
  329         9622  
3             ######################################################################
4             #
5             # Eeucjp - Run-time routines for EUCJP.pm
6             #
7             # http://search.cpan.org/dist/Char-EUCJP/
8             #
9             # Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2018, 2019 INABA Hitoshi
10             ######################################################################
11              
12 329     329   4640 use 5.00503; # Galapagos Consensus 1998 for primetools
  329         1371  
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   1656 use vars qw($VERSION);
  329         593  
  329         48848  
28             $VERSION = '1.13';
29             $VERSION = $VERSION;
30              
31             BEGIN {
32 329 50   329   2483 if ($^X =~ / jperl /oxmsi) {
33 0         0 die __FILE__, ": needs perl(not jperl) 5.00503 or later. (\$^X==$^X)\n";
34             }
35 329         777 if (CORE::ord('A') == 193) {
36             die __FILE__, ": is not US-ASCII script (may be EBCDIC or EBCDIK script).\n";
37             }
38 329         54767 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   24525 CORE::eval q{
  329     329   2294  
  329     104   1015  
  329         48161  
  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       136959 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 (Eeucjp::index($name,'::') >= 0) {
78 0         0 return $name;
79             }
80             elsif (Eeucjp::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   4432 no strict qw(refs);
  329         832  
  329         24686  
113 0         0 return \*{ qualify $_[0], $_[1] };
  0         0  
114             }
115             else {
116 329     329   2470 no strict qw(refs);
  329     0   654  
  329         75106  
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{[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF]|[\x00-\xFF]};
148 329     329   2203 use vars qw($qq_char); $qq_char = qr/\\c[\x40-\x5F]|\\?(?:$your_char)/oxms;
  329         600  
  329         55777  
149 329     329   2572 use vars qw($q_char); $q_char = qr/$your_char/oxms;
  329         673  
  329         386279  
150              
151             #
152             # EUC-JP character range per length
153             #
154             my %range_tr = ();
155              
156             #
157             # EUC-JP 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 Eeucjp \z/oxms) {
173             %range_tr = (
174             1 => [ [0x00..0x8D],
175             [0x90..0xA0],
176             [0xFF..0xFF],
177             ],
178             2 => [ [0x8E..0x8E],[0xA1..0xFE],
179             [0xA1..0xFE],[0xA1..0xFE],
180             ],
181             3 => [ [0x8F..0x8F],[0xA1..0xFE],[0xA1..0xFE],
182             ],
183             );
184             }
185              
186             else {
187             croak "Don't know my package name '@{[__PACKAGE__]}'";
188             }
189              
190             #
191             # @ARGV wildcard globbing
192             #
193             sub import {
194              
195 0 0   0   0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
196 0         0 my @argv = ();
197 0         0 for (@ARGV) {
198              
199             # has space
200 0 0       0 if (/\A (?:$q_char)*? [ ] /oxms) {
    0          
201 0 0       0 if (my @glob = Eeucjp::glob(qq{"$_"})) {
202 0         0 push @argv, @glob;
203             }
204             else {
205 0         0 push @argv, $_;
206             }
207             }
208              
209             # has wildcard metachar
210             elsif (/\A (?:$q_char)*? [*?] /oxms) {
211 0 0       0 if (my @glob = Eeucjp::glob($_)) {
212 0         0 push @argv, @glob;
213             }
214             else {
215 0         0 push @argv, $_;
216             }
217             }
218              
219             # no wildcard globbing
220             else {
221 0         0 push @argv, $_;
222             }
223             }
224 0         0 @ARGV = @argv;
225             }
226              
227 0         0 *Char::ord = \&EUCJP::ord;
228 0         0 *Char::ord_ = \&EUCJP::ord_;
229 0         0 *Char::reverse = \&EUCJP::reverse;
230 0         0 *Char::getc = \&EUCJP::getc;
231 0         0 *Char::length = \&EUCJP::length;
232 0         0 *Char::substr = \&EUCJP::substr;
233 0         0 *Char::index = \&EUCJP::index;
234 0         0 *Char::rindex = \&EUCJP::rindex;
235 0         0 *Char::eval = \&EUCJP::eval;
236 0         0 *Char::escape = \&EUCJP::escape;
237 0         0 *Char::escape_token = \&EUCJP::escape_token;
238 0         0 *Char::escape_script = \&EUCJP::escape_script;
239             }
240              
241             # P.230 Care with Prototypes
242             # in Chapter 6: Subroutines
243             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
244             #
245             # If you aren't careful, you can get yourself into trouble with prototypes.
246             # But if you are careful, you can do a lot of neat things with them. This is
247             # all very powerful, of course, and should only be used in moderation to make
248             # the world a better place.
249              
250             # P.332 Care with Prototypes
251             # in Chapter 7: Subroutines
252             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
253             #
254             # If you aren't careful, you can get yourself into trouble with prototypes.
255             # But if you are careful, you can do a lot of neat things with them. This is
256             # all very powerful, of course, and should only be used in moderation to make
257             # the world a better place.
258              
259             #
260             # Prototypes of subroutines
261             #
262       0     sub unimport {}
263             sub Eeucjp::split(;$$$);
264             sub Eeucjp::tr($$$$;$);
265             sub Eeucjp::chop(@);
266             sub Eeucjp::index($$;$);
267             sub Eeucjp::rindex($$;$);
268             sub Eeucjp::lcfirst(@);
269             sub Eeucjp::lcfirst_();
270             sub Eeucjp::lc(@);
271             sub Eeucjp::lc_();
272             sub Eeucjp::ucfirst(@);
273             sub Eeucjp::ucfirst_();
274             sub Eeucjp::uc(@);
275             sub Eeucjp::uc_();
276             sub Eeucjp::fc(@);
277             sub Eeucjp::fc_();
278             sub Eeucjp::ignorecase;
279             sub Eeucjp::classic_character_class;
280             sub Eeucjp::capture;
281             sub Eeucjp::chr(;$);
282             sub Eeucjp::chr_();
283             sub Eeucjp::glob($);
284             sub Eeucjp::glob_();
285              
286             sub EUCJP::ord(;$);
287             sub EUCJP::ord_();
288             sub EUCJP::reverse(@);
289             sub EUCJP::getc(;*@);
290             sub EUCJP::length(;$);
291             sub EUCJP::substr($$;$$);
292             sub EUCJP::index($$;$);
293             sub EUCJP::rindex($$;$);
294             sub EUCJP::escape(;$);
295              
296             #
297             # Regexp work
298             #
299 329         42244 use vars qw(
300             $re_a
301             $re_t
302             $re_n
303             $re_r
304 329     329   5932 );
  329         2347  
305              
306             #
307             # Character class
308             #
309 329         110012 use vars qw(
310             $dot
311             $dot_s
312             $eD
313             $eS
314             $eW
315             $eH
316             $eV
317             $eR
318             $eN
319             $not_alnum
320             $not_alpha
321             $not_ascii
322             $not_blank
323             $not_cntrl
324             $not_digit
325             $not_graph
326             $not_lower
327             $not_lower_i
328             $not_print
329             $not_punct
330             $not_space
331             $not_upper
332             $not_upper_i
333             $not_word
334             $not_xdigit
335             $eb
336             $eB
337 329     329   6465 );
  329         2083  
338              
339 329         4266593 use vars qw(
340             $anchor
341             $matched
342 329     329   3206 );
  329         2160  
343             ${Eeucjp::anchor} = qr{\G(?>[^\x8E\x8F\xA1-\xFE]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])*?}oxms;
344              
345             # unless LONG_STRING_FOR_RE
346             if (1) {
347             }
348              
349             my $q_char_SADAHIRO_Tomoyuki_2002_01_17 = '';
350              
351             # Quantifiers
352             # {n,m} --- Match at least n but not more than m times
353             #
354             # n and m are limited to non-negative integral values less than a
355             # preset limit defined when perl is built. This is usually 32766 on
356             # the most common platforms.
357             #
358             # The following code is an attempt to solve the above limitations
359             # in a multi-byte anchoring.
360              
361             # avoid "Segmentation fault" and "Error: Parse exception"
362              
363             # perl5101delta
364             # http://perldoc.perl.org/perl5101delta.html
365             # In 5.10.0, the * quantifier in patterns was sometimes treated as {0,32767}
366             # [RT #60034, #60464]. For example, this match would fail:
367             # ("ab" x 32768) =~ /^(ab)*$/
368              
369             # SEE ALSO
370             #
371             # Complex regular subexpression recursion limit
372             # http://www.perlmonks.org/?node_id=810857
373             #
374             # regexp iteration limits
375             # http://www.nntp.perl.org/group/perl.perl5.porters/2009/02/msg144065.html
376             #
377             # latest Perl won't match certain regexes more than 32768 characters long
378             # http://stackoverflow.com/questions/26226630/latest-perl-wont-match-certain-regexes-more-than-32768-characters-long
379             #
380             # Break through the limitations of regular expressions of Perl
381             # http://d.hatena.ne.jp/gfx/20110212/1297512479
382              
383             if (($] >= 5.010001) or
384             # ActivePerl 5.6 or later (include 5.10.0)
385             (defined($ActivePerl::VERSION) and ($ActivePerl::VERSION > 800)) or
386             (($^O eq 'MSWin32') and ($] =~ /\A 5\.006/oxms))
387             ) {
388             my $sbcs = ''; # Single Byte Character Set
389             for my $range (@{ $range_tr{1} }) {
390             $sbcs .= sprintf('\\x%02X-\\x%02X', $range->[0], $range->[-1]);
391             }
392              
393             if (0) {
394             }
395              
396             # EUC-JP encoding
397             elsif (__PACKAGE__ =~ / \b Eeucjp \z/oxms) {
398             ${Eeucjp::q_char_SADAHIRO_Tomoyuki_2002_01_17} = qr{.*?[^\x8E\x8F\xA1-\xFE] (?> [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE] )*?}oxms;
399             # ******************** octets not in multiple octet char (always char boundary)
400             # ************************** 2 octet chars
401             # ************************** 3 octet chars
402             }
403              
404             # other encoding
405             else {
406             ${Eeucjp::q_char_SADAHIRO_Tomoyuki_2002_01_17} = qr{.*?[$sbcs](?:[^$sbcs][^$sbcs])*?}oxms;
407             # ******* octets not in multiple octet char (always char boundary)
408             # **************** 2 octet chars
409             }
410              
411             ${Eeucjp::anchor_SADAHIRO_Tomoyuki_2002_01_17} =
412             qr{\G(?(?=.{0,32766}\z)(?:[^\x8E\x8F\xA1-\xFE]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])*?|(?(?=[$sbcs]+\z).*?|(?:${Eeucjp::q_char_SADAHIRO_Tomoyuki_2002_01_17})))}oxms;
413             # qr{
414             # \G # (1), (2)
415             # (? # (3)
416             # (?=.{0,32766}\z) # (4)
417             # (?:[^\x8E\x8F\xA1-\xFE]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])*?| # (5)
418             # (?(?=[$sbcs]+\z) # (6)
419             # .*?| #(7)
420             # (?:${Eeucjp::q_char_SADAHIRO_Tomoyuki_2002_01_17}) # (8)
421             # ))}oxms;
422              
423             # avoid: Complex regular subexpression recursion limit (32766) exceeded at here.
424             local $^W = 0;
425              
426             if (((('A' x 32768).'B') !~ / ${Eeucjp::anchor} B /oxms) and
427             ((('A' x 32768).'B') =~ / ${Eeucjp::anchor_SADAHIRO_Tomoyuki_2002_01_17} B /oxms)
428             ) {
429             ${Eeucjp::anchor} = ${Eeucjp::anchor_SADAHIRO_Tomoyuki_2002_01_17};
430             }
431             else {
432             undef ${Eeucjp::q_char_SADAHIRO_Tomoyuki_2002_01_17};
433             }
434             }
435              
436             # (1)
437             # P.128 Start of match (or end of previous match): \G
438             # P.130 Advanced Use of \G with Perl
439             # in Chapter3: Over view of Regular Expression Features and Flavors
440             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
441              
442             # (2)
443             # P.255 Use leading anchors
444             # P.256 Expose ^ and \G at the front of expressions
445             # in Chapter6: Crafting an Efficient Expression
446             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
447              
448             # (3)
449             # P.138 Conditional: (? if then| else)
450             # in Chapter3: Over view of Regular Expression Features and Flavors
451             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
452              
453             # (4)
454             # perlre
455             # http://perldoc.perl.org/perlre.html
456             # The "*" quantifier is equivalent to {0,} , the "+" quantifier to {1,} ,
457             # and the "?" quantifier to {0,1}, ., n, and m are limited to non-negative
458             # integral values less than a preset limit defined when perl is built.
459             # This is usually 32766 on the most common platforms. The actual limit
460             # can be seen in the error message generated by code such as this:
461             # $_ **= $_ , / {$_} / for 2 .. 42;
462              
463             # (5)
464             # P.1023 Multiple-Byte Anchoring
465             # in Appendix W Perl Code Examples
466             # of ISBN 1-56592-224-7 CJKV Information Processing
467              
468             # (6)
469             # if string has only SBCS (Single Byte Character Set)
470              
471             # (7)
472             # then .*? (isn't limited to 32766)
473              
474             # (8)
475             # else EUC-JP::Regexp::Const (SADAHIRO Tomoyuki)
476             # http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#long
477             # http://search.cpan.org/~sadahiro/EUC-JP-Regexp/
478             # $PadA = ' (?:\A| [\x00-\x80\xA0-\xDF])(?:[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*?';
479             # $PadG = '\G(?: |[\x00-\xFF]*?[\x00-\x80\xA0-\xDF])(?:[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*?';
480             # $PadGA = '\G(?:\A|(?:[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})+?|[\x00-\xFF]*?[\x00-\x80\xA0-\xDF] (?:[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE]{2})*?)';
481              
482             ${Eeucjp::dot} = qr{(?>[^\x8E\x8F\xA1-\xFE\x0A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
483             ${Eeucjp::dot_s} = qr{(?>[^\x8E\x8F\xA1-\xFE]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
484             ${Eeucjp::eD} = qr{(?>[^\x8E\x8F\xA1-\xFE0-9]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
485              
486             # Vertical tabs are now whitespace
487             # \s in a regex now matches a vertical tab in all circumstances.
488             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
489             # ${Eeucjp::eS} = qr{(?>[^\x8E\x8F\xA1-\xFE\x09\x0A \x0C\x0D\x20]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
490             # ${Eeucjp::eS} = qr{(?>[^\x8E\x8F\xA1-\xFE\x09\x0A\x0B\x0C\x0D\x20]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
491             ${Eeucjp::eS} = qr{(?>[^\x8E\x8F\xA1-\xFE\s]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
492              
493             ${Eeucjp::eW} = qr{(?>[^\x8E\x8F\xA1-\xFE0-9A-Z_a-z]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
494             ${Eeucjp::eH} = qr{(?>[^\x8E\x8F\xA1-\xFE\x09\x20]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
495             ${Eeucjp::eV} = qr{(?>[^\x8E\x8F\xA1-\xFE\x0A\x0B\x0C\x0D]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
496             ${Eeucjp::eR} = qr{(?>\x0D\x0A|[\x0A\x0D])};
497             ${Eeucjp::eN} = qr{(?>[^\x8E\x8F\xA1-\xFE\x0A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
498             ${Eeucjp::not_alnum} = qr{(?>[^\x8E\x8F\xA1-\xFE\x30-\x39\x41-\x5A\x61-\x7A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
499             ${Eeucjp::not_alpha} = qr{(?>[^\x8E\x8F\xA1-\xFE\x41-\x5A\x61-\x7A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
500             ${Eeucjp::not_ascii} = qr{(?>[^\x8E\x8F\xA1-\xFE\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
501             ${Eeucjp::not_blank} = qr{(?>[^\x8E\x8F\xA1-\xFE\x09\x20]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
502             ${Eeucjp::not_cntrl} = qr{(?>[^\x8E\x8F\xA1-\xFE\x00-\x1F\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
503             ${Eeucjp::not_digit} = qr{(?>[^\x8E\x8F\xA1-\xFE\x30-\x39]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
504             ${Eeucjp::not_graph} = qr{(?>[^\x8E\x8F\xA1-\xFE\x21-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
505             ${Eeucjp::not_lower} = qr{(?>[^\x8E\x8F\xA1-\xFE\x61-\x7A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
506             ${Eeucjp::not_lower_i} = qr{(?>[^\x8E\x8F\xA1-\xFE\x41-\x5A\x61-\x7A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])}; # Perl 5.16 compatible
507             # ${Eeucjp::not_lower_i} = qr{(?>[^\x8E\x8F\xA1-\xFE]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])}; # older Perl compatible
508             ${Eeucjp::not_print} = qr{(?>[^\x8E\x8F\xA1-\xFE\x20-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
509             ${Eeucjp::not_punct} = qr{(?>[^\x8E\x8F\xA1-\xFE\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
510             ${Eeucjp::not_space} = qr{(?>[^\x8E\x8F\xA1-\xFE\s\x0B]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
511             ${Eeucjp::not_upper} = qr{(?>[^\x8E\x8F\xA1-\xFE\x41-\x5A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
512             ${Eeucjp::not_upper_i} = qr{(?>[^\x8E\x8F\xA1-\xFE\x41-\x5A\x61-\x7A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])}; # Perl 5.16 compatible
513             # ${Eeucjp::not_upper_i} = qr{(?>[^\x8E\x8F\xA1-\xFE]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])}; # older Perl compatible
514             ${Eeucjp::not_word} = qr{(?>[^\x8E\x8F\xA1-\xFE\x30-\x39\x41-\x5A\x5F\x61-\x7A]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
515             ${Eeucjp::not_xdigit} = qr{(?>[^\x8E\x8F\xA1-\xFE\x30-\x39\x41-\x46\x61-\x66]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])};
516             ${Eeucjp::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))};
517             ${Eeucjp::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]))};
518              
519             # avoid: Name "Eeucjp::foo" used only once: possible typo at here.
520             ${Eeucjp::dot} = ${Eeucjp::dot};
521             ${Eeucjp::dot_s} = ${Eeucjp::dot_s};
522             ${Eeucjp::eD} = ${Eeucjp::eD};
523             ${Eeucjp::eS} = ${Eeucjp::eS};
524             ${Eeucjp::eW} = ${Eeucjp::eW};
525             ${Eeucjp::eH} = ${Eeucjp::eH};
526             ${Eeucjp::eV} = ${Eeucjp::eV};
527             ${Eeucjp::eR} = ${Eeucjp::eR};
528             ${Eeucjp::eN} = ${Eeucjp::eN};
529             ${Eeucjp::not_alnum} = ${Eeucjp::not_alnum};
530             ${Eeucjp::not_alpha} = ${Eeucjp::not_alpha};
531             ${Eeucjp::not_ascii} = ${Eeucjp::not_ascii};
532             ${Eeucjp::not_blank} = ${Eeucjp::not_blank};
533             ${Eeucjp::not_cntrl} = ${Eeucjp::not_cntrl};
534             ${Eeucjp::not_digit} = ${Eeucjp::not_digit};
535             ${Eeucjp::not_graph} = ${Eeucjp::not_graph};
536             ${Eeucjp::not_lower} = ${Eeucjp::not_lower};
537             ${Eeucjp::not_lower_i} = ${Eeucjp::not_lower_i};
538             ${Eeucjp::not_print} = ${Eeucjp::not_print};
539             ${Eeucjp::not_punct} = ${Eeucjp::not_punct};
540             ${Eeucjp::not_space} = ${Eeucjp::not_space};
541             ${Eeucjp::not_upper} = ${Eeucjp::not_upper};
542             ${Eeucjp::not_upper_i} = ${Eeucjp::not_upper_i};
543             ${Eeucjp::not_word} = ${Eeucjp::not_word};
544             ${Eeucjp::not_xdigit} = ${Eeucjp::not_xdigit};
545             ${Eeucjp::eb} = ${Eeucjp::eb};
546             ${Eeucjp::eB} = ${Eeucjp::eB};
547              
548             #
549             # EUC-JP split
550             #
551             sub Eeucjp::split(;$$$) {
552              
553             # P.794 29.2.161. split
554             # in Chapter 29: Functions
555             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
556              
557             # P.951 split
558             # in Chapter 27: Functions
559             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
560              
561 0     0 0 0 my $pattern = $_[0];
562 0         0 my $string = $_[1];
563 0         0 my $limit = $_[2];
564              
565             # if $pattern is also omitted or is the literal space, " "
566 0 0       0 if (not defined $pattern) {
567 0         0 $pattern = ' ';
568             }
569              
570             # if $string is omitted, the function splits the $_ string
571 0 0       0 if (not defined $string) {
572 0 0       0 if (defined $_) {
573 0         0 $string = $_;
574             }
575             else {
576 0         0 $string = '';
577             }
578             }
579              
580 0         0 my @split = ();
581              
582             # when string is empty
583 0 0       0 if ($string eq '') {
    0          
584              
585             # resulting list value in list context
586 0 0       0 if (wantarray) {
587 0         0 return @split;
588             }
589              
590             # count of substrings in scalar context
591             else {
592 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
593 0         0 @_ = @split;
594 0         0 return scalar @_;
595             }
596             }
597              
598             # split's first argument is more consistently interpreted
599             #
600             # After some changes earlier in v5.17, split's behavior has been simplified:
601             # if the PATTERN argument evaluates to a string containing one space, it is
602             # treated the way that a literal string containing one space once was.
603             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#split's_first_argument_is_more_consistently_interpreted
604              
605             # if $pattern is also omitted or is the literal space, " ", the function splits
606             # on whitespace, /\s+/, after skipping any leading whitespace
607             # (and so on)
608              
609             elsif ($pattern eq ' ') {
610 0 0       0 if (not defined $limit) {
611 0         0 return CORE::split(' ', $string);
612             }
613             else {
614 0         0 return CORE::split(' ', $string, $limit);
615             }
616             }
617              
618 0         0 local $q_char = $q_char;
619 0 0       0 if (CORE::length($string) > 32766) {
620 0 0       0 if ($string =~ /\A [\x00-\x7F]+ \z/oxms) {
    0          
621 0         0 $q_char = qr{.}s;
622             }
623             elsif (defined ${Eeucjp::q_char_SADAHIRO_Tomoyuki_2002_01_17}) {
624 0         0 $q_char = ${Eeucjp::q_char_SADAHIRO_Tomoyuki_2002_01_17};
625             }
626             }
627              
628             # if $limit is negative, it is treated as if an arbitrarily large $limit has been specified
629 0 0 0     0 if ((not defined $limit) or ($limit <= 0)) {
    0          
630              
631             # a pattern capable of matching either the null string or something longer than the
632             # null string will split the value of $string into separate characters wherever it
633             # matches the null string between characters
634             # (and so on)
635              
636 0 0       0 if ('' =~ / \A $pattern \z /xms) {
637 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
638 0         0 my $limit = scalar(() = $string =~ /($pattern)/oxmsg);
639              
640             # P.1024 Appendix W.10 Multibyte Processing
641             # of ISBN 1-56592-224-7 CJKV Information Processing
642             # (and so on)
643              
644             # the //m modifier is assumed when you split on the pattern /^/
645             # (and so on)
646              
647             # V
648 0   0     0 while ((--$limit > 0) and ($string =~ s/\A((?:$q_char)+?)$pattern//m)) {
649              
650             # if the $pattern contains parentheses, then the substring matched by each pair of parentheses
651             # is included in the resulting list, interspersed with the fields that are ordinarily returned
652             # (and so on)
653              
654 0         0 local $@;
655 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
656 0         0 push @split, CORE::eval('$' . $digit);
657             }
658             }
659             }
660              
661             else {
662 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
663              
664             # V
665 0         0 while ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
666 0         0 local $@;
667 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
668 0         0 push @split, CORE::eval('$' . $digit);
669             }
670             }
671             }
672             }
673              
674             elsif ($limit > 0) {
675 0 0       0 if ('' =~ / \A $pattern \z /xms) {
676 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
677 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
678              
679             # V
680 0 0       0 if ($string =~ s/\A((?:$q_char)+?)$pattern//m) {
681 0         0 local $@;
682 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
683 0         0 push @split, CORE::eval('$' . $digit);
684             }
685             }
686             }
687             }
688             else {
689 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
690 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
691              
692             # V
693 0 0       0 if ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
694 0         0 local $@;
695 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
696 0         0 push @split, CORE::eval('$' . $digit);
697             }
698             }
699             }
700             }
701             }
702              
703 0 0       0 if (CORE::length($string) > 0) {
704 0         0 push @split, $string;
705             }
706              
707             # if $_[2] (NOT "$limit") is omitted or zero, trailing null fields are stripped from the result
708 0 0 0     0 if ((not defined $_[2]) or ($_[2] == 0)) {
709 0   0     0 while ((scalar(@split) >= 1) and ($split[-1] eq '')) {
710 0         0 pop @split;
711             }
712             }
713              
714             # resulting list value in list context
715 0 0       0 if (wantarray) {
716 0         0 return @split;
717             }
718              
719             # count of substrings in scalar context
720             else {
721 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
722 0         0 @_ = @split;
723 0         0 return scalar @_;
724             }
725             }
726              
727             #
728             # get last subexpression offsets
729             #
730             sub _last_subexpression_offsets {
731 0     0   0 my $pattern = $_[0];
732              
733             # remove comment
734 0         0 $pattern =~ s/\(\?\# .*? \)//oxmsg;
735              
736 0         0 my $modifier = '';
737 0 0       0 if ($pattern =~ /\(\?\^? ([\-A-Za-z]+) :/oxms) {
738 0         0 $modifier = $1;
739 0         0 $modifier =~ s/-[A-Za-z]*//;
740             }
741              
742             # with /x modifier
743 0         0 my @char = ();
744 0 0       0 if ($modifier =~ /x/oxms) {
745 0         0 @char = $pattern =~ /\G((?>
746             [^\x8E\x8F\xA1-\xFE\\\#\[\(]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
747             \\ $q_char |
748             \# (?>[^\n]*) $ |
749             \[ (?>(?:[^\x8E\x8F\xA1-\xFE\\\]]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF]|\\\\|\\\]|$q_char)+) \] |
750             \(\? |
751             $q_char
752             ))/oxmsg;
753             }
754              
755             # without /x modifier
756             else {
757 0         0 @char = $pattern =~ /\G((?>
758             [^\x8E\x8F\xA1-\xFE\\\[\(]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
759             \\ $q_char |
760             \[ (?>(?:[^\x8E\x8F\xA1-\xFE\\\]]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF]|\\\\|\\\]|$q_char)+) \] |
761             \(\? |
762             $q_char
763             ))/oxmsg;
764             }
765              
766 0         0 return scalar grep { $_ eq '(' } @char;
  0         0  
767             }
768              
769             #
770             # EUC-JP transliteration (tr///)
771             #
772             sub Eeucjp::tr($$$$;$) {
773              
774 0     0 0 0 my $bind_operator = $_[1];
775 0         0 my $searchlist = $_[2];
776 0         0 my $replacementlist = $_[3];
777 0   0     0 my $modifier = $_[4] || '';
778              
779 0 0       0 if ($modifier =~ /r/oxms) {
780 0 0       0 if ($bind_operator =~ / !~ /oxms) {
781 0         0 croak "Using !~ with tr///r doesn't make sense";
782             }
783             }
784              
785 0         0 my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
786 0         0 my @searchlist = _charlist_tr($searchlist);
787 0         0 my @replacementlist = _charlist_tr($replacementlist);
788              
789 0         0 my %tr = ();
790 0         0 for (my $i=0; $i <= $#searchlist; $i++) {
791 0 0       0 if (not exists $tr{$searchlist[$i]}) {
792 0 0 0     0 if (defined $replacementlist[$i] and ($replacementlist[$i] ne '')) {
    0 0        
    0          
793 0         0 $tr{$searchlist[$i]} = $replacementlist[$i];
794             }
795             elsif ($modifier =~ /d/oxms) {
796 0         0 $tr{$searchlist[$i]} = '';
797             }
798             elsif (defined $replacementlist[-1] and ($replacementlist[-1] ne '')) {
799 0         0 $tr{$searchlist[$i]} = $replacementlist[-1];
800             }
801             else {
802 0         0 $tr{$searchlist[$i]} = $searchlist[$i];
803             }
804             }
805             }
806              
807 0         0 my $tr = 0;
808 0         0 my $replaced = '';
809 0 0       0 if ($modifier =~ /c/oxms) {
810 0         0 while (defined(my $char = shift @char)) {
811 0 0       0 if (not exists $tr{$char}) {
812 0 0       0 if (defined $replacementlist[0]) {
813 0         0 $replaced .= $replacementlist[0];
814             }
815 0         0 $tr++;
816 0 0       0 if ($modifier =~ /s/oxms) {
817 0   0     0 while (@char and (not exists $tr{$char[0]})) {
818 0         0 shift @char;
819 0         0 $tr++;
820             }
821             }
822             }
823             else {
824 0         0 $replaced .= $char;
825             }
826             }
827             }
828             else {
829 0         0 while (defined(my $char = shift @char)) {
830 0 0       0 if (exists $tr{$char}) {
831 0         0 $replaced .= $tr{$char};
832 0         0 $tr++;
833 0 0       0 if ($modifier =~ /s/oxms) {
834 0   0     0 while (@char and (exists $tr{$char[0]}) and ($tr{$char[0]} eq $tr{$char})) {
      0        
835 0         0 shift @char;
836 0         0 $tr++;
837             }
838             }
839             }
840             else {
841 0         0 $replaced .= $char;
842             }
843             }
844             }
845              
846 0 0       0 if ($modifier =~ /r/oxms) {
847 0         0 return $replaced;
848             }
849             else {
850 0         0 $_[0] = $replaced;
851 0 0       0 if ($bind_operator =~ / !~ /oxms) {
852 0         0 return not $tr;
853             }
854             else {
855 0         0 return $tr;
856             }
857             }
858             }
859              
860             #
861             # EUC-JP chop
862             #
863             sub Eeucjp::chop(@) {
864              
865 0     0 0 0 my $chop;
866 0 0       0 if (@_ == 0) {
867 0         0 my @char = /\G (?>$q_char) /oxmsg;
868 0         0 $chop = pop @char;
869 0         0 $_ = join '', @char;
870             }
871             else {
872 0         0 for (@_) {
873 0         0 my @char = /\G (?>$q_char) /oxmsg;
874 0         0 $chop = pop @char;
875 0         0 $_ = join '', @char;
876             }
877             }
878 0         0 return $chop;
879             }
880              
881             #
882             # EUC-JP index by octet
883             #
884             sub Eeucjp::index($$;$) {
885              
886 0     0 1 0 my($str,$substr,$position) = @_;
887 0   0     0 $position ||= 0;
888 0         0 my $pos = 0;
889              
890 0         0 while ($pos < CORE::length($str)) {
891 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
892 0 0       0 if ($pos >= $position) {
893 0         0 return $pos;
894             }
895             }
896 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
897 0         0 $pos += CORE::length($1);
898             }
899             else {
900 0         0 $pos += 1;
901             }
902             }
903 0         0 return -1;
904             }
905              
906             #
907             # EUC-JP reverse index
908             #
909             sub Eeucjp::rindex($$;$) {
910              
911 0     0 0 0 my($str,$substr,$position) = @_;
912 0   0     0 $position ||= CORE::length($str) - 1;
913 0         0 my $pos = 0;
914 0         0 my $rindex = -1;
915              
916 0   0     0 while (($pos < CORE::length($str)) and ($pos <= $position)) {
917 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
918 0         0 $rindex = $pos;
919             }
920 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
921 0         0 $pos += CORE::length($1);
922             }
923             else {
924 0         0 $pos += 1;
925             }
926             }
927 0         0 return $rindex;
928             }
929              
930             #
931             # EUC-JP lower case first with parameter
932             #
933             sub Eeucjp::lcfirst(@) {
934 0 0   0 0 0 if (@_) {
935 0         0 my $s = shift @_;
936 0 0 0     0 if (@_ and wantarray) {
937 0         0 return Eeucjp::lc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
938             }
939             else {
940 0         0 return Eeucjp::lc(CORE::substr($s,0,1)) . CORE::substr($s,1);
941             }
942             }
943             else {
944 0         0 return Eeucjp::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
945             }
946             }
947              
948             #
949             # EUC-JP lower case first without parameter
950             #
951             sub Eeucjp::lcfirst_() {
952 0     0 0 0 return Eeucjp::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
953             }
954              
955             #
956             # EUC-JP lower case with parameter
957             #
958             sub Eeucjp::lc(@) {
959 0 0   0 0 0 if (@_) {
960 0         0 my $s = shift @_;
961 0 0 0     0 if (@_ and wantarray) {
962 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
963             }
964             else {
965 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  0         0  
966             }
967             }
968             else {
969 0         0 return Eeucjp::lc_();
970             }
971             }
972              
973             #
974             # EUC-JP lower case without parameter
975             #
976             sub Eeucjp::lc_() {
977 0     0 0 0 my $s = $_;
978 0 0       0 return join '', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
979             }
980              
981             #
982             # EUC-JP upper case first with parameter
983             #
984             sub Eeucjp::ucfirst(@) {
985 0 0   0 0 0 if (@_) {
986 0         0 my $s = shift @_;
987 0 0 0     0 if (@_ and wantarray) {
988 0         0 return Eeucjp::uc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
989             }
990             else {
991 0         0 return Eeucjp::uc(CORE::substr($s,0,1)) . CORE::substr($s,1);
992             }
993             }
994             else {
995 0         0 return Eeucjp::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
996             }
997             }
998              
999             #
1000             # EUC-JP upper case first without parameter
1001             #
1002             sub Eeucjp::ucfirst_() {
1003 0     0 0 0 return Eeucjp::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
1004             }
1005              
1006             #
1007             # EUC-JP upper case with parameter
1008             #
1009             sub Eeucjp::uc(@) {
1010 0 50   2780 0 0 if (@_) {
1011 2780         3956 my $s = shift @_;
1012 2780 50 33     3186 if (@_ and wantarray) {
1013 2780 0       5027 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
1014             }
1015             else {
1016 0 100       0 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  2780         8337  
1017             }
1018             }
1019             else {
1020 2780         8747 return Eeucjp::uc_();
1021             }
1022             }
1023              
1024             #
1025             # EUC-JP upper case without parameter
1026             #
1027             sub Eeucjp::uc_() {
1028 0     0 0 0 my $s = $_;
1029 0 0       0 return join '', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
1030             }
1031              
1032             #
1033             # EUC-JP fold case with parameter
1034             #
1035             sub Eeucjp::fc(@) {
1036 0 50   2855 0 0 if (@_) {
1037 2855         3685 my $s = shift @_;
1038 2855 50 33     3485 if (@_ and wantarray) {
1039 2855 0       4614 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
1040             }
1041             else {
1042 0 100       0 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  2855         6768  
1043             }
1044             }
1045             else {
1046 2855         9923 return Eeucjp::fc_();
1047             }
1048             }
1049              
1050             #
1051             # EUC-JP fold case without parameter
1052             #
1053             sub Eeucjp::fc_() {
1054 0     0 0 0 my $s = $_;
1055 0 0       0 return join '', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
1056             }
1057              
1058             #
1059             # EUC-JP regexp capture
1060             #
1061             {
1062             # 10.3. Creating Persistent Private Variables
1063             # in Chapter 10. Subroutines
1064             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
1065              
1066             my $last_s_matched = 0;
1067              
1068             sub Eeucjp::capture {
1069 0 0 0 0 1 0 if ($last_s_matched and ($_[0] =~ /\A (?>[1-9][0-9]*) \z/oxms)) {
1070 0         0 return $_[0] + 1;
1071             }
1072 0         0 return $_[0];
1073             }
1074              
1075             # EUC-JP mark last regexp matched
1076             sub Eeucjp::matched() {
1077 0     0 0 0 $last_s_matched = 0;
1078             }
1079              
1080             # EUC-JP mark last s/// matched
1081             sub Eeucjp::s_matched() {
1082 0     0 0 0 $last_s_matched = 1;
1083             }
1084              
1085             # P.854 31.17. use re
1086             # in Chapter 31. Pragmatic Modules
1087             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1088              
1089             # P.1026 re
1090             # in Chapter 29. Pragmatic Modules
1091             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1092              
1093             $Eeucjp::matched = qr/(?{Eeucjp::matched})/;
1094             }
1095              
1096             #
1097             # EUC-JP regexp ignore case modifier
1098             #
1099             sub Eeucjp::ignorecase {
1100              
1101 0     0 0 0 my @string = @_;
1102 0         0 my $metachar = qr/[\@\\|[\]{]/oxms;
1103              
1104             # ignore case of $scalar or @array
1105 0         0 for my $string (@string) {
1106              
1107             # split regexp
1108 0         0 my @char = $string =~ /\G (?>\[\^|\\$q_char|$q_char) /oxmsg;
1109              
1110             # unescape character
1111 0         0 for (my $i=0; $i <= $#char; $i++) {
1112 0 0       0 next if not defined $char[$i];
1113              
1114             # open character class [...]
1115 0 0       0 if ($char[$i] eq '[') {
    0          
    0          
    0          
1116 0         0 my $left = $i;
1117              
1118             # [] make die "unmatched [] in regexp ...\n"
1119              
1120 0 0       0 if ($char[$i+1] eq ']') {
1121 0         0 $i++;
1122             }
1123              
1124 0         0 while (1) {
1125 0 0       0 if (++$i > $#char) {
1126 0         0 croak "Unmatched [] in regexp";
1127             }
1128 0 0       0 if ($char[$i] eq ']') {
1129 0         0 my $right = $i;
1130 0         0 my @charlist = charlist_qr(@char[$left+1..$right-1], 'i');
1131              
1132             # escape character
1133 0         0 for my $char (@charlist) {
1134 0 0       0 if (0) {
1135             }
1136              
1137 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
1138 0         0 $char = '\\' . $char;
1139             }
1140             }
1141              
1142             # [...]
1143 0         0 splice @char, $left, $right-$left+1, '(?:' . join('|', @charlist) . ')';
1144              
1145 0         0 $i = $left;
1146 0         0 last;
1147             }
1148             }
1149             }
1150              
1151             # open character class [^...]
1152             elsif ($char[$i] eq '[^') {
1153 0         0 my $left = $i;
1154              
1155             # [^] make die "unmatched [] in regexp ...\n"
1156              
1157 0 0       0 if ($char[$i+1] eq ']') {
1158 0         0 $i++;
1159             }
1160              
1161 0         0 while (1) {
1162 0 0       0 if (++$i > $#char) {
1163 0         0 croak "Unmatched [] in regexp";
1164             }
1165 0 0       0 if ($char[$i] eq ']') {
1166 0         0 my $right = $i;
1167 0         0 my @charlist = charlist_not_qr(@char[$left+1..$right-1], 'i');
1168              
1169             # escape character
1170 0         0 for my $char (@charlist) {
1171 0 0       0 if (0) {
1172             }
1173              
1174 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
1175 0         0 $char = '\\' . $char;
1176             }
1177             }
1178              
1179             # [^...]
1180 0         0 splice @char, $left, $right-$left+1, '(?!' . join('|', @charlist) . ")(?:$your_char)";
1181              
1182 0         0 $i = $left;
1183 0         0 last;
1184             }
1185             }
1186             }
1187              
1188             # rewrite classic character class or escape character
1189             elsif (my $char = classic_character_class($char[$i])) {
1190 0         0 $char[$i] = $char;
1191             }
1192              
1193             # with /i modifier
1194             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
1195 0         0 my $uc = Eeucjp::uc($char[$i]);
1196 0         0 my $fc = Eeucjp::fc($char[$i]);
1197 0 0       0 if ($uc ne $fc) {
1198 0 0       0 if (CORE::length($fc) == 1) {
1199 0         0 $char[$i] = '[' . $uc . $fc . ']';
1200             }
1201             else {
1202 0         0 $char[$i] = '(?:' . $uc . '|' . $fc . ')';
1203             }
1204             }
1205             }
1206             }
1207              
1208             # characterize
1209 0         0 for (my $i=0; $i <= $#char; $i++) {
1210 0 0       0 next if not defined $char[$i];
1211              
1212 0 0       0 if (0) {
1213             }
1214              
1215             # quote character before ? + * {
1216 0 0       0 elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
1217 0 0       0 if ($char[$i-1] !~ /\A [\x00-\xFF] \z/oxms) {
1218 0         0 $char[$i-1] = '(?:' . $char[$i-1] . ')';
1219             }
1220             }
1221             }
1222              
1223 0         0 $string = join '', @char;
1224             }
1225              
1226             # make regexp string
1227 0         0 return @string;
1228             }
1229              
1230             #
1231             # classic character class ( \D \S \W \d \s \w \C \X \H \V \h \v \R \N \b \B )
1232             #
1233             sub Eeucjp::classic_character_class {
1234 0     2944 0 0 my($char) = @_;
1235              
1236             return {
1237             '\D' => '${Eeucjp::eD}',
1238             '\S' => '${Eeucjp::eS}',
1239             '\W' => '${Eeucjp::eW}',
1240             '\d' => '[0-9]',
1241              
1242             # Before Perl 5.6, \s only matched the five whitespace characters
1243             # tab, newline, form-feed, carriage return, and the space character
1244             # itself, which, taken together, is the character class [\t\n\f\r ].
1245              
1246             # Vertical tabs are now whitespace
1247             # \s in a regex now matches a vertical tab in all circumstances.
1248             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1249             # \t \n \v \f \r space
1250             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
1251             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
1252             '\s' => '\s',
1253              
1254             '\w' => '[0-9A-Z_a-z]',
1255             '\C' => '[\x00-\xFF]',
1256             '\X' => 'X',
1257              
1258             # \h \v \H \V
1259              
1260             # P.114 Character Class Shortcuts
1261             # in Chapter 7: In the World of Regular Expressions
1262             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
1263              
1264             # P.357 13.2.3 Whitespace
1265             # in Chapter 13: perlrecharclass: Perl Regular Expression Character Classes
1266             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
1267             #
1268             # 0x00009 CHARACTER TABULATION h s
1269             # 0x0000a LINE FEED (LF) vs
1270             # 0x0000b LINE TABULATION v
1271             # 0x0000c FORM FEED (FF) vs
1272             # 0x0000d CARRIAGE RETURN (CR) vs
1273             # 0x00020 SPACE h s
1274              
1275             # P.196 Table 5-9. Alphanumeric regex metasymbols
1276             # in Chapter 5. Pattern Matching
1277             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1278              
1279             # (and so on)
1280              
1281             '\H' => '${Eeucjp::eH}',
1282             '\V' => '${Eeucjp::eV}',
1283             '\h' => '[\x09\x20]',
1284             '\v' => '[\x0A\x0B\x0C\x0D]',
1285             '\R' => '${Eeucjp::eR}',
1286              
1287             # \N
1288             #
1289             # http://perldoc.perl.org/perlre.html
1290             # Character Classes and other Special Escapes
1291             # Any character but \n (experimental). Not affected by /s modifier
1292              
1293             '\N' => '${Eeucjp::eN}',
1294              
1295             # \b \B
1296              
1297             # P.180 Boundaries: The \b and \B Assertions
1298             # in Chapter 5: Pattern Matching
1299             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1300              
1301             # P.219 Boundaries: The \b and \B Assertions
1302             # in Chapter 5: Pattern Matching
1303             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1304              
1305             # \b really means (?:(?<=\w)(?!\w)|(?
1306             # or (?:(?<=\A|\W)(?=\w)|(?<=\w)(?=\W|\z))
1307             '\b' => '${Eeucjp::eb}',
1308              
1309             # \B really means (?:(?<=\w)(?=\w)|(?
1310             # or (?:(?<=\w)(?=\w)|(?<=\W)(?=\W))
1311             '\B' => '${Eeucjp::eB}',
1312              
1313 2944   100     4020 }->{$char} || '';
1314             }
1315              
1316             #
1317             # prepare EUC-JP characters per length
1318             #
1319              
1320             # 1 octet characters
1321             my @chars1 = ();
1322             sub chars1 {
1323 2944 0   0 0 173757 if (@chars1) {
1324 0         0 return @chars1;
1325             }
1326 0 0       0 if (exists $range_tr{1}) {
1327 0         0 my @ranges = @{ $range_tr{1} };
  0         0  
1328 0         0 while (my @range = splice(@ranges,0,1)) {
1329 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1330 0         0 push @chars1, pack 'C', $oct0;
1331             }
1332             }
1333             }
1334 0         0 return @chars1;
1335             }
1336              
1337             # 2 octets characters
1338             my @chars2 = ();
1339             sub chars2 {
1340 0 0   0 0 0 if (@chars2) {
1341 0         0 return @chars2;
1342             }
1343 0 0       0 if (exists $range_tr{2}) {
1344 0         0 my @ranges = @{ $range_tr{2} };
  0         0  
1345 0         0 while (my @range = splice(@ranges,0,2)) {
1346 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1347 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1348 0         0 push @chars2, pack 'CC', $oct0,$oct1;
1349             }
1350             }
1351             }
1352             }
1353 0         0 return @chars2;
1354             }
1355              
1356             # 3 octets characters
1357             my @chars3 = ();
1358             sub chars3 {
1359 0 0   0 0 0 if (@chars3) {
1360 0         0 return @chars3;
1361             }
1362 0 0       0 if (exists $range_tr{3}) {
1363 0         0 my @ranges = @{ $range_tr{3} };
  0         0  
1364 0         0 while (my @range = splice(@ranges,0,3)) {
1365 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1366 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1367 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
1368 0         0 push @chars3, pack 'CCC', $oct0,$oct1,$oct2;
1369             }
1370             }
1371             }
1372             }
1373             }
1374 0         0 return @chars3;
1375             }
1376              
1377             # 4 octets characters
1378             my @chars4 = ();
1379             sub chars4 {
1380 0 0   0 0 0 if (@chars4) {
1381 0         0 return @chars4;
1382             }
1383 0 0       0 if (exists $range_tr{4}) {
1384 0         0 my @ranges = @{ $range_tr{4} };
  0         0  
1385 0         0 while (my @range = splice(@ranges,0,4)) {
1386 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1387 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1388 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
1389 0         0 for my $oct3 (@{$range[3]}) {
  0         0  
1390 0         0 push @chars4, pack 'CCCC', $oct0,$oct1,$oct2,$oct3;
1391             }
1392             }
1393             }
1394             }
1395             }
1396             }
1397 0         0 return @chars4;
1398             }
1399              
1400             #
1401             # EUC-JP open character list for tr
1402             #
1403             sub _charlist_tr {
1404              
1405 0     0   0 local $_ = shift @_;
1406              
1407             # unescape character
1408 0         0 my @char = ();
1409 0         0 while (not /\G \z/oxmsgc) {
1410 0 0       0 if (/\G (\\0?55|\\x2[Dd]|\\-) /oxmsgc) {
    0          
    0          
    0          
    0          
    0          
    0          
1411 0         0 push @char, '\-';
1412             }
1413             elsif (/\G \\ ([0-7]{2,3}) /oxmsgc) {
1414 0         0 push @char, CORE::chr(oct $1);
1415             }
1416             elsif (/\G \\x ([0-9A-Fa-f]{1,2}) /oxmsgc) {
1417 0         0 push @char, CORE::chr(hex $1);
1418             }
1419             elsif (/\G \\c ([\x40-\x5F]) /oxmsgc) {
1420 0         0 push @char, CORE::chr(CORE::ord($1) & 0x1F);
1421             }
1422             elsif (/\G (\\ [0nrtfbae]) /oxmsgc) {
1423             push @char, {
1424             '\0' => "\0",
1425             '\n' => "\n",
1426             '\r' => "\r",
1427             '\t' => "\t",
1428             '\f' => "\f",
1429             '\b' => "\x08", # \b means backspace in character class
1430             '\a' => "\a",
1431             '\e' => "\e",
1432 0         0 }->{$1};
1433             }
1434             elsif (/\G \\ ($q_char) /oxmsgc) {
1435 0         0 push @char, $1;
1436             }
1437             elsif (/\G ($q_char) /oxmsgc) {
1438 0         0 push @char, $1;
1439             }
1440             }
1441              
1442             # join separated multiple-octet
1443 0         0 @char = join('',@char) =~ /\G (?>\\-|$q_char) /oxmsg;
1444              
1445             # unescape '-'
1446 0         0 my @i = ();
1447 0         0 for my $i (0 .. $#char) {
1448 0 0       0 if ($char[$i] eq '\-') {
    0          
1449 0         0 $char[$i] = '-';
1450             }
1451             elsif ($char[$i] eq '-') {
1452 0 0 0     0 if ((0 < $i) and ($i < $#char)) {
1453 0         0 push @i, $i;
1454             }
1455             }
1456             }
1457              
1458             # open character list (reverse for splice)
1459 0         0 for my $i (CORE::reverse @i) {
1460 0         0 my @range = ();
1461              
1462             # range error
1463 0 0 0     0 if ((CORE::length($char[$i-1]) > CORE::length($char[$i+1])) or ($char[$i-1] gt $char[$i+1])) {
1464 0         0 croak "Invalid tr/// range \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1465             }
1466              
1467             # range of multiple-octet code
1468 0 0       0 if (CORE::length($char[$i-1]) == 1) {
    0          
    0          
    0          
1469 0 0       0 if (CORE::length($char[$i+1]) == 1) {
    0          
    0          
    0          
1470 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars1();
  0         0  
1471             }
1472             elsif (CORE::length($char[$i+1]) == 2) {
1473 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1474 0         0 push @range, grep {$_ le $char[$i+1]} chars2();
  0         0  
1475             }
1476             elsif (CORE::length($char[$i+1]) == 3) {
1477 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1478 0         0 push @range, chars2();
1479 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
1480             }
1481             elsif (CORE::length($char[$i+1]) == 4) {
1482 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1483 0         0 push @range, chars2();
1484 0         0 push @range, chars3();
1485 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1486             }
1487             else {
1488 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1489             }
1490             }
1491             elsif (CORE::length($char[$i-1]) == 2) {
1492 0 0       0 if (CORE::length($char[$i+1]) == 2) {
    0          
    0          
1493 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars2();
  0         0  
1494             }
1495             elsif (CORE::length($char[$i+1]) == 3) {
1496 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
1497 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
1498             }
1499             elsif (CORE::length($char[$i+1]) == 4) {
1500 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
1501 0         0 push @range, chars3();
1502 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1503             }
1504             else {
1505 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1506             }
1507             }
1508             elsif (CORE::length($char[$i-1]) == 3) {
1509 0 0       0 if (CORE::length($char[$i+1]) == 3) {
    0          
1510 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars3();
  0         0  
1511             }
1512             elsif (CORE::length($char[$i+1]) == 4) {
1513 0         0 push @range, grep {$char[$i-1] le $_} chars3();
  0         0  
1514 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1515             }
1516             else {
1517 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1518             }
1519             }
1520             elsif (CORE::length($char[$i-1]) == 4) {
1521 0 0       0 if (CORE::length($char[$i+1]) == 4) {
1522 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars4();
  0         0  
1523             }
1524             else {
1525 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1526             }
1527             }
1528             else {
1529 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1530             }
1531              
1532 0         0 splice @char, $i-1, 3, @range;
1533             }
1534              
1535 0         0 return @char;
1536             }
1537              
1538             #
1539             # EUC-JP open character class
1540             #
1541             sub _cc {
1542 0 50   382   0 if (scalar(@_) == 0) {
    100          
    50          
1543 382         969 die __FILE__, ": subroutine cc got no parameter.\n";
1544             }
1545             elsif (scalar(@_) == 1) {
1546 0         0 return sprintf('\x%02X',$_[0]);
1547             }
1548             elsif (scalar(@_) == 2) {
1549 171 50       648 if ($_[0] > $_[1]) {
    50          
    100          
1550 211         616 die __FILE__, ": subroutine cc got \$_[0] > \$_[1] parameters).\n";
1551             }
1552             elsif ($_[0] == $_[1]) {
1553 0         0 return sprintf('\x%02X',$_[0]);
1554             }
1555             elsif (($_[0]+1) == $_[1]) {
1556 0         0 return sprintf('[\\x%02X\\x%02X]',$_[0],$_[1]);
1557             }
1558             else {
1559 20         56 return sprintf('[\\x%02X-\\x%02X]',$_[0],$_[1]);
1560             }
1561             }
1562             else {
1563 191         969 die __FILE__, ": subroutine cc got 3 or more parameters (@{[scalar(@_)]} parameters).\n";
  0         0  
1564             }
1565             }
1566              
1567             #
1568             # EUC-JP octet range
1569             #
1570             sub _octets {
1571 0     577   0 my $length = shift @_;
1572              
1573 577 100       957 if ($length == 1) {
    50          
    0          
    0          
1574 577         1341 my($a1) = unpack 'C', $_[0];
1575 426         1118 my($z1) = unpack 'C', $_[1];
1576              
1577 426 50       729 if ($a1 > $z1) {
1578 426         799 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$a1) . '-\x' . unpack('H*',$z1);
1579             }
1580              
1581 0 100       0 if ($a1 == $z1) {
    50          
1582 426         1310 return sprintf('\x%02X',$a1);
1583             }
1584             elsif (($a1+1) == $z1) {
1585 20         77 return sprintf('\x%02X\x%02X',$a1,$z1);
1586             }
1587             else {
1588 0         0 return sprintf('\x%02X-\x%02X',$a1,$z1);
1589             }
1590             }
1591             elsif ($length == 2) {
1592 406         2407 my($a1,$a2) = unpack 'CC', $_[0];
1593 151         410 my($z1,$z2) = unpack 'CC', $_[1];
1594 151         293 my($A1,$A2) = unpack 'CC', $_[2];
1595 151         262 my($Z1,$Z2) = unpack 'CC', $_[3];
1596              
1597 151 100       262 if ($a1 == $z1) {
    50          
1598             return (
1599             # 11111111 222222222222
1600             # A A Z
1601 151         330 _cc($a1) . _cc($a2,$z2), # a2-z2
1602             );
1603             }
1604             elsif (($a1+1) == $z1) {
1605             return (
1606             # 11111111111 222222222222
1607             # A Z A Z
1608 131         301 _cc($a1) . _cc($a2,$Z2), # a2-
1609             _cc( $z1) . _cc($A2,$z2), # -z2
1610             );
1611             }
1612             else {
1613             return (
1614             # 1111111111111111 222222222222
1615             # A Z A Z
1616 0         0 _cc($a1) . _cc($a2,$Z2), # a2-
1617             _cc($a1+1,$z1-1) . _cc($A2,$Z2), # -
1618             _cc( $z1) . _cc($A2,$z2), # -z2
1619             );
1620             }
1621             }
1622             elsif ($length == 3) {
1623 20         38 my($a1,$a2,$a3) = unpack 'CCC', $_[0];
1624 0         0 my($z1,$z2,$z3) = unpack 'CCC', $_[1];
1625 0         0 my($A1,$A2,$A3) = unpack 'CCC', $_[2];
1626 0         0 my($Z1,$Z2,$Z3) = unpack 'CCC', $_[3];
1627              
1628 0 0       0 if ($a1 == $z1) {
    0          
1629 0 0       0 if ($a2 == $z2) {
    0          
1630             return (
1631             # 11111111 22222222 333333333333
1632             # A A A Z
1633 0         0 _cc($a1) . _cc($a2) . _cc($a3,$z3), # a3-z3
1634             );
1635             }
1636             elsif (($a2+1) == $z2) {
1637             return (
1638             # 11111111 22222222222 333333333333
1639             # A A Z A Z
1640 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1641             _cc($a1) . _cc( $z2) . _cc($A3,$z3), # -z3
1642             );
1643             }
1644             else {
1645             return (
1646             # 11111111 2222222222222222 333333333333
1647             # A A Z A Z
1648 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1649             _cc($a1) . _cc($a2+1,$z2-1) . _cc($A3,$Z3), # -
1650             _cc($a1) . _cc( $z2) . _cc($A3,$z3), # -z3
1651             );
1652             }
1653             }
1654             elsif (($a1+1) == $z1) {
1655             return (
1656             # 11111111111 22222222222222 333333333333
1657             # A Z A Z A Z
1658 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1659             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3), # -
1660             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3), # -
1661             _cc( $z1) . _cc( $z2) . _cc($A3,$z3), # -z3
1662             );
1663             }
1664             else {
1665             return (
1666             # 1111111111111111 22222222222222 333333333333
1667             # A Z A Z A Z
1668 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1669             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3), # -
1670             _cc($a1+1,$z1-1) . _cc($A2,$Z2) . _cc($A3,$Z3), # -
1671             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3), # -
1672             _cc( $z1) . _cc( $z2) . _cc($A3,$z3), # -z3
1673             );
1674             }
1675             }
1676             elsif ($length == 4) {
1677 0         0 my($a1,$a2,$a3,$a4) = unpack 'CCCC', $_[0];
1678 0         0 my($z1,$z2,$z3,$z4) = unpack 'CCCC', $_[1];
1679 0         0 my($A1,$A2,$A3,$A4) = unpack 'CCCC', $_[0];
1680 0         0 my($Z1,$Z2,$Z3,$Z4) = unpack 'CCCC', $_[1];
1681              
1682 0 0       0 if ($a1 == $z1) {
    0          
1683 0 0       0 if ($a2 == $z2) {
    0          
1684 0 0       0 if ($a3 == $z3) {
    0          
1685             return (
1686             # 11111111 22222222 33333333 444444444444
1687             # A A A A Z
1688 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$z4), # a4-z4
1689             );
1690             }
1691             elsif (($a3+1) == $z3) {
1692             return (
1693             # 11111111 22222222 33333333333 444444444444
1694             # A A A Z A Z
1695 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1696             _cc($a1) . _cc($a2) . _cc( $z3) . _cc($A4,$z4), # -z4
1697             );
1698             }
1699             else {
1700             return (
1701             # 11111111 22222222 3333333333333333 444444444444
1702             # A A A Z A Z
1703 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1704             _cc($a1) . _cc($a2) . _cc($a3+1,$z3-1) . _cc($A4,$Z4), # -
1705             _cc($a1) . _cc($a2) . _cc( $z3) . _cc($A4,$z4), # -z4
1706             );
1707             }
1708             }
1709             elsif (($a2+1) == $z2) {
1710             return (
1711             # 11111111 22222222222 33333333333333 444444444444
1712             # A A Z A Z A Z
1713 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1714             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1715             _cc($a1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1716             _cc($a1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1717             );
1718             }
1719             else {
1720             return (
1721             # 11111111 2222222222222222 33333333333333 444444444444
1722             # A A Z A Z A Z
1723 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1724             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1725             _cc($a1) . _cc($a2+1,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1726             _cc($a1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1727             _cc($a1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1728             );
1729             }
1730             }
1731             elsif (($a1+1) == $z1) {
1732             return (
1733             # 11111111111 22222222222222 33333333333333 444444444444
1734             # A Z A Z A Z A Z
1735 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1736             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1737             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1738             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1739             _cc( $z1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1740             _cc( $z1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1741             );
1742             }
1743             else {
1744             return (
1745             # 1111111111111111 22222222222222 33333333333333 444444444444
1746             # A Z A Z A Z A Z
1747 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1748             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1749             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1750             _cc($a1+1,$z1-1) . _cc($A2,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1751             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1752             _cc( $z1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1753             _cc( $z1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1754             );
1755             }
1756             }
1757             else {
1758 0         0 die __FILE__, ": subroutine _octets got invalid length ($length).\n";
1759             }
1760             }
1761              
1762             #
1763             # EUC-JP range regexp
1764             #
1765             sub _range_regexp {
1766 0     517   0 my($length,$first,$last) = @_;
1767              
1768 517         1056 my @range_regexp = ();
1769 517 50       711 if (not exists $range_tr{$length}) {
1770 517         1316 return @range_regexp;
1771             }
1772              
1773 0         0 my @ranges = @{ $range_tr{$length} };
  517         650  
1774 517         1115 while (my @range = splice(@ranges,0,$length)) {
1775 517         1579 my $min = '';
1776 1420         1926 my $max = '';
1777 1420         1537 for (my $i=0; $i < $length; $i++) {
1778 1420         2366 $min .= pack 'C', $range[$i][0];
1779 1682         3371 $max .= pack 'C', $range[$i][-1];
1780             }
1781              
1782             # min___max
1783             # FIRST_____________LAST
1784             # (nothing)
1785              
1786 1682 100 66     3610 if ($max lt $first) {
    100 100        
    50 33        
    100 100        
    100 66        
    100 66        
    50 66        
1787             }
1788              
1789             # **********
1790             # min_________max
1791             # FIRST_____________LAST
1792             # **********
1793              
1794             elsif (($min le $first) and ($first le $max) and ($max le $last)) {
1795 1420         11503 push @range_regexp, _octets($length,$first,$max,$min,$max);
1796             }
1797              
1798             # **********************
1799             # min________________max
1800             # FIRST_____________LAST
1801             # **********************
1802              
1803             elsif (($min eq $first) and ($max eq $last)) {
1804 20         44 push @range_regexp, _octets($length,$first,$last,$min,$max);
1805             }
1806              
1807             # *********
1808             # min___max
1809             # FIRST_____________LAST
1810             # *********
1811              
1812             elsif (($first le $min) and ($max le $last)) {
1813 0         0 push @range_regexp, _octets($length,$min,$max,$min,$max);
1814             }
1815              
1816             # **********************
1817             # min__________________________max
1818             # FIRST_____________LAST
1819             # **********************
1820              
1821             elsif (($min le $first) and ($last le $max)) {
1822 60         90 push @range_regexp, _octets($length,$first,$last,$min,$max);
1823             }
1824              
1825             # *********
1826             # min________max
1827             # FIRST_____________LAST
1828             # *********
1829              
1830             elsif (($first le $min) and ($min le $last) and ($last le $max)) {
1831 477         1166 push @range_regexp, _octets($length,$min,$last,$min,$max);
1832             }
1833              
1834             # min___max
1835             # FIRST_____________LAST
1836             # (nothing)
1837              
1838             elsif ($last lt $min) {
1839             }
1840              
1841             else {
1842 20         34 die __FILE__, ": subroutine _range_regexp panic.\n";
1843             }
1844             }
1845              
1846 0         0 return @range_regexp;
1847             }
1848              
1849             #
1850             # EUC-JP open character list for qr and not qr
1851             #
1852             sub _charlist {
1853              
1854 517     758   1153 my $modifier = pop @_;
1855 758         1189 my @char = @_;
1856              
1857 758 100       1524 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
1858              
1859             # unescape character
1860 758         1736 for (my $i=0; $i <= $#char; $i++) {
1861              
1862             # escape - to ...
1863 758 100 100     2615 if ($char[$i] eq '-') {
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
1864 2648 100 100     17887 if ((0 < $i) and ($i < $#char)) {
1865 522         1912 $char[$i] = '...';
1866             }
1867             }
1868              
1869             # octal escape sequence
1870             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
1871 497         985 $char[$i] = octchr($1);
1872             }
1873              
1874             # hexadecimal escape sequence
1875             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
1876 0         0 $char[$i] = hexchr($1);
1877             }
1878              
1879             # \b{...} --> b\{...}
1880             # \B{...} --> B\{...}
1881             # \N{CHARNAME} --> N\{CHARNAME}
1882             # \p{PROPERTY} --> p\{PROPERTY}
1883             # \P{PROPERTY} --> P\{PROPERTY}
1884             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} ) \z/oxms) {
1885 0         0 $char[$i] = $1 . '\\' . $2;
1886             }
1887              
1888             # \p, \P, \X --> p, P, X
1889             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
1890 0         0 $char[$i] = $1;
1891             }
1892              
1893             elsif ($char[$i] =~ /\A \\ ([0-7]{2,3}) \z/oxms) {
1894 0         0 $char[$i] = CORE::chr oct $1;
1895             }
1896             elsif ($char[$i] =~ /\A \\x ([0-9A-Fa-f]{1,2}) \z/oxms) {
1897 0         0 $char[$i] = CORE::chr hex $1;
1898             }
1899             elsif ($char[$i] =~ /\A \\c ([\x40-\x5F]) \z/oxms) {
1900 206         849 $char[$i] = CORE::chr(CORE::ord($1) & 0x1F);
1901             }
1902             elsif ($char[$i] =~ /\A (\\ [0nrtfbaedswDSWHVhvR]) \z/oxms) {
1903             $char[$i] = {
1904             '\0' => "\0",
1905             '\n' => "\n",
1906             '\r' => "\r",
1907             '\t' => "\t",
1908             '\f' => "\f",
1909             '\b' => "\x08", # \b means backspace in character class
1910             '\a' => "\a",
1911             '\e' => "\e",
1912             '\d' => '[0-9]',
1913              
1914             # Vertical tabs are now whitespace
1915             # \s in a regex now matches a vertical tab in all circumstances.
1916             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1917             # \t \n \v \f \r space
1918             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
1919             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
1920             '\s' => '\s',
1921              
1922             '\w' => '[0-9A-Z_a-z]',
1923             '\D' => '${Eeucjp::eD}',
1924             '\S' => '${Eeucjp::eS}',
1925             '\W' => '${Eeucjp::eW}',
1926              
1927             '\H' => '${Eeucjp::eH}',
1928             '\V' => '${Eeucjp::eV}',
1929             '\h' => '[\x09\x20]',
1930             '\v' => '[\x0A\x0B\x0C\x0D]',
1931             '\R' => '${Eeucjp::eR}',
1932              
1933 0         0 }->{$1};
1934             }
1935              
1936             # POSIX-style character classes
1937             elsif ($ignorecase and ($char[$i] =~ /\A ( \[\: \^? (?:lower|upper) :\] ) \z/oxms)) {
1938             $char[$i] = {
1939              
1940             '[:lower:]' => '[\x41-\x5A\x61-\x7A]',
1941             '[:upper:]' => '[\x41-\x5A\x61-\x7A]',
1942             '[:^lower:]' => '${Eeucjp::not_lower_i}',
1943             '[:^upper:]' => '${Eeucjp::not_upper_i}',
1944              
1945 33         520 }->{$1};
1946             }
1947             elsif ($char[$i] =~ /\A ( \[\: \^? (?:alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print|punct|space|upper|word|xdigit) :\] ) \z/oxms) {
1948             $char[$i] = {
1949              
1950             '[:alnum:]' => '[\x30-\x39\x41-\x5A\x61-\x7A]',
1951             '[:alpha:]' => '[\x41-\x5A\x61-\x7A]',
1952             '[:ascii:]' => '[\x00-\x7F]',
1953             '[:blank:]' => '[\x09\x20]',
1954             '[:cntrl:]' => '[\x00-\x1F\x7F]',
1955             '[:digit:]' => '[\x30-\x39]',
1956             '[:graph:]' => '[\x21-\x7F]',
1957             '[:lower:]' => '[\x61-\x7A]',
1958             '[:print:]' => '[\x20-\x7F]',
1959             '[:punct:]' => '[\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]',
1960              
1961             # P.174 POSIX-Style Character Classes
1962             # in Chapter 5: Pattern Matching
1963             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1964              
1965             # P.311 11.2.4 Character Classes and other Special Escapes
1966             # in Chapter 11: perlre: Perl regular expressions
1967             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
1968              
1969             # P.210 POSIX-Style Character Classes
1970             # in Chapter 5: Pattern Matching
1971             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1972              
1973             '[:space:]' => '[\s\x0B]', # "\s" plus vertical tab ("\cK")
1974              
1975             '[:upper:]' => '[\x41-\x5A]',
1976             '[:word:]' => '[\x30-\x39\x41-\x5A\x5F\x61-\x7A]',
1977             '[:xdigit:]' => '[\x30-\x39\x41-\x46\x61-\x66]',
1978             '[:^alnum:]' => '${Eeucjp::not_alnum}',
1979             '[:^alpha:]' => '${Eeucjp::not_alpha}',
1980             '[:^ascii:]' => '${Eeucjp::not_ascii}',
1981             '[:^blank:]' => '${Eeucjp::not_blank}',
1982             '[:^cntrl:]' => '${Eeucjp::not_cntrl}',
1983             '[:^digit:]' => '${Eeucjp::not_digit}',
1984             '[:^graph:]' => '${Eeucjp::not_graph}',
1985             '[:^lower:]' => '${Eeucjp::not_lower}',
1986             '[:^print:]' => '${Eeucjp::not_print}',
1987             '[:^punct:]' => '${Eeucjp::not_punct}',
1988             '[:^space:]' => '${Eeucjp::not_space}',
1989             '[:^upper:]' => '${Eeucjp::not_upper}',
1990             '[:^word:]' => '${Eeucjp::not_word}',
1991             '[:^xdigit:]' => '${Eeucjp::not_xdigit}',
1992              
1993 8         55 }->{$1};
1994             }
1995             elsif ($char[$i] =~ /\A \\ ($q_char) \z/oxms) {
1996 70         1259 $char[$i] = $1;
1997             }
1998             }
1999              
2000             # open character list
2001 7         34 my @singleoctet = ();
2002 758         1304 my @multipleoctet = ();
2003 758         988 for (my $i=0; $i <= $#char; ) {
2004              
2005             # escaped -
2006 758 100 100     1652 if (defined($char[$i+1]) and ($char[$i+1] eq '...')) {
    100          
    100          
    50          
    50          
    100          
2007 2151         8937 $i += 1;
2008 497         615 next;
2009             }
2010              
2011             # make range regexp
2012             elsif ($char[$i] eq '...') {
2013              
2014             # range error
2015 497 50       929 if (CORE::length($char[$i-1]) > CORE::length($char[$i+1])) {
    100          
2016 497         1802 croak 'Invalid [] range in regexp (length(A) > length(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
2017             }
2018             elsif (CORE::length($char[$i-1]) == CORE::length($char[$i+1])) {
2019 0 50       0 if ($char[$i-1] gt $char[$i+1]) {
2020 477         1261 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
2021             }
2022             }
2023              
2024             # make range regexp per length
2025 0         0 for my $length (CORE::length($char[$i-1]) .. CORE::length($char[$i+1])) {
2026 497         1258 my @regexp = ();
2027              
2028             # is first and last
2029 517 100 100     710 if (($length == CORE::length($char[$i-1])) and ($length == CORE::length($char[$i+1]))) {
    100 33        
    50          
    50          
2030 517         2044 push @regexp, _range_regexp($length, $char[$i-1], $char[$i+1]);
2031             }
2032              
2033             # is first
2034             elsif ($length == CORE::length($char[$i-1])) {
2035 477         1230 push @regexp, _range_regexp($length, $char[$i-1], "\xFF" x $length);
2036             }
2037              
2038             # is inside in first and last
2039             elsif ((CORE::length($char[$i-1]) < $length) and ($length < CORE::length($char[$i+1]))) {
2040 20         73 push @regexp, _range_regexp($length, "\x00" x $length, "\xFF" x $length);
2041             }
2042              
2043             # is last
2044             elsif ($length == CORE::length($char[$i+1])) {
2045 0         0 push @regexp, _range_regexp($length, "\x00" x $length, $char[$i+1]);
2046             }
2047              
2048             else {
2049 20         64 die __FILE__, ": subroutine make_regexp panic.\n";
2050             }
2051              
2052 0 100       0 if ($length == 1) {
2053 517         1022 push @singleoctet, @regexp;
2054             }
2055             else {
2056 386         916 push @multipleoctet, @regexp;
2057             }
2058             }
2059              
2060 131         305 $i += 2;
2061             }
2062              
2063             # with /i modifier
2064             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
2065 497 100       995 if ($modifier =~ /i/oxms) {
2066 764         1144 my $uc = Eeucjp::uc($char[$i]);
2067 192         333 my $fc = Eeucjp::fc($char[$i]);
2068 192 50       351 if ($uc ne $fc) {
2069 192 50       369 if (CORE::length($fc) == 1) {
2070 192         262 push @singleoctet, $uc, $fc;
2071             }
2072             else {
2073 192         393 push @singleoctet, $uc;
2074 0         0 push @multipleoctet, $fc;
2075             }
2076             }
2077             else {
2078 0         0 push @singleoctet, $char[$i];
2079             }
2080             }
2081             else {
2082 0         0 push @singleoctet, $char[$i];
2083             }
2084 572         968 $i += 1;
2085             }
2086              
2087             # single character of single octet code
2088             elsif ($char[$i] =~ /\A (?: \\h ) \z/oxms) {
2089 764         1335 push @singleoctet, "\t", "\x20";
2090 0         0 $i += 1;
2091             }
2092             elsif ($char[$i] =~ /\A (?: \\v ) \z/oxms) {
2093 0         0 push @singleoctet, "\x0A", "\x0B", "\x0C", "\x0D";
2094 0         0 $i += 1;
2095             }
2096             elsif ($char[$i] =~ /\A (?: \\d | \\s | \\w ) \z/oxms) {
2097 0         0 push @singleoctet, $char[$i];
2098 2         4 $i += 1;
2099             }
2100              
2101             # single character of multiple-octet code
2102             else {
2103 2         10 push @multipleoctet, $char[$i];
2104 391         682 $i += 1;
2105             }
2106             }
2107              
2108             # quote metachar
2109 391         627 for (@singleoctet) {
2110 758 50       1473 if ($_ eq '...') {
    100          
    100          
    100          
    100          
2111 1384         7158 $_ = '-';
2112             }
2113             elsif (/\A \n \z/oxms) {
2114 0         0 $_ = '\n';
2115             }
2116             elsif (/\A \r \z/oxms) {
2117 8         18 $_ = '\r';
2118             }
2119             elsif (/\A ([\x00-\x20\x7F-\xFF]) \z/oxms) {
2120 8         18 $_ = sprintf('\x%02X', CORE::ord $1);
2121             }
2122             elsif (/\A [\x00-\xFF] \z/oxms) {
2123 1         5 $_ = quotemeta $_;
2124             }
2125             }
2126              
2127             # return character list
2128 939         1426 return \@singleoctet, \@multipleoctet;
2129             }
2130              
2131             #
2132             # EUC-JP octal escape sequence
2133             #
2134             sub octchr {
2135 758     5 0 2743 my($octdigit) = @_;
2136              
2137 5         16 my @binary = ();
2138 5         9 for my $octal (split(//,$octdigit)) {
2139             push @binary, {
2140             '0' => '000',
2141             '1' => '001',
2142             '2' => '010',
2143             '3' => '011',
2144             '4' => '100',
2145             '5' => '101',
2146             '6' => '110',
2147             '7' => '111',
2148 5         25 }->{$octal};
2149             }
2150 50         209 my $binary = join '', @binary;
2151              
2152             my $octchr = {
2153             # 1234567
2154             1 => pack('B*', "0000000$binary"),
2155             2 => pack('B*', "000000$binary"),
2156             3 => pack('B*', "00000$binary"),
2157             4 => pack('B*', "0000$binary"),
2158             5 => pack('B*', "000$binary"),
2159             6 => pack('B*', "00$binary"),
2160             7 => pack('B*', "0$binary"),
2161             0 => pack('B*', "$binary"),
2162              
2163 5         16 }->{CORE::length($binary) % 8};
2164              
2165 5         77 return $octchr;
2166             }
2167              
2168             #
2169             # EUC-JP hexadecimal escape sequence
2170             #
2171             sub hexchr {
2172 5     5 0 21 my($hexdigit) = @_;
2173              
2174             my $hexchr = {
2175             1 => pack('H*', "0$hexdigit"),
2176             0 => pack('H*', "$hexdigit"),
2177              
2178 5         16 }->{CORE::length($_[0]) % 2};
2179              
2180 5         38 return $hexchr;
2181             }
2182              
2183             #
2184             # EUC-JP open character list for qr
2185             #
2186             sub charlist_qr {
2187              
2188 5     519 0 18 my $modifier = pop @_;
2189 519         952 my @char = @_;
2190              
2191 519         1250 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
2192 519         1594 my @singleoctet = @$singleoctet;
2193 519         1096 my @multipleoctet = @$multipleoctet;
2194              
2195             # return character list
2196 519 100       881 if (scalar(@singleoctet) >= 1) {
2197              
2198             # with /i modifier
2199 519 100       1100 if ($modifier =~ m/i/oxms) {
2200 384         937 my %singleoctet_ignorecase = ();
2201 107         154 for (@singleoctet) {
2202 107   100     175 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
2203 277         911 for my $ord (hex($1) .. hex($2)) {
2204 85         310 my $char = CORE::chr($ord);
2205 1196         1680 my $uc = Eeucjp::uc($char);
2206 1196         1677 my $fc = Eeucjp::fc($char);
2207 1196 100       1858 if ($uc eq $fc) {
2208 1196         1809 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
2209             }
2210             else {
2211 607 50       1363 if (CORE::length($fc) == 1) {
2212 589         757 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2213 589         1172 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
2214             }
2215             else {
2216 589         1397 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2217 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
2218             }
2219             }
2220             }
2221             }
2222 0 100       0 if ($_ ne '') {
2223 277         572 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
2224             }
2225             }
2226 192         542 my $i = 0;
2227 107         173 my @singleoctet_ignorecase = ();
2228 107         171 for my $ord (0 .. 255) {
2229 107 100       201 if (exists $singleoctet_ignorecase{$ord}) {
2230 27392         32294 push @{$singleoctet_ignorecase[$i]}, $ord;
  1727         1646  
2231             }
2232             else {
2233 1727         2735 $i++;
2234             }
2235             }
2236 25665         26924 @singleoctet = ();
2237 107         234 for my $range (@singleoctet_ignorecase) {
2238 107 100       255 if (ref $range) {
2239 11262 100       18198 if (scalar(@{$range}) == 1) {
  219 50       290  
2240 219         443 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  5         6  
2241             }
2242 5         81 elsif (scalar(@{$range}) == 2) {
2243 214         369 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
2244             }
2245             else {
2246 0         0 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  214         252  
  214         271  
2247             }
2248             }
2249             }
2250             }
2251              
2252 214         1395 my $not_anchor = '';
2253 384         567 $not_anchor = '(?![\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE])';
2254              
2255 384         520 push @multipleoctet, join('', $not_anchor, '[', @singleoctet, ']' );
2256             }
2257 384 100       1014 if (scalar(@multipleoctet) >= 2) {
2258 519         1165 return '(?:' . join('|', @multipleoctet) . ')';
2259             }
2260             else {
2261 102         710 return $multipleoctet[0];
2262             }
2263             }
2264              
2265             #
2266             # EUC-JP open character list for not qr
2267             #
2268             sub charlist_not_qr {
2269              
2270 417     239 0 1834 my $modifier = pop @_;
2271 239         422 my @char = @_;
2272              
2273 239         580 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
2274 239         833 my @singleoctet = @$singleoctet;
2275 239         465 my @multipleoctet = @$multipleoctet;
2276              
2277             # with /i modifier
2278 239 100       369 if ($modifier =~ m/i/oxms) {
2279 239         556 my %singleoctet_ignorecase = ();
2280 128         170 for (@singleoctet) {
2281 128   100     192 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
2282 277         931 for my $ord (hex($1) .. hex($2)) {
2283 85         361 my $char = CORE::chr($ord);
2284 1196         1736 my $uc = Eeucjp::uc($char);
2285 1196         1536 my $fc = Eeucjp::fc($char);
2286 1196 100       2024 if ($uc eq $fc) {
2287 1196         2493 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
2288             }
2289             else {
2290 607 50       1471 if (CORE::length($fc) == 1) {
2291 589         781 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2292 589         1246 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
2293             }
2294             else {
2295 589         1590 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2296 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
2297             }
2298             }
2299             }
2300             }
2301 0 100       0 if ($_ ne '') {
2302 277         511 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
2303             }
2304             }
2305 192         432 my $i = 0;
2306 128         182 my @singleoctet_ignorecase = ();
2307 128         171 for my $ord (0 .. 255) {
2308 128 100       228 if (exists $singleoctet_ignorecase{$ord}) {
2309 32768         38044 push @{$singleoctet_ignorecase[$i]}, $ord;
  1727         1676  
2310             }
2311             else {
2312 1727         3401 $i++;
2313             }
2314             }
2315 31041         32218 @singleoctet = ();
2316 128         249 for my $range (@singleoctet_ignorecase) {
2317 128 100       292 if (ref $range) {
2318 11262 100       17857 if (scalar(@{$range}) == 1) {
  219 50       214  
2319 219         369 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  5         8  
2320             }
2321 5         85 elsif (scalar(@{$range}) == 2) {
2322 214         294 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
2323             }
2324             else {
2325 0         0 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  214         275  
  214         258  
2326             }
2327             }
2328             }
2329             }
2330              
2331             # return character list
2332 214 100       925 if (scalar(@multipleoctet) >= 1) {
2333 239 100       492 if (scalar(@singleoctet) >= 1) {
2334              
2335             # any character other than multiple-octet and single octet character class
2336 114         254 return '(?!' . join('|', @multipleoctet) . ')(?:[^\x8E\x8F\xA1-\xFE' . join('', @singleoctet) . ']|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])';
2337             }
2338             else {
2339              
2340             # any character other than multiple-octet character class
2341 70         464 return '(?!' . join('|', @multipleoctet) . ")(?:$your_char)";
2342             }
2343             }
2344             else {
2345 44 50       251 if (scalar(@singleoctet) >= 1) {
2346              
2347             # any character other than single octet character class
2348 125         240 return '(?:[^\x8E\x8F\xA1-\xFE' . join('', @singleoctet) . ']|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])';
2349             }
2350             else {
2351              
2352             # any character
2353 125         741 return "(?:$your_char)";
2354             }
2355             }
2356             }
2357              
2358             #
2359             # open file in read mode
2360             #
2361             sub _open_r {
2362 0     658   0 my(undef,$file) = @_;
2363 329     329   6727 use Fcntl qw(O_RDONLY);
  329         2289  
  329         51737  
2364 658         2035 return CORE::sysopen($_[0], $file, &O_RDONLY);
2365             }
2366              
2367             #
2368             # open file in append mode
2369             #
2370             sub _open_a {
2371 658     329   27774 my(undef,$file) = @_;
2372 329     329   3965 use Fcntl qw(O_WRONLY O_APPEND O_CREAT);
  329         2520  
  329         1137640  
2373 329         1213 return CORE::sysopen($_[0], $file, &O_WRONLY|&O_APPEND|&O_CREAT);
2374             }
2375              
2376             #
2377             # safe system
2378             #
2379             sub _systemx {
2380              
2381             # P.707 29.2.33. exec
2382             # in Chapter 29: Functions
2383             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2384             #
2385             # Be aware that in older releases of Perl, exec (and system) did not flush
2386             # your output buffer, so you needed to enable command buffering by setting $|
2387             # on one or more filehandles to avoid lost output in the case of exec, or
2388             # misordererd output in the case of system. This situation was largely remedied
2389             # in the 5.6 release of Perl. (So, 5.005 release not yet.)
2390              
2391             # P.855 exec
2392             # in Chapter 27: Functions
2393             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2394             #
2395             # In very old release of Perl (before v5.6), exec (and system) did not flush
2396             # your output buffer, so you needed to enable command buffering by setting $|
2397             # on one or more filehandles to avoid lost output with exec or misordered
2398             # output with system.
2399              
2400 329     329   61488 $| = 1;
2401              
2402             # P.565 23.1.2. Cleaning Up Your Environment
2403             # in Chapter 23: Security
2404             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2405              
2406             # P.656 Cleaning Up Your Environment
2407             # in Chapter 20: Security
2408             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2409              
2410             # local $ENV{'PATH'} = '.';
2411 329         1270 local @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Make %ENV safer
2412              
2413             # P.707 29.2.33. exec
2414             # in Chapter 29: Functions
2415             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2416             #
2417             # As we mentioned earlier, exec treats a discrete list of arguments as an
2418             # indication that it should bypass shell processing. However, there is one
2419             # place where you might still get tripped up. The exec call (and system, too)
2420             # will not distinguish between a single scalar argument and an array containing
2421             # only one element.
2422             #
2423             # @args = ("echo surprise"); # just one element in list
2424             # exec @args # still subject to shell escapes
2425             # or die "exec: $!"; # because @args == 1
2426             #
2427             # To avoid this, you can use the PATHNAME syntax, explicitly duplicating the
2428             # first argument as the pathname, which forces the rest of the arguments to be
2429             # interpreted as a list, even if there is only one of them:
2430             #
2431             # exec { $args[0] } @args # safe even with one-argument list
2432             # or die "can't exec @args: $!";
2433              
2434             # P.855 exec
2435             # in Chapter 27: Functions
2436             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2437             #
2438             # As we mentioned earlier, exec treats a discrete list of arguments as a
2439             # directive to bypass shell processing. However, there is one place where
2440             # you might still get tripped up. The exec call (and system, too) cannot
2441             # distinguish between a single scalar argument and an array containing
2442             # only one element.
2443             #
2444             # @args = ("echo surprise"); # just one element in list
2445             # exec @args # still subject to shell escapes
2446             # || die "exec: $!"; # because @args == 1
2447             #
2448             # To avoid this, use the PATHNAME syntax, explicitly duplicating the first
2449             # argument as the pathname, which forces the rest of the arguments to be
2450             # interpreted as a list, even if there is only one of them:
2451             #
2452             # exec { $args[0] } @args # safe even with one-argument list
2453             # || die "can't exec @args: $!";
2454              
2455 329         3353 return CORE::system { $_[0] } @_; # safe even with one-argument list
  329         816  
2456             }
2457              
2458             #
2459             # EUC-JP order to character (with parameter)
2460             #
2461             sub Eeucjp::chr(;$) {
2462              
2463 329 0   0 0 36461841 my $c = @_ ? $_[0] : $_;
2464              
2465 0 0       0 if ($c == 0x00) {
2466 0         0 return "\x00";
2467             }
2468             else {
2469 0         0 my @chr = ();
2470 0         0 while ($c > 0) {
2471 0         0 unshift @chr, ($c % 0x100);
2472 0         0 $c = int($c / 0x100);
2473             }
2474 0         0 return pack 'C*', @chr;
2475             }
2476             }
2477              
2478             #
2479             # EUC-JP order to character (without parameter)
2480             #
2481             sub Eeucjp::chr_() {
2482              
2483 0     0 0 0 my $c = $_;
2484              
2485 0 0       0 if ($c == 0x00) {
2486 0         0 return "\x00";
2487             }
2488             else {
2489 0         0 my @chr = ();
2490 0         0 while ($c > 0) {
2491 0         0 unshift @chr, ($c % 0x100);
2492 0         0 $c = int($c / 0x100);
2493             }
2494 0         0 return pack 'C*', @chr;
2495             }
2496             }
2497              
2498             #
2499             # EUC-JP path globbing (with parameter)
2500             #
2501             sub Eeucjp::glob($) {
2502              
2503 0 0   0 0 0 if (wantarray) {
2504 0         0 my @glob = _DOS_like_glob(@_);
2505 0         0 for my $glob (@glob) {
2506 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2507             }
2508 0         0 return @glob;
2509             }
2510             else {
2511 0         0 my $glob = _DOS_like_glob(@_);
2512 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2513 0         0 return $glob;
2514             }
2515             }
2516              
2517             #
2518             # EUC-JP path globbing (without parameter)
2519             #
2520             sub Eeucjp::glob_() {
2521              
2522 0 0   0 0 0 if (wantarray) {
2523 0         0 my @glob = _DOS_like_glob();
2524 0         0 for my $glob (@glob) {
2525 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2526             }
2527 0         0 return @glob;
2528             }
2529             else {
2530 0         0 my $glob = _DOS_like_glob();
2531 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2532 0         0 return $glob;
2533             }
2534             }
2535              
2536             #
2537             # EUC-JP path globbing via File::DosGlob 1.10
2538             #
2539             # Often I confuse "_dosglob" and "_doglob".
2540             # So, I renamed "_dosglob" to "_DOS_like_glob".
2541             #
2542             my %iter;
2543             my %entries;
2544             sub _DOS_like_glob {
2545              
2546             # context (keyed by second cxix argument provided by core)
2547 0     0   0 my($expr,$cxix) = @_;
2548              
2549             # glob without args defaults to $_
2550 0 0       0 $expr = $_ if not defined $expr;
2551              
2552             # represents the current user's home directory
2553             #
2554             # 7.3. Expanding Tildes in Filenames
2555             # in Chapter 7. File Access
2556             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
2557             #
2558             # and File::HomeDir, File::HomeDir::Windows module
2559              
2560             # DOS-like system
2561 0 0       0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
2562 0         0 $expr =~ s{ \A ~ (?= [^/\\] ) }
  0         0  
2563             { my_home_MSWin32() }oxmse;
2564             }
2565              
2566             # UNIX-like system
2567 0 0 0     0 else {
  0         0  
2568             $expr =~ s{ \A ~ ( (?:[^\x8E\x8F\xA1-\xFE/]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])* ) }
2569             { $1 ? (CORE::eval(q{(getpwnam($1))[7]})||my_home()) : my_home() }oxmse;
2570             }
2571 0 0       0  
2572 0 0       0 # assume global context if not provided one
2573             $cxix = '_G_' if not defined $cxix;
2574             $iter{$cxix} = 0 if not exists $iter{$cxix};
2575 0 0       0  
2576 0         0 # if we're just beginning, do it all first
2577             if ($iter{$cxix} == 0) {
2578             $entries{$cxix} = [ _do_glob(1, _parse_line($expr)) ];
2579             }
2580 0 0       0  
2581 0         0 # chuck it all out, quick or slow
2582 0         0 if (wantarray) {
  0         0  
2583             delete $iter{$cxix};
2584             return @{delete $entries{$cxix}};
2585 0 0       0 }
  0         0  
2586 0         0 else {
  0         0  
2587             if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
2588             return shift @{$entries{$cxix}};
2589             }
2590 0         0 else {
2591 0         0 # return undef for EOL
2592 0         0 delete $iter{$cxix};
2593             delete $entries{$cxix};
2594             return undef;
2595             }
2596             }
2597             }
2598              
2599             #
2600             # EUC-JP path globbing subroutine
2601             #
2602 0     0   0 sub _do_glob {
2603 0         0  
2604 0         0 my($cond,@expr) = @_;
2605             my @glob = ();
2606             my $fix_drive_relative_paths = 0;
2607 0         0  
2608 0 0       0 OUTER:
2609 0 0       0 for my $expr (@expr) {
2610             next OUTER if not defined $expr;
2611 0         0 next OUTER if $expr eq '';
2612 0         0  
2613 0         0 my @matched = ();
2614 0         0 my @globdir = ();
2615 0         0 my $head = '.';
2616             my $pathsep = '/';
2617             my $tail;
2618 0 0       0  
2619 0         0 # if argument is within quotes strip em and do no globbing
2620 0 0       0 if ($expr =~ /\A " ((?:$q_char)*?) " \z/oxms) {
2621 0 0       0 $expr = $1;
2622 0         0 if ($cond eq 'd') {
2623             if (-d $expr) {
2624             push @glob, $expr;
2625             }
2626 0 0       0 }
2627 0         0 else {
2628             if (-e $expr) {
2629             push @glob, $expr;
2630 0         0 }
2631             }
2632             next OUTER;
2633             }
2634              
2635 0 0       0 # wildcards with a drive prefix such as h:*.pm must be changed
2636 0 0       0 # to h:./*.pm to expand correctly
2637 0         0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
2638             if ($expr =~ s# \A ((?:[A-Za-z]:)?) ([^\x8E\x8F\xA1-\xFE/\\]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF]) #$1./$2#oxms) {
2639             $fix_drive_relative_paths = 1;
2640             }
2641 0 0       0 }
2642 0 0       0  
2643 0         0 if (($head, $tail) = _parse_path($expr,$pathsep)) {
2644 0         0 if ($tail eq '') {
2645             push @glob, $expr;
2646 0 0       0 next OUTER;
2647 0 0       0 }
2648 0         0 if ($head =~ / \A (?:$q_char)*? [*?] /oxms) {
  0         0  
2649 0         0 if (@globdir = _do_glob('d', $head)) {
2650             push @glob, _do_glob($cond, map {"$_$pathsep$tail"} @globdir);
2651             next OUTER;
2652 0 0 0     0 }
2653 0         0 }
2654             if ($head eq '' or $head =~ /\A [A-Za-z]: \z/oxms) {
2655 0         0 $head .= $pathsep;
2656             }
2657             $expr = $tail;
2658             }
2659 0 0       0  
2660 0 0       0 # If file component has no wildcards, we can avoid opendir
2661 0         0 if ($expr !~ / \A (?:$q_char)*? [*?] /oxms) {
2662             if ($head eq '.') {
2663 0 0 0     0 $head = '';
2664 0         0 }
2665             if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
2666 0         0 $head .= $pathsep;
2667 0 0       0 }
2668 0 0       0 $head .= $expr;
2669 0         0 if ($cond eq 'd') {
2670             if (-d $head) {
2671             push @glob, $head;
2672             }
2673 0 0       0 }
2674 0         0 else {
2675             if (-e $head) {
2676             push @glob, $head;
2677 0         0 }
2678             }
2679 0 0       0 next OUTER;
2680 0         0 }
2681 0         0 opendir(*DIR, $head) or next OUTER;
2682             my @leaf = readdir DIR;
2683 0 0       0 closedir DIR;
2684 0         0  
2685             if ($head eq '.') {
2686 0 0 0     0 $head = '';
2687 0         0 }
2688             if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
2689             $head .= $pathsep;
2690 0         0 }
2691 0         0  
2692 0         0 my $pattern = '';
2693             while ($expr =~ / \G ($q_char) /oxgc) {
2694             my $char = $1;
2695              
2696             # 6.9. Matching Shell Globs as Regular Expressions
2697             # in Chapter 6. Pattern Matching
2698             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
2699 0 0       0 # (and so on)
    0          
    0          
2700 0         0  
2701             if ($char eq '*') {
2702             $pattern .= "(?:$your_char)*",
2703 0         0 }
2704             elsif ($char eq '?') {
2705             $pattern .= "(?:$your_char)?", # DOS style
2706             # $pattern .= "(?:$your_char)", # UNIX style
2707 0         0 }
2708             elsif ((my $fc = Eeucjp::fc($char)) ne $char) {
2709             $pattern .= $fc;
2710 0         0 }
2711             else {
2712             $pattern .= quotemeta $char;
2713 0     0   0 }
  0         0  
2714             }
2715             my $matchsub = sub { Eeucjp::fc($_[0]) =~ /\A $pattern \z/xms };
2716              
2717             # if ($@) {
2718             # print STDERR "$0: $@\n";
2719             # next OUTER;
2720             # }
2721 0         0  
2722 0 0 0     0 INNER:
2723 0         0 for my $leaf (@leaf) {
2724             if ($leaf eq '.' or $leaf eq '..') {
2725 0 0 0     0 next INNER;
2726 0         0 }
2727             if ($cond eq 'd' and not -d "$head$leaf") {
2728             next INNER;
2729 0 0       0 }
2730 0         0  
2731 0         0 if (&$matchsub($leaf)) {
2732             push @matched, "$head$leaf";
2733             next INNER;
2734             }
2735              
2736             # [DOS compatibility special case]
2737 0 0 0     0 # Failed, add a trailing dot and try again, but only...
      0        
2738              
2739             if (Eeucjp::index($leaf,'.') == -1 and # if name does not have a dot in it *and*
2740             CORE::length($leaf) <= 8 and # name is shorter than or equal to 8 chars *and*
2741 0 0       0 Eeucjp::index($pattern,'\\.') != -1 # pattern has a dot.
2742 0         0 ) {
2743 0         0 if (&$matchsub("$leaf.")) {
2744             push @matched, "$head$leaf";
2745             next INNER;
2746             }
2747 0 0       0 }
2748 0         0 }
2749             if (@matched) {
2750             push @glob, @matched;
2751 0 0       0 }
2752 0         0 }
2753 0         0 if ($fix_drive_relative_paths) {
2754             for my $glob (@glob) {
2755             $glob =~ s# \A ([A-Za-z]:) \./ #$1#oxms;
2756 0         0 }
2757             }
2758             return @glob;
2759             }
2760              
2761             #
2762             # EUC-JP parse line
2763             #
2764 0     0   0 sub _parse_line {
2765              
2766 0         0 my($line) = @_;
2767 0         0  
2768 0         0 $line .= ' ';
2769             my @piece = ();
2770             while ($line =~ /
2771             " ( (?>(?: [^\x8E\x8F\xA1-\xFE"] |[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] )* ) ) " (?>\s+) |
2772             ( (?>(?: [^\x8E\x8F\xA1-\xFE"\s]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] )* ) ) (?>\s+)
2773 0 0       0 /oxmsg
2774             ) {
2775 0         0 push @piece, defined($1) ? $1 : $2;
2776             }
2777             return @piece;
2778             }
2779              
2780             #
2781             # EUC-JP parse path
2782             #
2783 0     0   0 sub _parse_path {
2784              
2785 0         0 my($path,$pathsep) = @_;
2786 0         0  
2787 0         0 $path .= '/';
2788             my @subpath = ();
2789             while ($path =~ /
2790             ((?: [^\x8E\x8F\xA1-\xFE\/\\]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] )+?) [\/\\]
2791 0         0 /oxmsg
2792             ) {
2793             push @subpath, $1;
2794 0         0 }
2795 0         0  
2796 0         0 my $tail = pop @subpath;
2797             my $head = join $pathsep, @subpath;
2798             return $head, $tail;
2799             }
2800              
2801             #
2802             # via File::HomeDir::Windows 1.00
2803             #
2804             sub my_home_MSWin32 {
2805              
2806             # A lot of unix people and unix-derived tools rely on
2807 0 0 0 0 0 0 # the ability to overload HOME. We will support it too
    0 0        
    0 0        
      0        
      0        
2808 0         0 # so that they can replace raw HOME calls with File::HomeDir.
2809             if (exists $ENV{'HOME'} and $ENV{'HOME'}) {
2810             return $ENV{'HOME'};
2811             }
2812              
2813 0         0 # Do we have a user profile?
2814             elsif (exists $ENV{'USERPROFILE'} and $ENV{'USERPROFILE'}) {
2815             return $ENV{'USERPROFILE'};
2816             }
2817              
2818 0         0 # Some Windows use something like $ENV{'HOME'}
2819             elsif (exists $ENV{'HOMEDRIVE'} and exists $ENV{'HOMEPATH'} and $ENV{'HOMEDRIVE'} and $ENV{'HOMEPATH'}) {
2820             return join '', $ENV{'HOMEDRIVE'}, $ENV{'HOMEPATH'};
2821 0         0 }
2822              
2823             return undef;
2824             }
2825              
2826             #
2827             # via File::HomeDir::Unix 1.00
2828 0     0 0 0 #
2829             sub my_home {
2830 0 0 0     0 my $home;
    0 0        
2831 0         0  
2832             if (exists $ENV{'HOME'} and defined $ENV{'HOME'}) {
2833             $home = $ENV{'HOME'};
2834             }
2835              
2836             # This is from the original code, but I'm guessing
2837 0         0 # it means "login directory" and exists on some Unixes.
2838             elsif (exists $ENV{'LOGDIR'} and $ENV{'LOGDIR'}) {
2839             $home = $ENV{'LOGDIR'};
2840             }
2841              
2842             ### More-desperate methods
2843              
2844 0         0 # Light desperation on any (Unixish) platform
2845             else {
2846             $home = CORE::eval q{ (getpwuid($<))[7] };
2847             }
2848              
2849 0 0 0     0 # On Unix in general, a non-existant home means "no home"
2850 0         0 # For example, "nobody"-like users might use /nonexistant
2851             if (defined $home and ! -d($home)) {
2852 0         0 $home = undef;
2853             }
2854             return $home;
2855             }
2856              
2857             #
2858             # ${^PREMATCH}, $PREMATCH, $` the string preceding what was matched
2859 0 0   0 0 0 #
2860 0 0 0     0 sub Eeucjp::PREMATCH {
2861 0         0 if (defined($&)) {
2862             if (defined($1) and (CORE::substr($&,-CORE::length($1),CORE::length($1)) eq $1)) {
2863             return CORE::substr($&,0,CORE::length($&)-CORE::length($1));
2864 0         0 }
2865             else {
2866             croak 'Use of "$`", $PREMATCH, and ${^PREMATCH} need to /( capture all )/ in regexp';
2867             }
2868 0         0 }
2869             else {
2870 0         0 return '';
2871             }
2872             return $`;
2873             }
2874              
2875             #
2876             # ${^MATCH}, $MATCH, $& the string that matched
2877 0 0   0 0 0 #
2878 0 0       0 sub Eeucjp::MATCH {
2879 0         0 if (defined($&)) {
2880             if (defined($1)) {
2881             return $1;
2882 0         0 }
2883             else {
2884             croak 'Use of "$&", $MATCH, and ${^MATCH} need to /( capture all )/ in regexp';
2885             }
2886 0         0 }
2887             else {
2888 0         0 return '';
2889             }
2890             return $&;
2891             }
2892              
2893             #
2894             # ${^POSTMATCH}, $POSTMATCH, $' the string following what was matched
2895 0     0 0 0 #
2896             sub Eeucjp::POSTMATCH {
2897             return $';
2898             }
2899              
2900             #
2901             # EUC-JP character to order (with parameter)
2902             #
2903 0 0   0 1 0 sub EUCJP::ord(;$) {
2904              
2905 0 0       0 local $_ = shift if @_;
2906 0         0  
2907 0         0 if (/\A ($q_char) /oxms) {
2908 0         0 my @ord = unpack 'C*', $1;
2909 0         0 my $ord = 0;
2910             while (my $o = shift @ord) {
2911 0         0 $ord = $ord * 0x100 + $o;
2912             }
2913             return $ord;
2914 0         0 }
2915             else {
2916             return CORE::ord $_;
2917             }
2918             }
2919              
2920             #
2921             # EUC-JP character to order (without parameter)
2922             #
2923 0 0   0 0 0 sub EUCJP::ord_() {
2924 0         0  
2925 0         0 if (/\A ($q_char) /oxms) {
2926 0         0 my @ord = unpack 'C*', $1;
2927 0         0 my $ord = 0;
2928             while (my $o = shift @ord) {
2929 0         0 $ord = $ord * 0x100 + $o;
2930             }
2931             return $ord;
2932 0         0 }
2933             else {
2934             return CORE::ord $_;
2935             }
2936             }
2937              
2938             #
2939             # EUC-JP reverse
2940             #
2941 0 0   0 0 0 sub EUCJP::reverse(@) {
2942 0         0  
2943             if (wantarray) {
2944             return CORE::reverse @_;
2945             }
2946             else {
2947              
2948             # One of us once cornered Larry in an elevator and asked him what
2949             # problem he was solving with this, but he looked as far off into
2950             # the distance as he could in an elevator and said, "It seemed like
2951 0         0 # a good idea at the time."
2952              
2953             return join '', CORE::reverse(join('',@_) =~ /\G ($q_char) /oxmsg);
2954             }
2955             }
2956              
2957             #
2958             # EUC-JP getc (with parameter, without parameter)
2959             #
2960 0     0 0 0 sub EUCJP::getc(;*@) {
2961 0 0       0  
2962 0 0 0     0 my($package) = caller;
2963             my $fh = @_ ? qualify_to_ref(shift,$package) : \*STDIN;
2964 0         0 croak 'Too many arguments for EUCJP::getc' if @_ and not wantarray;
  0         0  
2965 0         0  
2966 0         0 my @length = sort { $a <=> $b } keys %range_tr;
2967 0         0 my $getc = '';
2968 0 0       0 for my $length ($length[0] .. $length[-1]) {
2969 0 0       0 $getc .= CORE::getc($fh);
2970 0 0       0 if (exists $range_tr{CORE::length($getc)}) {
2971             if ($getc =~ /\A ${Eeucjp::dot_s} \z/oxms) {
2972             return wantarray ? ($getc,@_) : $getc;
2973             }
2974 0 0       0 }
2975             }
2976             return wantarray ? ($getc,@_) : $getc;
2977             }
2978              
2979             #
2980             # EUC-JP length by character
2981             #
2982 0 0   0 1 0 sub EUCJP::length(;$) {
2983              
2984 0         0 local $_ = shift if @_;
2985 0         0  
2986             local @_ = /\G ($q_char) /oxmsg;
2987             return scalar @_;
2988             }
2989              
2990             #
2991             # EUC-JP substr by character
2992             #
2993             BEGIN {
2994              
2995             # P.232 The lvalue Attribute
2996             # in Chapter 6: Subroutines
2997             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2998              
2999             # P.336 The lvalue Attribute
3000             # in Chapter 7: Subroutines
3001             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3002              
3003             # P.144 8.4 Lvalue subroutines
3004             # in Chapter 8: perlsub: Perl subroutines
3005 329 50 0 329 1 250901 # 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  
3006              
3007             CORE::eval sprintf(<<'END', ($] >= 5.014000) ? ':lvalue' : '');
3008             # vv----------------------*******
3009             sub EUCJP::substr($$;$$) %s {
3010              
3011             my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
3012              
3013             # If the substring is beyond either end of the string, substr() returns the undefined
3014             # value and produces a warning. When used as an lvalue, specifying a substring that
3015             # is entirely outside the string raises an exception.
3016             # http://perldoc.perl.org/functions/substr.html
3017              
3018             # A return with no argument returns the scalar value undef in scalar context,
3019             # an empty list () in list context, and (naturally) nothing at all in void
3020             # context.
3021              
3022             my $offset = $_[1];
3023             if (($offset > scalar(@char)) or ($offset < (-1 * scalar(@char)))) {
3024             return;
3025             }
3026              
3027             # substr($string,$offset,$length,$replacement)
3028             if (@_ == 4) {
3029             my(undef,undef,$length,$replacement) = @_;
3030             my $substr = join '', splice(@char, $offset, $length, $replacement);
3031             $_[0] = join '', @char;
3032              
3033             # return $substr; this doesn't work, don't say "return"
3034             $substr;
3035             }
3036              
3037             # substr($string,$offset,$length)
3038             elsif (@_ == 3) {
3039             my(undef,undef,$length) = @_;
3040             my $octet_offset = 0;
3041             my $octet_length = 0;
3042             if ($offset == 0) {
3043             $octet_offset = 0;
3044             }
3045             elsif ($offset > 0) {
3046             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
3047             }
3048             else {
3049             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
3050             }
3051             if ($length == 0) {
3052             $octet_length = 0;
3053             }
3054             elsif ($length > 0) {
3055             $octet_length = CORE::length(join '', @char[$offset..$offset+$length-1]);
3056             }
3057             else {
3058             $octet_length = -1 * CORE::length(join '', @char[$#char+$length+1..$#char]);
3059             }
3060             CORE::substr($_[0], $octet_offset, $octet_length);
3061             }
3062              
3063             # substr($string,$offset)
3064             else {
3065             my $octet_offset = 0;
3066             if ($offset == 0) {
3067             $octet_offset = 0;
3068             }
3069             elsif ($offset > 0) {
3070             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
3071             }
3072             else {
3073             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
3074             }
3075             CORE::substr($_[0], $octet_offset);
3076             }
3077             }
3078             END
3079             }
3080              
3081             #
3082             # EUC-JP index by character
3083             #
3084 0     0 1 0 sub EUCJP::index($$;$) {
3085 0 0       0  
3086 0         0 my $index;
3087             if (@_ == 3) {
3088             $index = Eeucjp::index($_[0], $_[1], CORE::length(EUCJP::substr($_[0], 0, $_[2])));
3089 0         0 }
3090             else {
3091             $index = Eeucjp::index($_[0], $_[1]);
3092 0 0       0 }
3093 0         0  
3094             if ($index == -1) {
3095             return -1;
3096 0         0 }
3097             else {
3098             return EUCJP::length(CORE::substr $_[0], 0, $index);
3099             }
3100             }
3101              
3102             #
3103             # EUC-JP rindex by character
3104             #
3105 0     0 1 0 sub EUCJP::rindex($$;$) {
3106 0 0       0  
3107 0         0 my $rindex;
3108             if (@_ == 3) {
3109             $rindex = Eeucjp::rindex($_[0], $_[1], CORE::length(EUCJP::substr($_[0], 0, $_[2])));
3110 0         0 }
3111             else {
3112             $rindex = Eeucjp::rindex($_[0], $_[1]);
3113 0 0       0 }
3114 0         0  
3115             if ($rindex == -1) {
3116             return -1;
3117 0         0 }
3118             else {
3119             return EUCJP::length(CORE::substr $_[0], 0, $rindex);
3120             }
3121             }
3122              
3123 329     329   5487 # when 'm//', '/' means regexp match 'm//' and '?' means regexp match '??'
  329         823  
  329         47174  
3124             # when 'div', '/' means division operator and '?' means conditional operator (condition ? then : else)
3125             use vars qw($slash); $slash = 'm//';
3126              
3127             # ord() to ord() or EUCJP::ord()
3128             my $function_ord = 'ord';
3129              
3130             # ord to ord or EUCJP::ord_
3131             my $function_ord_ = 'ord';
3132              
3133             # reverse to reverse or EUCJP::reverse
3134             my $function_reverse = 'reverse';
3135              
3136             # getc to getc or EUCJP::getc
3137             my $function_getc = 'getc';
3138              
3139             # P.1023 Appendix W.9 Multibyte Anchoring
3140             # of ISBN 1-56592-224-7 CJKV Information Processing
3141              
3142             my $anchor = '';
3143 329     329   5348 $anchor = q{${Eeucjp::anchor}};
  329     0   654  
  329         15723093  
3144              
3145             use vars qw($nest);
3146              
3147             # regexp of nested parens in qqXX
3148              
3149             # P.340 Matching Nested Constructs with Embedded Code
3150             # in Chapter 7: Perl
3151             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
3152              
3153             my $qq_paren = qr{(?{local $nest=0}) (?>(?:
3154             [^\x8E\x8F\xA1-\xFE\\()] |
3155             \( (?{$nest++}) |
3156             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3157             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3158             \\ [^\x8E\x8F\xA1-\xFEc] |
3159             \\c[\x40-\x5F] |
3160             \\ [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3161             [\x00-\xFF]
3162             }xms;
3163              
3164             my $qq_brace = qr{(?{local $nest=0}) (?>(?:
3165             [^\x8E\x8F\xA1-\xFE\\{}] |
3166             \{ (?{$nest++}) |
3167             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3168             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3169             \\ [^\x8E\x8F\xA1-\xFEc] |
3170             \\c[\x40-\x5F] |
3171             \\ [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3172             [\x00-\xFF]
3173             }xms;
3174              
3175             my $qq_bracket = qr{(?{local $nest=0}) (?>(?:
3176             [^\x8E\x8F\xA1-\xFE\\\[\]] |
3177             \[ (?{$nest++}) |
3178             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3179             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3180             \\ [^\x8E\x8F\xA1-\xFEc] |
3181             \\c[\x40-\x5F] |
3182             \\ [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3183             [\x00-\xFF]
3184             }xms;
3185              
3186             my $qq_angle = qr{(?{local $nest=0}) (?>(?:
3187             [^\x8E\x8F\xA1-\xFE\\<>] |
3188             \< (?{$nest++}) |
3189             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3190             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3191             \\ [^\x8E\x8F\xA1-\xFEc] |
3192             \\c[\x40-\x5F] |
3193             \\ [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3194             [\x00-\xFF]
3195             }xms;
3196              
3197             my $qq_scalar = qr{(?: \{ (?:$qq_brace)*? \} |
3198             (?: ::)? (?:
3199             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
3200             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
3201             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
3202             ))
3203             }xms;
3204              
3205             my $qq_variable = qr{(?: \{ (?:$qq_brace)*? \} |
3206             (?: ::)? (?:
3207             (?>[0-9]+) |
3208             [^\x8E\x8F\xA1-\xFEa-zA-Z_0-9\[\]] |
3209             ^[A-Z] |
3210             (?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
3211             (?>(?: \[ (?: \$\[ | \$\] | $qq_char )*? \] | \{ (?:$qq_brace)*? \} )*)
3212             (?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\#\* | [\@\%]? \[ (?: \$\[ | \$\] | $qq_char )*? \] | [\@\%\*]? \{ (?:$qq_brace)*? \} ) )*)
3213             ))
3214             }xms;
3215              
3216             my $qq_substr = qr{(?> Char::substr | EUCJP::substr | CORE::substr | substr ) (?>\s*) \( $qq_paren \)
3217             }xms;
3218              
3219             # regexp of nested parens in qXX
3220             my $q_paren = qr{(?{local $nest=0}) (?>(?:
3221             [^\x8E\x8F\xA1-\xFE()] |
3222             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3223             \( (?{$nest++}) |
3224             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3225             [\x00-\xFF]
3226             }xms;
3227              
3228             my $q_brace = qr{(?{local $nest=0}) (?>(?:
3229             [^\x8E\x8F\xA1-\xFE\{\}] |
3230             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3231             \{ (?{$nest++}) |
3232             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3233             [\x00-\xFF]
3234             }xms;
3235              
3236             my $q_bracket = qr{(?{local $nest=0}) (?>(?:
3237             [^\x8E\x8F\xA1-\xFE\[\]] |
3238             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3239             \[ (?{$nest++}) |
3240             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3241             [\x00-\xFF]
3242             }xms;
3243              
3244             my $q_angle = qr{(?{local $nest=0}) (?>(?:
3245             [^\x8E\x8F\xA1-\xFE<>] |
3246             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
3247             \< (?{$nest++}) |
3248             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3249             [\x00-\xFF]
3250             }xms;
3251              
3252             my $matched = '';
3253             my $s_matched = '';
3254             $matched = q{$Eeucjp::matched};
3255             $s_matched = q{ Eeucjp::s_matched();};
3256              
3257             my $tr_variable = ''; # variable of tr///
3258             my $sub_variable = ''; # variable of s///
3259             my $bind_operator = ''; # =~ or !~
3260              
3261             my @heredoc = (); # here document
3262             my @heredoc_delimiter = ();
3263             my $here_script = ''; # here script
3264              
3265             #
3266             # escape EUC-JP script
3267 0 50   329 0 0 #
3268             sub EUCJP::escape(;$) {
3269             local($_) = $_[0] if @_;
3270              
3271             # P.359 The Study Function
3272             # in Chapter 7: Perl
3273 329         1170 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
3274              
3275             study $_; # Yes, I studied study yesterday.
3276              
3277             # while all script
3278              
3279             # 6.14. Matching from Where the Last Pattern Left Off
3280             # in Chapter 6. Pattern Matching
3281             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
3282             # (and so on)
3283              
3284             # one member of Tag-team
3285             #
3286             # P.128 Start of match (or end of previous match): \G
3287             # P.130 Advanced Use of \G with Perl
3288             # in Chapter 3: Overview of Regular Expression Features and Flavors
3289             # P.255 Use leading anchors
3290             # P.256 Expose ^ and \G at the front expressions
3291             # in Chapter 6: Crafting an Efficient Expression
3292             # P.315 "Tag-team" matching with /gc
3293             # in Chapter 7: Perl
3294 329         824 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
3295 329         630  
3296 329         1417 my $e_script = '';
3297             while (not /\G \z/oxgc) { # member
3298             $e_script .= EUCJP::escape_token();
3299 131012         207283 }
3300              
3301             return $e_script;
3302             }
3303              
3304             #
3305             # escape EUC-JP token of script
3306             #
3307             sub EUCJP::escape_token {
3308              
3309 329     131012 0 4325 # \n output here document
3310              
3311             my $ignore_modules = join('|', qw(
3312             utf8
3313             bytes
3314             charnames
3315             I18N::Japanese
3316             I18N::Collate
3317             I18N::JExt
3318             File::DosGlob
3319             Wild
3320             Wildcard
3321             Japanese
3322             ));
3323              
3324             # another member of Tag-team
3325             #
3326             # P.315 "Tag-team" matching with /gc
3327             # in Chapter 7: Perl
3328 131012 100 100     167874 # 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          
3329 131012         6141730  
3330 22366 100       27093 if (/\G ( \n ) /oxgc) { # another member (and so on)
3331 22366         37782 my $heredoc = '';
3332             if (scalar(@heredoc_delimiter) >= 1) {
3333 191         240 $slash = 'm//';
3334 191         372  
3335             $heredoc = join '', @heredoc;
3336             @heredoc = ();
3337 191         637  
3338 191         346 # skip here document
3339             for my $heredoc_delimiter (@heredoc_delimiter) {
3340 199         1279 /\G .*? \n $heredoc_delimiter \n/xmsgc;
3341             }
3342 191         331 @heredoc_delimiter = ();
3343              
3344 191         255 $here_script = '';
3345             }
3346             return "\n" . $heredoc;
3347             }
3348 22366         65647  
3349             # ignore space, comment
3350             elsif (/\G ((?>\s+)|\#.*) /oxgc) { return $1; }
3351              
3352             # if (, elsif (, unless (, while (, until (, given (, and when (
3353              
3354             # given, when
3355              
3356             # P.225 The given Statement
3357             # in Chapter 15: Smart Matching and given-when
3358             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
3359              
3360             # P.133 The given Statement
3361             # in Chapter 4: Statements and Declarations
3362             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3363 31024         98051  
3364 2622         5013 elsif (/\G ( (?: if | elsif | unless | while | until | given | when ) (?>\s*) \( ) /oxgc) {
3365             $slash = 'm//';
3366             return $1;
3367             }
3368              
3369             # scalar variable ($scalar = ...) =~ tr///;
3370             # scalar variable ($scalar = ...) =~ s///;
3371              
3372             # state
3373              
3374             # P.68 Persistent, Private Variables
3375             # in Chapter 4: Subroutines
3376             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
3377              
3378             # P.160 Persistent Lexically Scoped Variables: state
3379             # in Chapter 4: Statements and Declarations
3380             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
3381              
3382             # (and so on)
3383 2622         9282  
3384             elsif (/\G ( \( (?>\s*) (?: local \b | my \b | our \b | state \b )? (?>\s*) \$ $qq_scalar ) /oxgc) {
3385 139 50       296 my $e_string = e_string($1);
    50          
3386 139         5450  
3387 0         0 if (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
3388 0         0 $tr_variable = $e_string . e_string($1);
3389 0         0 $bind_operator = $2;
3390             $slash = 'm//';
3391             return '';
3392 0         0 }
3393 0         0 elsif (/\G ( (?>\s*) = $qq_paren \) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
3394 0         0 $sub_variable = $e_string . e_string($1);
3395 0         0 $bind_operator = $2;
3396             $slash = 'm//';
3397             return '';
3398 0         0 }
3399 139         281 else {
3400             $slash = 'div';
3401             return $e_string;
3402             }
3403             }
3404              
3405 139         510 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeucjp::PREMATCH()
3406 4         34 elsif (/\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
3407             $slash = 'div';
3408             return q{Eeucjp::PREMATCH()};
3409             }
3410              
3411 4         15 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeucjp::MATCH()
3412 28         50 elsif (/\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
3413             $slash = 'div';
3414             return q{Eeucjp::MATCH()};
3415             }
3416              
3417 28         78 # $', ${'} --> $', ${'}
3418 1         2 elsif (/\G ( \$' | \$\{'\} ) /oxmsgc) {
3419             $slash = 'div';
3420             return $1;
3421             }
3422              
3423 1         3 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeucjp::POSTMATCH()
3424 3         7 elsif (/\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
3425             $slash = 'div';
3426             return q{Eeucjp::POSTMATCH()};
3427             }
3428              
3429             # scalar variable $scalar =~ tr///;
3430             # scalar variable $scalar =~ s///;
3431             # substr() =~ tr///;
3432 3         10 # substr() =~ s///;
3433             elsif (/\G ( \$ $qq_scalar | $qq_substr ) /oxgc) {
3434 2391 100       5317 my $scalar = e_string($1);
    100          
3435 2391         10115  
3436 9         15 if (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
3437 9         15 $tr_variable = $scalar;
3438 9         14 $bind_operator = $1;
3439             $slash = 'm//';
3440             return '';
3441 9         23 }
3442 119         234 elsif (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
3443 119         245 $sub_variable = $scalar;
3444 119         178 $bind_operator = $1;
3445             $slash = 'm//';
3446             return '';
3447 119         365 }
3448 2263         3251 else {
3449             $slash = 'div';
3450             return $scalar;
3451             }
3452             }
3453              
3454 2263         6047 # end of statement
3455             elsif (/\G ( [,;] ) /oxgc) {
3456             $slash = 'm//';
3457 8374         12442  
3458             # clear tr/// variable
3459             $tr_variable = '';
3460 8374         9966  
3461             # clear s/// variable
3462 8374         9294 $sub_variable = '';
3463              
3464 8374         9158 $bind_operator = '';
3465              
3466             return $1;
3467             }
3468              
3469 8374         27744 # bareword
3470             elsif (/\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
3471             return $1;
3472             }
3473              
3474 0         0 # $0 --> $0
3475 2         7 elsif (/\G ( \$ 0 ) /oxmsgc) {
3476             $slash = 'div';
3477             return $1;
3478 2         8 }
3479 0         0 elsif (/\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
3480             $slash = 'div';
3481             return $1;
3482             }
3483              
3484 0         0 # $$ --> $$
3485 1         2 elsif (/\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
3486             $slash = 'div';
3487             return $1;
3488             }
3489              
3490             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
3491 1         4 # $1, $2, $3 --> $1, $2, $3 otherwise
3492 129         211 elsif (/\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
3493             $slash = 'div';
3494             return e_capture($1);
3495 129         275 }
3496 0         0 elsif (/\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
3497             $slash = 'div';
3498             return e_capture($1);
3499             }
3500              
3501 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
3502 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
3503             $slash = 'div';
3504             return e_capture($1.'->'.$2);
3505             }
3506              
3507 0         0 # $$foo{ ... } --> $ $foo->{ ... }
3508 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
3509             $slash = 'div';
3510             return e_capture($1.'->'.$2);
3511             }
3512              
3513 0         0 # $$foo
3514 0         0 elsif (/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
3515             $slash = 'div';
3516             return e_capture($1);
3517             }
3518              
3519 0         0 # ${ foo }
3520 0         0 elsif (/\G \$ (?>\s*) \{ ( (?>\s*) (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* ) (?>\s*) ) \} /oxmsgc) {
3521             $slash = 'div';
3522             return '${' . $1 . '}';
3523             }
3524              
3525 0         0 # ${ ... }
3526 0         0 elsif (/\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
3527             $slash = 'div';
3528             return e_capture($1);
3529             }
3530              
3531             # variable or function
3532 0         0 # $ @ % & * $ #
3533 149         237 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) {
3534             $slash = 'div';
3535             return $1;
3536             }
3537             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
3538 149         733 # $ @ # \ ' " / ? ( ) [ ] < >
3539 91         175 elsif (/\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
3540             $slash = 'div';
3541             return $1;
3542             }
3543              
3544 91         447 # while ()
3545             elsif (/\G \b (while (?>\s*) \( (?>\s*) <[\$]?[A-Za-z_][A-Za-z_0-9]*> (?>\s*) \)) \b /oxgc) {
3546             return $1;
3547             }
3548              
3549             # while () --- glob
3550              
3551             # avoid "Error: Runtime exception" of perl version 5.005_03
3552 0         0  
3553             elsif (/\G \b while (?>\s*) \( (?>\s*) < ((?:[^\x8E\x8F\xA1-\xFE>\0\a\e\f\n\r\t]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])+?) > (?>\s*) \) \b /oxgc) {
3554             return 'while ($_ = Eeucjp::glob("' . $1 . '"))';
3555             }
3556              
3557 0         0 # while (glob)
3558             elsif (/\G \b while (?>\s*) \( (?>\s*) glob (?>\s*) \) /oxgc) {
3559             return 'while ($_ = Eeucjp::glob_)';
3560             }
3561              
3562 0         0 # while (glob(WILDCARD))
3563             elsif (/\G \b while (?>\s*) \( (?>\s*) glob \b /oxgc) {
3564             return 'while ($_ = Eeucjp::glob';
3565             }
3566 0         0  
  425         963  
3567             # doit if, doit unless, doit while, doit until, doit for, doit when
3568             elsif (/\G \b ( if | unless | while | until | for | when ) \b /oxgc) { $slash = 'm//'; return $1; }
3569 425         1644  
  19         43  
3570 19         116 # subroutines of package Eeucjp
  0         0  
3571 0         0 elsif (/\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $slash = 'm//'; return $1; }
  13         19  
3572 13         33 elsif (/\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  0         0  
3573 0         0 elsif (/\G \b EUCJP::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  114         169  
3574 114         314 elsif (/\G \b Char::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval Char::escape'; }
  2         4  
3575 2         7 elsif (/\G \b EUCJP::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval EUCJP::escape'; }
  2         5  
3576 2         5 elsif (/\G \b bytes::substr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'substr'; }
  2         4  
3577 2         6 elsif (/\G \b chop \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::chop'; }
  0         0  
3578 0         0 elsif (/\G \b bytes::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'index'; }
  2         4  
3579 2         6 elsif (/\G \b Char::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::index'; }
  2         5  
3580 2         5 elsif (/\G \b EUCJP::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'EUCJP::index'; }
  2         4  
3581 2         6 elsif (/\G \b index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::index'; }
  0         0  
3582 0         0 elsif (/\G \b bytes::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'rindex'; }
  2         4  
3583 2         12 elsif (/\G \b Char::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::rindex'; }
  2         5  
3584 2         5 elsif (/\G \b EUCJP::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'EUCJP::rindex'; }
  1         2  
3585 1         3 elsif (/\G \b rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::rindex'; }
  0         0  
3586 0         0 elsif (/\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeucjp::lc'; }
  0         0  
3587 0         0 elsif (/\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeucjp::lcfirst'; }
  0         0  
3588 0         0 elsif (/\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeucjp::uc'; }
  3         7  
3589             elsif (/\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeucjp::ucfirst'; }
3590             elsif (/\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeucjp::fc'; }
3591 3         7  
  0         0  
3592 0         0 # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
  0         0  
3593 0         0 elsif (/\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $slash = 'm//'; return '-s ' . e_qq('', $1,$3,$2); }
  0         0  
3594 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\#) ((?:$qq_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3595 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\() ((?:$qq_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3596 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\{) ((?:$qq_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3597 0         0 elsif (/\G -s (?>\s+) qq (?>\s*) (\[) ((?:$qq_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
  0         0  
3598             elsif (/\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_qq('qq',$1,$3,$2); }
3599 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  
3600 0         0  
  0         0  
3601 0         0 elsif (/\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $slash = 'm//'; return '-s ' . e_q ('', $1,$3,$2); }
  0         0  
3602 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\#) ((?:\\\#|\\\\|$q_char)+?) (\#) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3603 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\() ((?:\\\)|\\\\|$q_paren)+?) (\)) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3604 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\{) ((?:\\\}|\\\\|$q_brace)+?) (\}) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3605 0         0 elsif (/\G -s (?>\s+) q (?>\s*) (\[) ((?:\\\]|\\\\|$q_bracket)+?) (\]) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
  0         0  
3606             elsif (/\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
3607             elsif (/\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $slash = 'm//'; return '-s ' . e_q ('q', $1,$3,$2); }
3608 0         0  
  0         0  
3609 0         0 elsif (/\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)* ) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ) )*) /oxgc)
  0         0  
3610 0         0 { $slash = 'm//'; return "-s $1"; }
  0         0  
3611 0         0 elsif (/\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $slash = 'm//'; return "-s ($1)"; }
  0         0  
3612             elsif (/\G -s (?= (?>\s+) [a-z]+) /oxgc) { $slash = 'm//'; return '-s'; }
3613 0         0 elsif (/\G -s (?>\s+) ((?>\w+)) /oxgc) { $slash = 'm//'; return "-s $1"; }
  2         3  
3614 2         7  
  2         4  
3615 2         6 elsif (/\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'length'; }
  36         56  
3616 36         102 elsif (/\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'chr'; }
  2         5  
3617 2         7 elsif (/\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeucjp::chr'; }
  2         6  
3618 2         9 elsif (/\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return 'ord'; }
  0         0  
3619 0         0 elsif (/\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'div'; return $function_ord; }
  0         0  
3620 0         0 elsif (/\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eeucjp::glob'; }
  0         0  
3621 0         0 elsif (/\G \b lc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::lc_'; }
  0         0  
3622 0         0 elsif (/\G \b lcfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::lcfirst_'; }
  0         0  
3623 0         0 elsif (/\G \b uc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::uc_'; }
  0         0  
3624 0         0 elsif (/\G \b ucfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::ucfirst_'; }
  0         0  
3625             elsif (/\G \b fc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::fc_'; }
3626 0         0 elsif (/\G -s \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return '-s '; }
  0         0  
3627 0         0  
  0         0  
3628 0         0 elsif (/\G \b bytes::length \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'length'; }
  0         0  
3629 0         0 elsif (/\G \b bytes::chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'chr'; }
  0         0  
3630 0         0 elsif (/\G \b chr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::chr_'; }
  2         7  
3631 2         7 elsif (/\G \b bytes::ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return 'ord'; }
  0         0  
3632 0         0 elsif (/\G \b ord \b (?! (?>\s*) => ) /oxgc) { $slash = 'div'; return $function_ord_; }
  4         8  
3633 4         14 elsif (/\G \b glob \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eeucjp::glob_'; }
  8         16  
3634             elsif (/\G \b reverse \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_reverse; }
3635             elsif (/\G \b getc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return $function_getc; }
3636 8         28 # split
3637             elsif (/\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
3638 180         381 $slash = 'm//';
3639 180         264  
3640 180         635 my $e = '';
3641             while (/\G ( (?>\s+) | \( | \#.* ) /oxgc) {
3642             $e .= $1;
3643             }
3644 177 100       649  
  180 100       12102  
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    100          
    50          
    100          
    50          
    50          
    50          
3645             # end of split
3646             if (/\G (?= [,;\)\}\]] ) /oxgc) { return 'Eeucjp::split' . $e; }
3647 3         15  
3648             # split scalar value
3649             elsif (/\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { return 'Eeucjp::split' . $e . e_string($1); }
3650 1         5  
3651 0         0 # split literal space
3652 0         0 elsif (/\G \b qq (\#) [ ] (\#) /oxgc) { return 'Eeucjp::split' . $e . qq {qq$1 $2}; }
3653 0         0 elsif (/\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Eeucjp::split' . $e . qq{$1qq$2 $3}; }
3654 0         0 elsif (/\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Eeucjp::split' . $e . qq{$1qq$2 $3}; }
3655 0         0 elsif (/\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Eeucjp::split' . $e . qq{$1qq$2 $3}; }
3656 0         0 elsif (/\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Eeucjp::split' . $e . qq{$1qq$2 $3}; }
3657 0         0 elsif (/\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Eeucjp::split' . $e . qq{$1qq$2 $3}; }
3658 0         0 elsif (/\G \b q (\#) [ ] (\#) /oxgc) { return 'Eeucjp::split' . $e . qq {q$1 $2}; }
3659 0         0 elsif (/\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Eeucjp::split' . $e . qq {$1q$2 $3}; }
3660 0         0 elsif (/\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Eeucjp::split' . $e . qq {$1q$2 $3}; }
3661 0         0 elsif (/\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Eeucjp::split' . $e . qq {$1q$2 $3}; }
3662 0         0 elsif (/\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Eeucjp::split' . $e . qq {$1q$2 $3}; }
3663 13         59 elsif (/\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Eeucjp::split' . $e . qq {$1q$2 $3}; }
3664             elsif (/\G ' [ ] ' /oxgc) { return 'Eeucjp::split' . $e . qq {' '}; }
3665             elsif (/\G " [ ] " /oxgc) { return 'Eeucjp::split' . $e . qq {" "}; }
3666              
3667 2 0       11 # split qq//
  0         0  
3668             elsif (/\G \b (qq) \b /oxgc) {
3669 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq# # --> qr # #
3670 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
3671 0         0 while (not /\G \z/oxgc) {
3672 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3673 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq ( ) --> qr ( )
3674 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq { } --> qr { }
3675 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq [ ] --> qr [ ]
3676 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq < > --> qr < >
3677             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr','{','}',$2,''); } # qq | | --> qr { }
3678 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return e_split($e.'qr',$1,$3,$2,''); } # qq * * --> qr * *
3679             }
3680             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3681             }
3682             }
3683              
3684 0 50       0 # split qr//
  36         616  
3685             elsif (/\G \b (qr) \b /oxgc) {
3686 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # qr# #
3687 36 50       116 else {
  36 50       5541  
    50          
    50          
    50          
    100          
    50          
    50          
3688 0         0 while (not /\G \z/oxgc) {
3689 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3690 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr ( )
3691 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr { }
3692 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr [ ]
3693 12         45 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr < >
3694 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # qr ' '
3695             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # qr | | --> qr { }
3696 24         127 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # qr * *
3697             }
3698             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3699             }
3700             }
3701              
3702 0 0       0 # split q//
  0         0  
3703             elsif (/\G \b (q) \b /oxgc) {
3704 0         0 if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q# # --> qr # #
3705 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
3706 0         0 while (not /\G \z/oxgc) {
3707 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3708 0         0 elsif (/\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q ( ) --> qr ( )
3709 0         0 elsif (/\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q { } --> qr { }
3710 0         0 elsif (/\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q [ ] --> qr [ ]
3711 0         0 elsif (/\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q < > --> qr < >
3712             elsif (/\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr','{','}',$2,''); } # q | | --> qr { }
3713 0         0 elsif (/\G (\S) ((?:\\\\|\\\1| $q_char)*?) (\1) /oxgc) { return e_split_q($e.'qr',$1,$3,$2,''); } # q * * --> qr * *
3714             }
3715             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3716             }
3717             }
3718              
3719 0 50       0 # split m//
  48         1873  
3720             elsif (/\G \b (m) \b /oxgc) {
3721 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1,$3,$2,$4); } # m# # --> qr # #
3722 48 50       167 else {
  48 50       6381  
    50          
    50          
    50          
    100          
    50          
    50          
3723 0         0 while (not /\G \z/oxgc) {
3724 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3725 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m ( ) --> qr ( )
3726 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m { } --> qr { }
3727 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m [ ] --> qr [ ]
3728 12         76 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m < > --> qr < >
3729 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return e_split_q($e.'qr',$1, $3, $2,$4); } # m ' ' --> qr ' '
3730             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr','{','}',$2,$4); } # m | | --> qr { }
3731 36         180 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return e_split ($e.'qr',$1, $3, $2,$4); } # m * * --> qr * *
3732             }
3733             die __FILE__, ": Search pattern not terminated\n";
3734             }
3735             }
3736              
3737 0         0 # split ''
3738 0         0 elsif (/\G (\') /oxgc) {
3739 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
3740 0         0 while (not /\G \z/oxgc) {
3741 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
3742 0         0 elsif (/\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
3743             elsif (/\G \' /oxgc) { return e_split_q($e.q{ qr},"'","'",$q_string,''); } # ' ' --> qr ' '
3744 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
3745             }
3746             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3747             }
3748              
3749 0         0 # split ""
3750 0         0 elsif (/\G (\") /oxgc) {
3751 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
3752 0         0 while (not /\G \z/oxgc) {
3753 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
3754 0         0 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
3755             elsif (/\G \" /oxgc) { return e_split($e.q{ qr},'"','"',$qq_string,''); } # " " --> qr " "
3756 0         0 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
3757             }
3758             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3759             }
3760              
3761 0         0 # split //
3762 77         175 elsif (/\G (\/) /oxgc) {
3763 77 50       225 my $regexp = '';
  458 50       2393  
    100          
    50          
3764 0         0 while (not /\G \z/oxgc) {
3765 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
3766 77         382 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
3767             elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_split($e.q{ qr}, '/','/',$regexp,$1); } # / / --> qr / /
3768 381         877 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
3769             }
3770             die __FILE__, ": Search pattern not terminated\n";
3771             }
3772             }
3773              
3774             # tr/// or y///
3775              
3776             # about [cdsrbB]* (/B modifier)
3777             #
3778             # P.559 appendix C
3779             # of ISBN 4-89052-384-7 Programming perl
3780             # (Japanese title is: Perl puroguramingu)
3781 0         0  
3782             elsif (/\G \b ( tr | y ) \b /oxgc) {
3783             my $ope = $1;
3784 11 50       30  
3785 11         174 # $1 $2 $3 $4 $5 $6
3786 0         0 if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cdsrbB]*) /oxgc) { # tr# # #
3787             my @tr = ($tr_variable,$2);
3788             return e_tr(@tr,'',$4,$6);
3789 0         0 }
3790 11         20 else {
3791 11 50       31 my $e = '';
  11 50       915  
    50          
    50          
    50          
    50          
3792             while (not /\G \z/oxgc) {
3793 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3794 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
3795 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3796 0         0 while (not /\G \z/oxgc) {
3797 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3798 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) ( )
3799 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) { }
3800 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) [ ]
3801             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) < >
3802 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr ( ) * *
3803             }
3804             die __FILE__, ": Transliteration replacement not terminated\n";
3805 0         0 }
3806 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
3807 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3808 0         0 while (not /\G \z/oxgc) {
3809 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3810 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } ( )
3811 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } { }
3812 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } [ ]
3813             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } < >
3814 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr { } * *
3815             }
3816             die __FILE__, ": Transliteration replacement not terminated\n";
3817 0         0 }
3818 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
3819 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3820 0         0 while (not /\G \z/oxgc) {
3821 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3822 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] ( )
3823 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] { }
3824 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] [ ]
3825             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] < >
3826 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr [ ] * *
3827             }
3828             die __FILE__, ": Transliteration replacement not terminated\n";
3829 0         0 }
3830 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
3831 0 0       0 my @tr = ($tr_variable,$2);
  0 0       0  
    0          
    0          
    0          
    0          
3832 0         0 while (not /\G \z/oxgc) {
3833 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3834 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > ( )
3835 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > { }
3836 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > [ ]
3837             elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > < >
3838 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { return e_tr(@tr,$e,$2,$4); } # tr < > * *
3839             }
3840             die __FILE__, ": Transliteration replacement not terminated\n";
3841             }
3842 0         0 # $1 $2 $3 $4 $5 $6
3843 11         42 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cdsrbB]*) /oxgc) { # tr * * *
3844             my @tr = ($tr_variable,$2);
3845             return e_tr(@tr,'',$4,$6);
3846 11         33 }
3847             }
3848             die __FILE__, ": Transliteration pattern not terminated\n";
3849             }
3850             }
3851              
3852 0         0 # qq//
3853             elsif (/\G \b (qq) \b /oxgc) {
3854             my $ope = $1;
3855 4197 100       9554  
3856 4197         8793 # if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_qq($ope,$1,$3,$2); } # qq# #
3857 40         52 if (/\G (\#) /oxgc) { # qq# #
3858 40 100       98 my $qq_string = '';
  1948 50       5468  
    100          
    50          
3859 80         152 while (not /\G \z/oxgc) {
3860 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
3861 40         82 elsif (/\G (\\\#) /oxgc) { $qq_string .= $1; }
3862             elsif (/\G (\#) /oxgc) { return e_qq($ope,'#','#',$qq_string); }
3863 1828         3461 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3864             }
3865             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3866             }
3867 0         0  
3868 4157         5426 else {
3869 4157 50       9565 my $e = '';
  4157 50       16322  
    100          
    50          
    100          
    50          
3870             while (not /\G \z/oxgc) {
3871             if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3872              
3873 0         0 # elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq ( )
3874 0         0 elsif (/\G (\() /oxgc) { # qq ( )
3875 0         0 my $qq_string = '';
3876 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
3877 0         0 while (not /\G \z/oxgc) {
3878 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
3879             elsif (/\G (\\\)) /oxgc) { $qq_string .= $1; }
3880 0 0       0 elsif (/\G (\() /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
3881 0         0 elsif (/\G (\)) /oxgc) {
3882             if (--$nest == 0) { return $e . e_qq($ope,'(',')',$qq_string); }
3883 0         0 else { $qq_string .= $1; }
3884             }
3885 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3886             }
3887             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3888             }
3889              
3890 0         0 # elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq { }
3891 4099         5298 elsif (/\G (\{) /oxgc) { # qq { }
3892 4099         5652 my $qq_string = '';
3893 4099 100       8158 local $nest = 1;
  172339 50       560457  
    100          
    100          
    50          
3894 708         1369 while (not /\G \z/oxgc) {
3895 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  1384         1868  
3896             elsif (/\G (\\\}) /oxgc) { $qq_string .= $1; }
3897 1384 100       2312 elsif (/\G (\{) /oxgc) { $qq_string .= $1; $nest++; }
  5483         19368  
3898 4099         8130 elsif (/\G (\}) /oxgc) {
3899             if (--$nest == 0) { return $e . e_qq($ope,'{','}',$qq_string); }
3900 1384         2725 else { $qq_string .= $1; }
3901             }
3902 164764         337202 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3903             }
3904             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3905             }
3906              
3907 0         0 # elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq [ ]
3908 0         0 elsif (/\G (\[) /oxgc) { # qq [ ]
3909 0         0 my $qq_string = '';
3910 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
3911 0         0 while (not /\G \z/oxgc) {
3912 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
3913             elsif (/\G (\\\]) /oxgc) { $qq_string .= $1; }
3914 0 0       0 elsif (/\G (\[) /oxgc) { $qq_string .= $1; $nest++; }
  0         0  
3915 0         0 elsif (/\G (\]) /oxgc) {
3916             if (--$nest == 0) { return $e . e_qq($ope,'[',']',$qq_string); }
3917 0         0 else { $qq_string .= $1; }
3918             }
3919 0         0 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3920             }
3921             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3922             }
3923              
3924 0         0 # elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq < >
3925 38         59 elsif (/\G (\<) /oxgc) { # qq < >
3926 38         61 my $qq_string = '';
3927 38 100       502 local $nest = 1;
  1418 50       5934  
    50          
    100          
    50          
3928 22         50 while (not /\G \z/oxgc) {
3929 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
3930             elsif (/\G (\\\>) /oxgc) { $qq_string .= $1; }
3931 0 50       0 elsif (/\G (\<) /oxgc) { $qq_string .= $1; $nest++; }
  38         686  
3932 38         96 elsif (/\G (\>) /oxgc) {
3933             if (--$nest == 0) { return $e . e_qq($ope,'<','>',$qq_string); }
3934 0         0 else { $qq_string .= $1; }
3935             }
3936 1358         3271 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3937             }
3938             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3939             }
3940              
3941 0         0 # elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qq * *
3942 20         35 elsif (/\G (\S) /oxgc) { # qq * *
3943 20         21 my $delimiter = $1;
3944 20 50       39 my $qq_string = '';
  840 50       2287  
    100          
    50          
3945 0         0 while (not /\G \z/oxgc) {
3946 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
3947 20         36 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $qq_string .= $1; }
3948             elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_qq($ope,$delimiter,$delimiter,$qq_string); }
3949 820         1511 elsif (/\G ($qq_char) /oxgc) { $qq_string .= $1; }
3950             }
3951             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3952 0         0 }
3953             }
3954             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3955             }
3956             }
3957              
3958 0         0 # qr//
3959 60 50       140 elsif (/\G \b (qr) \b /oxgc) {
3960 60         470 my $ope = $1;
3961             if (/\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { # qr# # #
3962             return e_qr($ope,$1,$3,$2,$4);
3963 0         0 }
3964 60         91 else {
3965 60 50       140 my $e = '';
  60 50       4360  
    100          
    50          
    50          
    100          
    50          
    50          
3966 0         0 while (not /\G \z/oxgc) {
3967 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3968 1         6 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr ( )
3969 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr { }
3970 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr [ ]
3971 14         45 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr < >
3972 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # qr ' '
3973             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # qr | | --> qr { }
3974 45         139 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # qr * *
3975             }
3976             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
3977             }
3978             }
3979              
3980 0         0 # qw//
3981 34 50       92 elsif (/\G \b (qw) \b /oxgc) {
3982 34         96 my $ope = $1;
3983             if (/\G (\#) (.*?) (\#) /oxmsgc) { # qw# #
3984             return e_qw($ope,$1,$3,$2);
3985 0         0 }
3986 34         58 else {
3987 34 50       106 my $e = '';
  34 50       204  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
3988             while (not /\G \z/oxgc) {
3989 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
3990 34         114  
3991             elsif (/\G (\() ([^(]*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
3992 0         0 elsif (/\G (\() ((?:$q_paren)*?) (\)) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw ( )
3993 0         0  
3994             elsif (/\G (\{) ([^{]*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
3995 0         0 elsif (/\G (\{) ((?:$q_brace)*?) (\}) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw { }
3996 0         0  
3997             elsif (/\G (\[) ([^[]*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
3998 0         0 elsif (/\G (\[) ((?:$q_bracket)*?) (\]) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw [ ]
3999 0         0  
4000             elsif (/\G (\<) ([^<]*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
4001 0         0 elsif (/\G (\<) ((?:$q_angle)*?) (\>) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw < >
4002 0         0  
4003             elsif (/\G ([\x21-\x3F]) (.*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
4004 0         0 elsif (/\G (\S) ((?:$q_char)*?) (\1) /oxmsgc) { return $e . e_qw($ope,$1,$3,$2); } # qw * *
4005             }
4006             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4007             }
4008             }
4009              
4010 0         0 # qx//
4011 2 50       4 elsif (/\G \b (qx) \b /oxgc) {
4012 2         54 my $ope = $1;
4013             if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
4014             return e_qq($ope,$1,$3,$2);
4015 0         0 }
4016 2         12 else {
4017 2 50       7 my $e = '';
  2 50       128  
    50          
    0          
    0          
    0          
    0          
4018 0         0 while (not /\G \z/oxgc) {
4019 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4020 2         8 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx ( )
4021 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx { }
4022 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx [ ]
4023 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx < >
4024             elsif (/\G (\') ((?:$qq_char)*?) (\') /oxgc) { return $e . e_q ($ope,$1,$3,$2); } # qx ' '
4025 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { return $e . e_qq($ope,$1,$3,$2); } # qx * *
4026             }
4027             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4028             }
4029             }
4030              
4031 0         0 # q//
4032             elsif (/\G \b (q) \b /oxgc) {
4033             my $ope = $1;
4034              
4035             # if (/\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { return e_q($ope,$1,$3,$2); } # q# #
4036              
4037             # avoid "Error: Runtime exception" of perl version 5.005_03
4038 550 50       1477 # (and so on)
4039 550         1621  
4040 0         0 if (/\G (\#) /oxgc) { # q# #
4041 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
4042 0         0 while (not /\G \z/oxgc) {
4043 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4044 0         0 elsif (/\G (\\\#) /oxgc) { $q_string .= $1; }
4045             elsif (/\G (\#) /oxgc) { return e_q($ope,'#','#',$q_string); }
4046 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4047             }
4048             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4049             }
4050 0         0  
4051 550         964 else {
4052 550 50       1764 my $e = '';
  550 50       3164  
    100          
    50          
    100          
    50          
4053             while (not /\G \z/oxgc) {
4054             if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4055              
4056 0         0 # elsif (/\G (\() ((?:\\\)|\\\\|$q_paren)*?) (\)) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q ( )
4057 0         0 elsif (/\G (\() /oxgc) { # q ( )
4058 0         0 my $q_string = '';
4059 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
    0          
4060 0         0 while (not /\G \z/oxgc) {
4061 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4062 0         0 elsif (/\G (\\\)) /oxgc) { $q_string .= $1; }
  0         0  
4063             elsif (/\G (\\\() /oxgc) { $q_string .= $1; }
4064 0 0       0 elsif (/\G (\() /oxgc) { $q_string .= $1; $nest++; }
  0         0  
4065 0         0 elsif (/\G (\)) /oxgc) {
4066             if (--$nest == 0) { return $e . e_q($ope,'(',')',$q_string); }
4067 0         0 else { $q_string .= $1; }
4068             }
4069 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4070             }
4071             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4072             }
4073              
4074 0         0 # elsif (/\G (\{) ((?:\\\}|\\\\|$q_brace)*?) (\}) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q { }
4075 544         1051 elsif (/\G (\{) /oxgc) { # q { }
4076 544         1232 my $q_string = '';
4077 544 50       1694 local $nest = 1;
  8103 50       37964  
    50          
    100          
    100          
    50          
4078 0         0 while (not /\G \z/oxgc) {
4079 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4080 0         0 elsif (/\G (\\\}) /oxgc) { $q_string .= $1; }
  114         207  
4081             elsif (/\G (\\\{) /oxgc) { $q_string .= $1; }
4082 114 100       212 elsif (/\G (\{) /oxgc) { $q_string .= $1; $nest++; }
  658         1397  
4083 544         2126 elsif (/\G (\}) /oxgc) {
4084             if (--$nest == 0) { return $e . e_q($ope,'{','}',$q_string); }
4085 114         231 else { $q_string .= $1; }
4086             }
4087 7331         28551 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4088             }
4089             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4090             }
4091              
4092 0         0 # elsif (/\G (\[) ((?:\\\]|\\\\|$q_bracket)*?) (\]) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q [ ]
4093 0         0 elsif (/\G (\[) /oxgc) { # q [ ]
4094 0         0 my $q_string = '';
4095 0 0       0 local $nest = 1;
  0 0       0  
    0          
    0          
    0          
    0          
4096 0         0 while (not /\G \z/oxgc) {
4097 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4098 0         0 elsif (/\G (\\\]) /oxgc) { $q_string .= $1; }
  0         0  
4099             elsif (/\G (\\\[) /oxgc) { $q_string .= $1; }
4100 0 0       0 elsif (/\G (\[) /oxgc) { $q_string .= $1; $nest++; }
  0         0  
4101 0         0 elsif (/\G (\]) /oxgc) {
4102             if (--$nest == 0) { return $e . e_q($ope,'[',']',$q_string); }
4103 0         0 else { $q_string .= $1; }
4104             }
4105 0         0 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4106             }
4107             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4108             }
4109              
4110 0         0 # elsif (/\G (\<) ((?:\\\>|\\\\|$q_angle)*?) (\>) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q < >
4111 5         19 elsif (/\G (\<) /oxgc) { # q < >
4112 5         11 my $q_string = '';
4113 5 50       19 local $nest = 1;
  82 50       424  
    50          
    50          
    100          
    50          
4114 0         0 while (not /\G \z/oxgc) {
4115 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4116 0         0 elsif (/\G (\\\>) /oxgc) { $q_string .= $1; }
  0         0  
4117             elsif (/\G (\\\<) /oxgc) { $q_string .= $1; }
4118 0 50       0 elsif (/\G (\<) /oxgc) { $q_string .= $1; $nest++; }
  5         14  
4119 5         13 elsif (/\G (\>) /oxgc) {
4120             if (--$nest == 0) { return $e . e_q($ope,'<','>',$q_string); }
4121 0         0 else { $q_string .= $1; }
4122             }
4123 77         152 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4124             }
4125             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4126             }
4127              
4128 0         0 # elsif (/\G (\S) ((?:\\\1|\\\\|$q_char)*?) (\1) /oxgc) { return $e . e_q($ope,$1,$3,$2); } # q * *
4129 1         2 elsif (/\G (\S) /oxgc) { # q * *
4130 1         2 my $delimiter = $1;
4131 1 50       4 my $q_string = '';
  14 50       75  
    100          
    50          
4132 0         0 while (not /\G \z/oxgc) {
4133 0         0 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4134 1         3 elsif (/\G (\\\Q$delimiter\E) /oxgc) { $q_string .= $1; }
4135             elsif (/\G (\Q$delimiter\E) /oxgc) { return $e . e_q($ope,$delimiter,$delimiter,$q_string); }
4136 13         27 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4137             }
4138             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4139 0         0 }
4140             }
4141             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4142             }
4143             }
4144              
4145 0         0 # m//
4146 305 50       701 elsif (/\G \b (m) \b /oxgc) {
4147 305         2312 my $ope = $1;
4148             if (/\G (\#) ((?:$qq_char)*?) (\#) ([cgimosxpadlunbB]*) /oxgc) { # m# #
4149             return e_qr($ope,$1,$3,$2,$4);
4150 0         0 }
4151 305         447 else {
4152 305 50       892 my $e = '';
  305 50       22794  
    50          
    50          
    50          
    100          
    100          
    50          
    50          
4153 0         0 while (not /\G \z/oxgc) {
4154 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4155 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ( )
4156 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m { }
4157 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m [ ]
4158 30         96 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m < >
4159 25         77 elsif (/\G (\?) ((?:$qq_char)*?) (\?) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m ? ?
4160 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # m ' '
4161             elsif (/\G ([*\-:\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,'{','}',$2,$4); } # m | | --> m { }
4162 250         885 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m * *
4163             }
4164             die __FILE__, ": Search pattern not terminated\n";
4165             }
4166             }
4167              
4168             # s///
4169              
4170             # about [cegimosxpradlunbB]* (/cg modifier)
4171             #
4172             # P.67 Pattern-Matching Operators
4173             # of ISBN 0-596-00241-6 Perl in a Nutshell, Second Edition.
4174 0         0  
4175             elsif (/\G \b (s) \b /oxgc) {
4176             my $ope = $1;
4177 156 100       400  
4178 156         4297 # $1 $2 $3 $4 $5 $6
4179             if (/\G (\#) ((?:$qq_char)*?) (\#) ((?:$qq_char)*?) (\#) ([cegimosxpradlunbB]*) /oxgc) { # s# # #
4180             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
4181 1         5 }
4182 155         312 else {
4183 155 50       559 my $e = '';
  155 50       32099  
    50          
    50          
    50          
    100          
    100          
    50          
    50          
4184             while (not /\G \z/oxgc) {
4185 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4186 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) /oxgc) {
4187 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
4188             while (not /\G \z/oxgc) {
4189 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4190 0         0 # $1 $2 $3 $4
4191 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4192 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4193 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4194 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([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 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4198             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4199 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4200             }
4201             die __FILE__, ": Substitution replacement not terminated\n";
4202 0         0 }
4203 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) {
4204 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
4205             while (not /\G \z/oxgc) {
4206 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4207 0         0 # $1 $2 $3 $4
4208 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4209 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4210 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4211 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([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 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4215             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4216 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4217             }
4218             die __FILE__, ": Substitution replacement not terminated\n";
4219 0         0 }
4220 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) {
4221 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
4222             while (not /\G \z/oxgc) {
4223 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4224 0         0 # $1 $2 $3 $4
4225 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4226 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4227 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4228 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4229 0         0 elsif (/\G (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4230             elsif (/\G (\$) ((?:$qq_char)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4231 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4232             }
4233             die __FILE__, ": Substitution replacement not terminated\n";
4234 0         0 }
4235 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) {
4236 0 0       0 my @s = ($1,$2,$3);
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
4237             while (not /\G \z/oxgc) {
4238 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4239 0         0 # $1 $2 $3 $4
4240 0         0 elsif (/\G (\() ((?:$qq_paren)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4241 0         0 elsif (/\G (\{) ((?:$qq_brace)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4242 0         0 elsif (/\G (\[) ((?:$qq_bracket)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4243 0         0 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([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 0         0 elsif (/\G (\:) ((?:$qq_char)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4247             elsif (/\G (\@) ((?:$qq_char)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4248 0         0 elsif (/\G (\S) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) { return e_sub($sub_variable,@s,$1,$2,$3,$4); }
4249             }
4250             die __FILE__, ": Substitution replacement not terminated\n";
4251             }
4252 0         0 # $1 $2 $3 $4 $5 $6
4253             elsif (/\G (\') ((?:$qq_char)*?) (\') ((?:$qq_char)*?) (\') ([cegimosxpradlunbB]*) /oxgc) {
4254             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
4255             }
4256 34         102 # $1 $2 $3 $4 $5 $6
4257             elsif (/\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
4258             return e_sub($sub_variable,'{',$2,'}','{',$4,'}',$6); # s | | | --> s { } { }
4259             }
4260 2         12 # $1 $2 $3 $4 $5 $6
4261             elsif (/\G (\$) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
4262             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
4263             }
4264 0         0 # $1 $2 $3 $4 $5 $6
4265             elsif (/\G (\S) ((?:$qq_char)*?) (\1) ((?:$qq_char)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
4266             return e_sub($sub_variable,$1,$2,$3,$3,$4,$5,$6);
4267 119         559 }
4268             }
4269             die __FILE__, ": Substitution pattern not terminated\n";
4270             }
4271             }
4272 0         0  
4273 0         0 # require ignore module
4274 0         0 elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# require$1$2"; }
4275             elsif (/\G \b require ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x8E\x8F\xA1-\xFE#]) /oxmsgc) { return "# require$1\n$2"; }
4276             elsif (/\G \b require ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# require$1"; }
4277 0         0  
4278 66         546 # use strict; --> use strict; no strict qw(refs);
4279 0         0 elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "use$1 no strict qw(refs);$2"; }
4280             elsif (/\G \b use ((?>\s+) strict .*? ;) ([ \t]* [^\x8E\x8F\xA1-\xFE#]) /oxmsgc) { return "use$1 no strict qw(refs);\n$2"; }
4281             elsif (/\G \b use ((?>\s+) strict) \b /oxmsgc) { return "use$1; no strict qw(refs)"; }
4282              
4283 0 50 33     0 # use 5.12.0; --> use 5.12.0; no strict qw(refs);
      33        
4284 3         39 elsif (/\G \b use (?>\s+) ((?>([1-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
4285             if (($2 >= 6) or (($2 == 5) and ($3 ge '012'))) {
4286             return "use $1; no strict qw(refs);";
4287 0         0 }
4288             else {
4289             return "use $1;";
4290             }
4291 3 0 0     17 }
      0        
4292 0         0 elsif (/\G \b use (?>\s+) ((?>v([0-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
4293             if (($2 >= 6) or (($2 == 5) and ($3 >= 12))) {
4294             return "use $1; no strict qw(refs);";
4295 0         0 }
4296             else {
4297             return "use $1;";
4298             }
4299             }
4300 0         0  
4301 2         14 # ignore use module
4302 0         0 elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# use$1$2"; }
4303             elsif (/\G \b use ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x8E\x8F\xA1-\xFE#]) /oxmsgc) { return "# use$1\n$2"; }
4304             elsif (/\G \b use ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# use$1"; }
4305 0         0  
4306 0         0 # ignore no module
4307 0         0 elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [#\n]) /oxmsgc) { return "# no$1$2"; }
4308             elsif (/\G \b no ((?>\s+) (?:$ignore_modules) .*? ;) ([ \t]* [^\x8E\x8F\xA1-\xFE#]) /oxmsgc) { return "# no$1\n$2"; }
4309             elsif (/\G \b no ((?>\s+) (?:$ignore_modules)) \b /oxmsgc) { return "# no$1"; }
4310 0         0  
4311             # use else
4312             elsif (/\G \b use \b /oxmsgc) { return "use"; }
4313 0         0  
4314             # use else
4315             elsif (/\G \b no \b /oxmsgc) { return "no"; }
4316              
4317 2         8 # ''
4318 1832         3593 elsif (/\G (?
4319 1832 100       4972 my $q_string = '';
  11101 100       38331  
    100          
    50          
4320 4         10 while (not /\G \z/oxgc) {
4321 48         91 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4322 1832         4185 elsif (/\G (\\\') /oxgc) { $q_string .= $1; }
4323             elsif (/\G \' /oxgc) { return e_q('', "'","'",$q_string); }
4324 9217         20425 elsif (/\G ($q_char) /oxgc) { $q_string .= $1; }
4325             }
4326             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4327             }
4328              
4329 0         0 # ""
4330 2657         5495 elsif (/\G (\") /oxgc) {
4331 2657 100       6547 my $qq_string = '';
  49993 100       153056  
    100          
    50          
4332 109         234 while (not /\G \z/oxgc) {
4333 12         22 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
4334 2657         6361 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; }
4335             elsif (/\G \" /oxgc) { return e_qq('', '"','"',$qq_string); }
4336 47215         95219 elsif (/\G ($q_char) /oxgc) { $qq_string .= $1; }
4337             }
4338             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4339             }
4340              
4341 0         0 # ``
4342 1         3 elsif (/\G (\`) /oxgc) {
4343 1 50       5 my $qx_string = '';
  19 50       86  
    100          
    50          
4344 0         0 while (not /\G \z/oxgc) {
4345 0         0 if (/\G (\\\\) /oxgc) { $qx_string .= $1; }
4346 1         4 elsif (/\G (\\\`) /oxgc) { $qx_string .= $1; }
4347             elsif (/\G \` /oxgc) { return e_qq('', '`','`',$qx_string); }
4348 18         35 elsif (/\G ($q_char) /oxgc) { $qx_string .= $1; }
4349             }
4350             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4351             }
4352              
4353 0         0 # // --- not divide operator (num / num), not defined-or
4354 1070         2328 elsif (($slash eq 'm//') and /\G (\/) /oxgc) {
4355 1070 100       3079 my $regexp = '';
  10084 50       33920  
    100          
    50          
4356 1         2 while (not /\G \z/oxgc) {
4357 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
4358 1070         2944 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; }
4359             elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_qr('', '/','/',$regexp,$1); }
4360 9013         18610 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
4361             }
4362             die __FILE__, ": Search pattern not terminated\n";
4363             }
4364              
4365 0         0 # ?? --- not conditional operator (condition ? then : else)
4366 30         54 elsif (($slash eq 'm//') and /\G (\?) /oxgc) {
4367 30 50       71 my $regexp = '';
  122 50       526  
    100          
    50          
4368 0         0 while (not /\G \z/oxgc) {
4369 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
4370 30         69 elsif (/\G (\\\?) /oxgc) { $regexp .= $1; }
4371             elsif (/\G \? ([cgimosxpadlunbB]*) /oxgc) { return e_qr('m','?','?',$regexp,$1); }
4372 92         208 elsif (/\G ($q_char) /oxgc) { $regexp .= $1; }
4373             }
4374             die __FILE__, ": Search pattern not terminated\n";
4375             }
4376 0         0  
  0         0  
4377             # <<>> (a safer ARGV)
4378             elsif (/\G ( <<>> ) /oxgc) { $slash = 'm//'; return $1; }
4379 0         0  
  0         0  
4380             # << (bit shift) --- not here document
4381             elsif (/\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) { $slash = 'm//'; return $1; }
4382              
4383 0         0 # <<~'HEREDOC'
4384 6         10 elsif (/\G ( <<~ [\t ]* '([a-zA-Z_0-9]*)' ) /oxgc) {
4385 6         12 $slash = 'm//';
4386             my $here_quote = $1;
4387             my $delimiter = $2;
4388 6 50       8  
4389 6         12 # get here document
4390 6         28 if ($here_script eq '') {
4391             $here_script = CORE::substr $_, pos $_;
4392 6 50       29 $here_script =~ s/.*?\n//oxm;
4393 6         51 }
4394 6         13 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4395 6         13 my $heredoc = $1;
4396 6         46 my $indent = $2;
4397 6         16 $heredoc =~ s{^$indent}{}msg; # no /ox
4398             push @heredoc, $heredoc . qq{\n$delimiter\n};
4399             push @heredoc_delimiter, qq{\\s*$delimiter};
4400 6         13 }
4401             else {
4402 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4403             }
4404             return qq{<<'$delimiter'};
4405             }
4406              
4407             # <<~\HEREDOC
4408              
4409             # P.66 2.6.6. "Here" Documents
4410             # in Chapter 2: Bits and Pieces
4411             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4412              
4413             # P.73 "Here" Documents
4414             # in Chapter 2: Bits and Pieces
4415             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4416 6         22  
4417 3         6 elsif (/\G ( <<~ \\([a-zA-Z_0-9]+) ) /oxgc) {
4418 3         6 $slash = 'm//';
4419             my $here_quote = $1;
4420             my $delimiter = $2;
4421 3 50       6  
4422 3         5 # get here document
4423 3         28 if ($here_script eq '') {
4424             $here_script = CORE::substr $_, pos $_;
4425 3 50       16 $here_script =~ s/.*?\n//oxm;
4426 3         41 }
4427 3         8 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4428 3         5 my $heredoc = $1;
4429 3         36 my $indent = $2;
4430 3         10 $heredoc =~ s{^$indent}{}msg; # no /ox
4431             push @heredoc, $heredoc . qq{\n$delimiter\n};
4432             push @heredoc_delimiter, qq{\\s*$delimiter};
4433 3         6 }
4434             else {
4435 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4436             }
4437             return qq{<<\\$delimiter};
4438             }
4439              
4440 3         12 # <<~"HEREDOC"
4441 6         13 elsif (/\G ( <<~ [\t ]* "([a-zA-Z_0-9]*)" ) /oxgc) {
4442 6         9 $slash = 'm//';
4443             my $here_quote = $1;
4444             my $delimiter = $2;
4445 6 50       9  
4446 6         13 # get here document
4447 6         27 if ($here_script eq '') {
4448             $here_script = CORE::substr $_, pos $_;
4449 6 50       36 $here_script =~ s/.*?\n//oxm;
4450 6         59 }
4451 6         14 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4452 6         8 my $heredoc = $1;
4453 6         45 my $indent = $2;
4454 6         15 $heredoc =~ s{^$indent}{}msg; # no /ox
4455             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4456             push @heredoc_delimiter, qq{\\s*$delimiter};
4457 6         13 }
4458             else {
4459 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4460             }
4461             return qq{<<"$delimiter"};
4462             }
4463              
4464 6         22 # <<~HEREDOC
4465 3         6 elsif (/\G ( <<~ ([a-zA-Z_0-9]+) ) /oxgc) {
4466 3         7 $slash = 'm//';
4467             my $here_quote = $1;
4468             my $delimiter = $2;
4469 3 50       5  
4470 3         8 # get here document
4471 3         10 if ($here_script eq '') {
4472             $here_script = CORE::substr $_, pos $_;
4473 3 50       24 $here_script =~ s/.*?\n//oxm;
4474 3         38 }
4475 3         7 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4476 3         4 my $heredoc = $1;
4477 3         35 my $indent = $2;
4478 3         15 $heredoc =~ s{^$indent}{}msg; # no /ox
4479             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4480             push @heredoc_delimiter, qq{\\s*$delimiter};
4481 3         8 }
4482             else {
4483 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4484             }
4485             return qq{<<$delimiter};
4486             }
4487              
4488 3         11 # <<~`HEREDOC`
4489 6         12 elsif (/\G ( <<~ [\t ]* `([a-zA-Z_0-9]*)` ) /oxgc) {
4490 6         11 $slash = 'm//';
4491             my $here_quote = $1;
4492             my $delimiter = $2;
4493 6 50       9  
4494 6         17 # get here document
4495 6         20 if ($here_script eq '') {
4496             $here_script = CORE::substr $_, pos $_;
4497 6 50       27 $here_script =~ s/.*?\n//oxm;
4498 6         53 }
4499 6         13 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4500 6         8 my $heredoc = $1;
4501 6         54 my $indent = $2;
4502 6         20 $heredoc =~ s{^$indent}{}msg; # no /ox
4503             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
4504             push @heredoc_delimiter, qq{\\s*$delimiter};
4505 6         14 }
4506             else {
4507 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4508             }
4509             return qq{<<`$delimiter`};
4510             }
4511              
4512 6         22 # <<'HEREDOC'
4513 80         157 elsif (/\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
4514 80         157 $slash = 'm//';
4515             my $here_quote = $1;
4516             my $delimiter = $2;
4517 80 100       132  
4518 80         147 # get here document
4519 77         332 if ($here_script eq '') {
4520             $here_script = CORE::substr $_, pos $_;
4521 77 50       403 $here_script =~ s/.*?\n//oxm;
4522 80         611 }
4523 80         252 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4524             push @heredoc, $1 . qq{\n$delimiter\n};
4525             push @heredoc_delimiter, $delimiter;
4526 80         126 }
4527             else {
4528 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4529             }
4530             return $here_quote;
4531             }
4532              
4533             # <<\HEREDOC
4534              
4535             # P.66 2.6.6. "Here" Documents
4536             # in Chapter 2: Bits and Pieces
4537             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4538              
4539             # P.73 "Here" Documents
4540             # in Chapter 2: Bits and Pieces
4541             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4542 80         291  
4543 2         6 elsif (/\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
4544 2         4 $slash = 'm//';
4545             my $here_quote = $1;
4546             my $delimiter = $2;
4547 2 100       4  
4548 2         5 # get here document
4549 1         6 if ($here_script eq '') {
4550             $here_script = CORE::substr $_, pos $_;
4551 1 50       14 $here_script =~ s/.*?\n//oxm;
4552 2         27 }
4553 2         9 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4554             push @heredoc, $1 . qq{\n$delimiter\n};
4555             push @heredoc_delimiter, $delimiter;
4556 2         3 }
4557             else {
4558 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4559             }
4560             return $here_quote;
4561             }
4562              
4563 2         8 # <<"HEREDOC"
4564 39         89 elsif (/\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
4565 39         87 $slash = 'm//';
4566             my $here_quote = $1;
4567             my $delimiter = $2;
4568 39 100       69  
4569 39         96 # get here document
4570 38         219 if ($here_script eq '') {
4571             $here_script = CORE::substr $_, pos $_;
4572 38 50       224 $here_script =~ s/.*?\n//oxm;
4573 39         514 }
4574 39         128 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4575             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4576             push @heredoc_delimiter, $delimiter;
4577 39         83 }
4578             else {
4579 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4580             }
4581             return $here_quote;
4582             }
4583              
4584 39         173 # <
4585 54         130 elsif (/\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
4586 54         109 $slash = 'm//';
4587             my $here_quote = $1;
4588             my $delimiter = $2;
4589 54 100       107  
4590 54         330 # get here document
4591 51         361 if ($here_script eq '') {
4592             $here_script = CORE::substr $_, pos $_;
4593 51 50       394 $here_script =~ s/.*?\n//oxm;
4594 54         861 }
4595 54         194 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4596             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4597             push @heredoc_delimiter, $delimiter;
4598 54         544 }
4599             else {
4600 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4601             }
4602             return $here_quote;
4603             }
4604              
4605 54         246 # <<`HEREDOC`
4606 0         0 elsif (/\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
4607 0         0 $slash = 'm//';
4608             my $here_quote = $1;
4609             my $delimiter = $2;
4610 0 0       0  
4611 0         0 # get here document
4612 0         0 if ($here_script eq '') {
4613             $here_script = CORE::substr $_, pos $_;
4614 0 0       0 $here_script =~ s/.*?\n//oxm;
4615 0         0 }
4616 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4617             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
4618             push @heredoc_delimiter, $delimiter;
4619 0         0 }
4620             else {
4621 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
4622             }
4623             return $here_quote;
4624             }
4625              
4626 0         0 # <<= <=> <= < operator
4627             elsif (/\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) {
4628             return $1;
4629             }
4630              
4631 13         65 #
4632             elsif (/\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) {
4633             return $1;
4634             }
4635              
4636             # --- glob
4637              
4638             # avoid "Error: Runtime exception" of perl version 5.005_03
4639 0         0  
4640             elsif (/\G < ((?:[^\x8E\x8F\xA1-\xFE>\0\a\e\f\n\r\t]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF])+?) > /oxgc) {
4641             return 'Eeucjp::glob("' . $1 . '")';
4642             }
4643 0         0  
4644             # __DATA__
4645             elsif (/\G ^ ( __DATA__ \n .*) \z /oxmsgc) { return $1; }
4646 0         0  
4647             # __END__
4648             elsif (/\G ^ ( __END__ \n .*) \z /oxmsgc) { return $1; }
4649              
4650             # \cD Control-D
4651              
4652             # P.68 2.6.8. Other Literal Tokens
4653             # in Chapter 2: Bits and Pieces
4654             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
4655              
4656             # P.76 Other Literal Tokens
4657             # in Chapter 2: Bits and Pieces
4658 329         2326 # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4659              
4660             elsif (/\G ( \cD .*) \z /oxmsgc) { return $1; }
4661 0         0  
4662             # \cZ Control-Z
4663             elsif (/\G ( \cZ .*) \z /oxmsgc) { return $1; }
4664              
4665             # any operator before div
4666             elsif (/\G (
4667             -- | \+\+ |
4668 0         0 [\)\}\]]
  9408         20245  
4669              
4670             ) /oxgc) { $slash = 'div'; return $1; }
4671              
4672             # yada-yada or triple-dot operator
4673             elsif (/\G (
4674 9408         41723 \.\.\.
  7         15  
4675              
4676             ) /oxgc) { $slash = 'm//'; return q{die('Unimplemented')}; }
4677              
4678             # any operator before m//
4679              
4680             # //, //= (defined-or)
4681              
4682             # P.164 Logical Operators
4683             # in Chapter 10: More Control Structures
4684             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
4685              
4686             # P.119 C-Style Logical (Short-Circuit) Operators
4687             # in Chapter 3: Unary and Binary Operators
4688             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4689              
4690             # (and so on)
4691              
4692             # ~~
4693              
4694             # P.221 The Smart Match Operator
4695             # in Chapter 15: Smart Matching and given-when
4696             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
4697              
4698             # P.112 Smartmatch Operator
4699             # in Chapter 3: Unary and Binary Operators
4700             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
4701              
4702             # (and so on)
4703              
4704             elsif (/\G ((?>
4705              
4706             !~~ | !~ | != | ! |
4707             %= | % |
4708             &&= | && | &= | &\.= | &\. | & |
4709             -= | -> | - |
4710             :(?>\s*)= |
4711             : |
4712             <<>> |
4713             <<= | <=> | <= | < |
4714             == | => | =~ | = |
4715             >>= | >> | >= | > |
4716             \*\*= | \*\* | \*= | \* |
4717             \+= | \+ |
4718             \.\. | \.= | \. |
4719             \/\/= | \/\/ |
4720             \/= | \/ |
4721             \? |
4722             \\ |
4723             \^= | \^\.= | \^\. | \^ |
4724             \b x= |
4725             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
4726             ~~ | ~\. | ~ |
4727             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
4728             \b(?: print )\b |
4729              
4730 7         33 [,;\(\{\[]
  16200         32057  
4731              
4732             )) /oxgc) { $slash = 'm//'; return $1; }
4733 16200         72413  
  25725         50294  
4734             # other any character
4735             elsif (/\G ($q_char) /oxgc) { $slash = 'div'; return $1; }
4736              
4737 25725         116264 # system error
4738             else {
4739             die __FILE__, ": Oops, this shouldn't happen!\n";
4740             }
4741             }
4742              
4743 0     2572 0 0 # escape EUC-JP string
4744 2572         6141 sub e_string {
4745             my($string) = @_;
4746 2572         3761 my $e_string = '';
4747              
4748             local $slash = 'm//';
4749              
4750             # P.1024 Appendix W.10 Multibyte Processing
4751             # of ISBN 1-56592-224-7 CJKV Information Processing
4752 2572         3826 # (and so on)
4753              
4754             my @char = $string =~ / \G (?>[^\x8E\x8F\xA1-\xFE\\]|\\$q_char|$q_char) /oxmsg;
4755 2572 100 66     26403  
4756 2572 50       11304 # without { ... }
4757 2534         5548 if (not (grep(/\A \{ \z/xms, @char) and grep(/\A \} \z/xms, @char))) {
4758             if ($string !~ /<
4759             return $string;
4760             }
4761             }
4762 2534         6164  
4763 38 50       102 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          
4764             while ($string !~ /\G \z/oxgc) {
4765             if (0) {
4766             }
4767 288         22496  
4768 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> @{[Eeucjp::PREMATCH()]}
4769 0         0 elsif ($string =~ /\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
4770             $e_string .= q{Eeucjp::PREMATCH()};
4771             $slash = 'div';
4772             }
4773              
4774 0         0 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> @{[Eeucjp::MATCH()]}
4775 0         0 elsif ($string =~ /\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
4776             $e_string .= q{Eeucjp::MATCH()};
4777             $slash = 'div';
4778             }
4779              
4780 0         0 # $', ${'} --> $', ${'}
4781 0         0 elsif ($string =~ /\G ( \$' | \$\{'\} ) /oxmsgc) {
4782             $e_string .= $1;
4783             $slash = 'div';
4784             }
4785              
4786 0         0 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> @{[Eeucjp::POSTMATCH()]}
4787 0         0 elsif ($string =~ /\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
4788             $e_string .= q{Eeucjp::POSTMATCH()};
4789             $slash = 'div';
4790             }
4791              
4792 0         0 # bareword
4793 0         0 elsif ($string =~ /\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
4794             $e_string .= $1;
4795             $slash = 'div';
4796             }
4797              
4798 0         0 # $0 --> $0
4799 0         0 elsif ($string =~ /\G ( \$ 0 ) /oxmsgc) {
4800             $e_string .= $1;
4801             $slash = 'div';
4802 0         0 }
4803 0         0 elsif ($string =~ /\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
4804             $e_string .= $1;
4805             $slash = 'div';
4806             }
4807              
4808 0         0 # $$ --> $$
4809 0         0 elsif ($string =~ /\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
4810             $e_string .= $1;
4811             $slash = 'div';
4812             }
4813              
4814             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
4815 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
4816 0         0 elsif ($string =~ /\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
4817             $e_string .= e_capture($1);
4818             $slash = 'div';
4819 0         0 }
4820 0         0 elsif ($string =~ /\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
4821             $e_string .= e_capture($1);
4822             $slash = 'div';
4823             }
4824              
4825 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
4826 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
4827             $e_string .= e_capture($1.'->'.$2);
4828             $slash = 'div';
4829             }
4830              
4831 0         0 # $$foo{ ... } --> $ $foo->{ ... }
4832 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
4833             $e_string .= e_capture($1.'->'.$2);
4834             $slash = 'div';
4835             }
4836              
4837 0         0 # $$foo
4838 0         0 elsif ($string =~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
4839             $e_string .= e_capture($1);
4840             $slash = 'div';
4841             }
4842              
4843 0         0 # ${ foo }
4844 0         0 elsif ($string =~ /\G \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} /oxmsgc) {
4845             $e_string .= '${' . $1 . '}';
4846             $slash = 'div';
4847             }
4848              
4849 0         0 # ${ ... }
4850 3         11 elsif ($string =~ /\G \$ (?>\s*) \{ (?>\s*) ( $qq_brace ) (?>\s*) \} /oxmsgc) {
4851             $e_string .= e_capture($1);
4852             $slash = 'div';
4853             }
4854              
4855             # variable or function
4856 3         15 # $ @ % & * $ #
4857 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) {
4858             $e_string .= $1;
4859             $slash = 'div';
4860             }
4861             # $ $ $ $ $ $ $ $ $ $ $ $ $ $
4862 0         0 # $ @ # \ ' " / ? ( ) [ ] < >
4863 0         0 elsif ($string =~ /\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
4864             $e_string .= $1;
4865             $slash = 'div';
4866             }
4867 0         0  
  0         0  
4868 0         0 # subroutines of package Eeucjp
  0         0  
4869 0         0 elsif ($string =~ /\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $e_string .= $1; $slash = 'm//'; }
  0         0  
4870 0         0 elsif ($string =~ /\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
4871 0         0 elsif ($string =~ /\G \b EUCJP::eval (?= (?>\s*) \{ ) /oxgc) { $e_string .= 'eval'; $slash = 'm//'; }
  0         0  
4872 0         0 elsif ($string =~ /\G \b Char::eval \b /oxgc) { $e_string .= 'eval Char::escape'; $slash = 'm//'; }
  0         0  
4873 0         0 elsif ($string =~ /\G \b EUCJP::eval \b /oxgc) { $e_string .= 'eval EUCJP::escape'; $slash = 'm//'; }
  0         0  
4874 0         0 elsif ($string =~ /\G \b bytes::substr \b /oxgc) { $e_string .= 'substr'; $slash = 'm//'; }
  0         0  
4875 0         0 elsif ($string =~ /\G \b chop \b /oxgc) { $e_string .= 'Eeucjp::chop'; $slash = 'm//'; }
  0         0  
4876 0         0 elsif ($string =~ /\G \b bytes::index \b /oxgc) { $e_string .= 'index'; $slash = 'm//'; }
  0         0  
4877 0         0 elsif ($string =~ /\G \b Char::index \b /oxgc) { $e_string .= 'Char::index'; $slash = 'm//'; }
  0         0  
4878 0         0 elsif ($string =~ /\G \b EUCJP::index \b /oxgc) { $e_string .= 'EUCJP::index'; $slash = 'm//'; }
  0         0  
4879 0         0 elsif ($string =~ /\G \b index \b /oxgc) { $e_string .= 'Eeucjp::index'; $slash = 'm//'; }
  0         0  
4880 0         0 elsif ($string =~ /\G \b bytes::rindex \b /oxgc) { $e_string .= 'rindex'; $slash = 'm//'; }
  0         0  
4881 0         0 elsif ($string =~ /\G \b Char::rindex \b /oxgc) { $e_string .= 'Char::rindex'; $slash = 'm//'; }
  0         0  
4882 0         0 elsif ($string =~ /\G \b EUCJP::rindex \b /oxgc) { $e_string .= 'EUCJP::rindex'; $slash = 'm//'; }
  0         0  
4883 0         0 elsif ($string =~ /\G \b rindex \b /oxgc) { $e_string .= 'Eeucjp::rindex'; $slash = 'm//'; }
  0         0  
4884 0         0 elsif ($string =~ /\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeucjp::lc'; $slash = 'm//'; }
  0         0  
4885 0         0 elsif ($string =~ /\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeucjp::lcfirst'; $slash = 'm//'; }
  0         0  
4886 0         0 elsif ($string =~ /\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeucjp::uc'; $slash = 'm//'; }
  0         0  
4887             elsif ($string =~ /\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeucjp::ucfirst'; $slash = 'm//'; }
4888             elsif ($string =~ /\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeucjp::fc'; $slash = 'm//'; }
4889 0         0  
  0         0  
4890 0         0 # "-s '' ..." means file test "-s 'filename' ..." (not means "- s/// ...")
  0         0  
4891 0         0 elsif ($string =~ /\G -s (?>\s*) (\") ((?:$qq_char)+?) (\") /oxgc) { $e_string .= '-s ' . e_qq('', $1,$3,$2); $slash = 'm//'; }
  0         0  
4892 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  
4893 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  
4894 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  
4895 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  
4896             elsif ($string =~ /\G -s (?>\s+) qq (?>\s*) (\<) ((?:$qq_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_qq('qq',$1,$3,$2); $slash = 'm//'; }
4897 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  
4898 0         0  
  0         0  
4899 0         0 elsif ($string =~ /\G -s (?>\s*) (\') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $e_string .= '-s ' . e_q ('', $1,$3,$2); $slash = 'm//'; }
  0         0  
4900 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  
4901 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  
4902 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  
4903 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  
4904             elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|$q_angle)+?) (\>) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
4905             elsif ($string =~ /\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|$q_char)+?) (\1) /oxgc) { $e_string .= '-s ' . e_q ('q', $1,$3,$2); $slash = 'm//'; }
4906 0         0  
  0         0  
4907 0         0 elsif ($string =~ /\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)*) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\#\* | \( (?:$qq_paren)*? \) | [\@\%\*]? \{ (?:$qq_brace)+? \} | [\@\%]? \[ (?:$qq_bracket)+? \] ))*) /oxgc)
  0         0  
4908 0         0 { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
4909 0         0 elsif ($string =~ /\G -s (?>\s*) \( ((?:$qq_paren)*?) \) /oxgc) { $e_string .= "-s ($1)"; $slash = 'm//'; }
  0         0  
4910             elsif ($string =~ /\G -s (?= (?>\s+) [a-z]+) /oxgc) { $e_string .= '-s'; $slash = 'm//'; }
4911 0         0 elsif ($string =~ /\G -s (?>\s+) ((?>\w+)) /oxgc) { $e_string .= "-s $1"; $slash = 'm//'; }
  0         0  
4912 0         0  
  0         0  
4913 0         0 elsif ($string =~ /\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
4914 0         0 elsif ($string =~ /\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
4915 0         0 elsif ($string =~ /\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeucjp::chr'; $slash = 'm//'; }
  0         0  
4916 0         0 elsif ($string =~ /\G \b bytes::ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
4917 0         0 elsif ($string =~ /\G \b ord (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= $function_ord; $slash = 'div'; }
  0         0  
4918 0         0 elsif ($string =~ /\G \b glob (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $e_string .= 'Eeucjp::glob'; $slash = 'm//'; }
  0         0  
4919 0         0 elsif ($string =~ /\G \b lc \b /oxgc) { $e_string .= 'Eeucjp::lc_'; $slash = 'm//'; }
  0         0  
4920 0         0 elsif ($string =~ /\G \b lcfirst \b /oxgc) { $e_string .= 'Eeucjp::lcfirst_'; $slash = 'm//'; }
  0         0  
4921 0         0 elsif ($string =~ /\G \b uc \b /oxgc) { $e_string .= 'Eeucjp::uc_'; $slash = 'm//'; }
  0         0  
4922 0         0 elsif ($string =~ /\G \b ucfirst \b /oxgc) { $e_string .= 'Eeucjp::ucfirst_'; $slash = 'm//'; }
  0         0  
4923             elsif ($string =~ /\G \b fc \b /oxgc) { $e_string .= 'Eeucjp::fc_'; $slash = 'm//'; }
4924 0         0 elsif ($string =~ /\G -s \b /oxgc) { $e_string .= '-s '; $slash = 'm//'; }
  0         0  
4925 0         0  
  0         0  
4926 0         0 elsif ($string =~ /\G \b bytes::length \b /oxgc) { $e_string .= 'length'; $slash = 'm//'; }
  0         0  
4927 0         0 elsif ($string =~ /\G \b bytes::chr \b /oxgc) { $e_string .= 'chr'; $slash = 'm//'; }
  0         0  
4928 0         0 elsif ($string =~ /\G \b chr \b /oxgc) { $e_string .= 'Eeucjp::chr_'; $slash = 'm//'; }
  0         0  
4929 0         0 elsif ($string =~ /\G \b bytes::ord \b /oxgc) { $e_string .= 'ord'; $slash = 'div'; }
  0         0  
4930 0         0 elsif ($string =~ /\G \b ord \b /oxgc) { $e_string .= $function_ord_; $slash = 'div'; }
  0         0  
4931 0         0 elsif ($string =~ /\G \b glob \b /oxgc) { $e_string .= 'Eeucjp::glob_'; $slash = 'm//'; }
  0         0  
4932             elsif ($string =~ /\G \b reverse \b /oxgc) { $e_string .= $function_reverse; $slash = 'm//'; }
4933             elsif ($string =~ /\G \b getc \b /oxgc) { $e_string .= $function_getc; $slash = 'm//'; }
4934 0         0 # split
4935             elsif ($string =~ /\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
4936 0         0 $slash = 'm//';
4937 0         0  
4938 0         0 my $e = '';
4939             while ($string =~ /\G ( (?>\s+) | \( | \#.* ) /oxgc) {
4940             $e .= $1;
4941             }
4942 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          
4943             # end of split
4944             if ($string =~ /\G (?= [,;\)\}\]] ) /oxgc) { return 'Eeucjp::split' . $e; }
4945 0         0  
  0         0  
4946             # split scalar value
4947             elsif ($string =~ /\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { $e_string .= 'Eeucjp::split' . $e . e_string($1); next E_STRING_LOOP; }
4948 0         0  
  0         0  
4949 0         0 # split literal space
  0         0  
4950 0         0 elsif ($string =~ /\G \b qq (\#) [ ] (\#) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {qq$1 $2}; next E_STRING_LOOP; }
  0         0  
4951 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4952 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4953 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4954 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4955 0         0 elsif ($string =~ /\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq{$1qq$2 $3}; next E_STRING_LOOP; }
  0         0  
4956 0         0 elsif ($string =~ /\G \b q (\#) [ ] (\#) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {q$1 $2}; next E_STRING_LOOP; }
  0         0  
4957 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4958 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4959 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4960 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4961 0         0 elsif ($string =~ /\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {$1q$2 $3}; next E_STRING_LOOP; }
  0         0  
4962             elsif ($string =~ /\G ' [ ] ' /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {' '}; next E_STRING_LOOP; }
4963             elsif ($string =~ /\G " [ ] " /oxgc) { $e_string .= 'Eeucjp::split' . $e . qq {" "}; next E_STRING_LOOP; }
4964              
4965 0 0       0 # split qq//
  0         0  
  0         0  
4966             elsif ($string =~ /\G \b (qq) \b /oxgc) {
4967 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { $e_string .= e_split($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # qq# # --> qr # #
4968 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4969 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4970 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
4971 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  
4972 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  
4973 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  
4974 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  
4975             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= e_split($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # qq | | --> qr { }
4976 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 * *
4977             }
4978             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4979             }
4980             }
4981              
4982 0 0       0 # split qr//
  0         0  
  0         0  
4983             elsif ($string =~ /\G \b (qr) \b /oxgc) {
4984 0         0 if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr',$1,$3,$2,$4); next E_STRING_LOOP; } # qr# #
4985 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
4986 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4987 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
4988 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  
4989 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  
4990 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  
4991 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  
4992 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  
4993             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([imosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # qr | | --> qr { }
4994 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 * *
4995             }
4996             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4997             }
4998             }
4999              
5000 0 0       0 # split q//
  0         0  
  0         0  
5001             elsif ($string =~ /\G \b (q) \b /oxgc) {
5002 0         0 if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { $e_string .= e_split_q($e.'qr',$1,$3,$2,''); next E_STRING_LOOP; } # q# # --> qr # #
5003 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
5004 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
5005 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
5006 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  
5007 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  
5008 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  
5009 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  
5010             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$q_char)*?) (\1) /oxgc) { $e_string .= e_split_q($e.'qr','{','}',$2,''); next E_STRING_LOOP; } # q | | --> qr { }
5011 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 * *
5012             }
5013             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5014             }
5015             }
5016              
5017 0 0       0 # split m//
  0         0  
  0         0  
5018             elsif ($string =~ /\G \b (m) \b /oxgc) {
5019 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 # #
5020 0 0       0 else {
  0 0       0  
    0          
    0          
    0          
    0          
    0          
    0          
5021 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
5022 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e_string .= $e . $1; }
  0         0  
5023 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  
5024 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  
5025 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  
5026 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  
5027 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  
5028             elsif ($string =~ /\G ([*\-:?\\^|]) ((?:$qq_char)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split ($e.'qr','{','}',$2,$4); next E_STRING_LOOP; } # m | | --> qr { }
5029 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 * *
5030             }
5031             die __FILE__, ": Search pattern not terminated\n";
5032             }
5033             }
5034              
5035 0         0 # split ''
5036 0         0 elsif ($string =~ /\G (\') /oxgc) {
5037 0 0       0 my $q_string = '';
  0 0       0  
    0          
    0          
5038 0         0 while ($string !~ /\G \z/oxgc) {
5039 0         0 if ($string =~ /\G (\\\\) /oxgc) { $q_string .= $1; }
  0         0  
5040 0         0 elsif ($string =~ /\G (\\\') /oxgc) { $q_string .= $1; } # splitqr'' --> split qr''
5041             elsif ($string =~ /\G \' /oxgc) { $e_string .= e_split_q($e.q{ qr},"'","'",$q_string,''); next E_STRING_LOOP; } # ' ' --> qr ' '
5042 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $q_string .= $1; }
5043             }
5044             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5045             }
5046              
5047 0         0 # split ""
5048 0         0 elsif ($string =~ /\G (\") /oxgc) {
5049 0 0       0 my $qq_string = '';
  0 0       0  
    0          
    0          
5050 0         0 while ($string !~ /\G \z/oxgc) {
5051 0         0 if ($string =~ /\G (\\\\) /oxgc) { $qq_string .= $1; }
  0         0  
5052 0         0 elsif ($string =~ /\G (\\\") /oxgc) { $qq_string .= $1; } # splitqr"" --> split qr""
5053             elsif ($string =~ /\G \" /oxgc) { $e_string .= e_split($e.q{ qr},'"','"',$qq_string,''); next E_STRING_LOOP; } # " " --> qr " "
5054 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $qq_string .= $1; }
5055             }
5056             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5057             }
5058              
5059 0         0 # split //
5060 0         0 elsif ($string =~ /\G (\/) /oxgc) {
5061 0 0       0 my $regexp = '';
  0 0       0  
    0          
    0          
5062 0         0 while ($string !~ /\G \z/oxgc) {
5063 0         0 if ($string =~ /\G (\\\\) /oxgc) { $regexp .= $1; }
  0         0  
5064 0         0 elsif ($string =~ /\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
5065             elsif ($string =~ /\G \/ ([cgimosxpadlunbB]*) /oxgc) { $e_string .= e_split($e.q{ qr}, '/','/',$regexp,$1); next E_STRING_LOOP; } # / / --> qr / /
5066 0         0 elsif ($string =~ /\G ($q_char) /oxgc) { $regexp .= $1; }
5067             }
5068             die __FILE__, ": Search pattern not terminated\n";
5069             }
5070             }
5071              
5072 0         0 # qq//
5073 0 0       0 elsif ($string =~ /\G \b (qq) \b /oxgc) {
5074 0         0 my $ope = $1;
5075             if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qq# #
5076             $e_string .= e_qq($ope,$1,$3,$2);
5077 0         0 }
5078 0         0 else {
5079 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
5080 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
5081 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
5082 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq ( )
  0         0  
5083 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq { }
  0         0  
5084 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq [ ]
  0         0  
5085             elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq < >
5086 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq * *
5087             }
5088             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5089             }
5090             }
5091              
5092 0         0 # qx//
5093 0 0       0 elsif ($string =~ /\G \b (qx) \b /oxgc) {
5094 0         0 my $ope = $1;
5095             if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
5096             $e_string .= e_qq($ope,$1,$3,$2);
5097 0         0 }
5098 0         0 else {
5099 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
    0          
5100 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
5101 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
5102 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ( )
  0         0  
5103 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx { }
  0         0  
5104 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx [ ]
  0         0  
5105 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx < >
  0         0  
5106             elsif ($string =~ /\G (\') ((?:$qq_char)*?) (\') /oxgc) { $e_string .= $e . e_q ($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ' '
5107 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx * *
5108             }
5109             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5110             }
5111             }
5112              
5113 0         0 # q//
5114 0 0       0 elsif ($string =~ /\G \b (q) \b /oxgc) {
5115 0         0 my $ope = $1;
5116             if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { # q# #
5117             $e_string .= e_q($ope,$1,$3,$2);
5118 0         0 }
5119 0         0 else {
5120 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
5121 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
5122 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
5123 0         0 elsif ($string =~ /\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q ( )
  0         0  
5124 0         0 elsif ($string =~ /\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q { }
  0         0  
5125 0         0 elsif ($string =~ /\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q [ ]
  0         0  
5126             elsif ($string =~ /\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q < >
5127 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 * *
5128             }
5129             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
5130             }
5131             }
5132 0         0  
5133             # ''
5134             elsif ($string =~ /\G (?
5135 12         54  
5136             # ""
5137             elsif ($string =~ /\G (\") ((?:$qq_char)*?) (\") /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
5138 6         38  
5139             # ``
5140             elsif ($string =~ /\G (\`) ((?:$qq_char)*?) (\`) /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
5141 0         0  
5142             # <<>> (a safer ARGV)
5143             elsif ($string =~ /\G ( <<>> ) /oxgc) { $e_string .= $1; }
5144 0         0  
5145             # <<= <=> <= < operator
5146             elsif ($string =~ /\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) { $e_string .= $1; }
5147 0         0  
5148             #
5149             elsif ($string =~ /\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) { $e_string .= $1; }
5150              
5151 0         0 # --- glob
5152             elsif ($string =~ /\G < ((?:$q_char)+?) > /oxgc) {
5153             $e_string .= 'Eeucjp::glob("' . $1 . '")';
5154             }
5155              
5156 0         0 # << (bit shift) --- not here document
5157 0         0 elsif ($string =~ /\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) {
5158             $slash = 'm//';
5159             $e_string .= $1;
5160             }
5161              
5162 0         0 # <<~'HEREDOC'
5163 0         0 elsif ($string =~ /\G ( <<~ [\t ]* '([a-zA-Z_0-9]*)' ) /oxgc) {
5164 0         0 $slash = 'm//';
5165             my $here_quote = $1;
5166             my $delimiter = $2;
5167 0 0       0  
5168 0         0 # get here document
5169 0         0 if ($here_script eq '') {
5170             $here_script = CORE::substr $_, pos $_;
5171 0 0       0 $here_script =~ s/.*?\n//oxm;
5172 0         0 }
5173 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5174 0         0 my $heredoc = $1;
5175 0         0 my $indent = $2;
5176 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
5177             push @heredoc, $heredoc . qq{\n$delimiter\n};
5178             push @heredoc_delimiter, qq{\\s*$delimiter};
5179 0         0 }
5180             else {
5181 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5182             }
5183             $e_string .= qq{<<'$delimiter'};
5184             }
5185              
5186 0         0 # <<~\HEREDOC
5187 0         0 elsif ($string =~ /\G ( <<~ \\([a-zA-Z_0-9]+) ) /oxgc) {
5188 0         0 $slash = 'm//';
5189             my $here_quote = $1;
5190             my $delimiter = $2;
5191 0 0       0  
5192 0         0 # get here document
5193 0         0 if ($here_script eq '') {
5194             $here_script = CORE::substr $_, pos $_;
5195 0 0       0 $here_script =~ s/.*?\n//oxm;
5196 0         0 }
5197 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5198 0         0 my $heredoc = $1;
5199 0         0 my $indent = $2;
5200 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
5201             push @heredoc, $heredoc . qq{\n$delimiter\n};
5202             push @heredoc_delimiter, qq{\\s*$delimiter};
5203 0         0 }
5204             else {
5205 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5206             }
5207             $e_string .= qq{<<\\$delimiter};
5208             }
5209              
5210 0         0 # <<~"HEREDOC"
5211 0         0 elsif ($string =~ /\G ( <<~ [\t ]* "([a-zA-Z_0-9]*)" ) /oxgc) {
5212 0         0 $slash = 'm//';
5213             my $here_quote = $1;
5214             my $delimiter = $2;
5215 0 0       0  
5216 0         0 # get here document
5217 0         0 if ($here_script eq '') {
5218             $here_script = CORE::substr $_, pos $_;
5219 0 0       0 $here_script =~ s/.*?\n//oxm;
5220 0         0 }
5221 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5222 0         0 my $heredoc = $1;
5223 0         0 my $indent = $2;
5224 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
5225             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
5226             push @heredoc_delimiter, qq{\\s*$delimiter};
5227 0         0 }
5228             else {
5229 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5230             }
5231             $e_string .= qq{<<"$delimiter"};
5232             }
5233              
5234 0         0 # <<~HEREDOC
5235 0         0 elsif ($string =~ /\G ( <<~ ([a-zA-Z_0-9]+) ) /oxgc) {
5236 0         0 $slash = 'm//';
5237             my $here_quote = $1;
5238             my $delimiter = $2;
5239 0 0       0  
5240 0         0 # get here document
5241 0         0 if ($here_script eq '') {
5242             $here_script = CORE::substr $_, pos $_;
5243 0 0       0 $here_script =~ s/.*?\n//oxm;
5244 0         0 }
5245 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5246 0         0 my $heredoc = $1;
5247 0         0 my $indent = $2;
5248 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
5249             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
5250             push @heredoc_delimiter, qq{\\s*$delimiter};
5251 0         0 }
5252             else {
5253 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5254             }
5255             $e_string .= qq{<<$delimiter};
5256             }
5257              
5258 0         0 # <<~`HEREDOC`
5259 0         0 elsif ($string =~ /\G ( <<~ [\t ]* `([a-zA-Z_0-9]*)` ) /oxgc) {
5260 0         0 $slash = 'm//';
5261             my $here_quote = $1;
5262             my $delimiter = $2;
5263 0 0       0  
5264 0         0 # get here document
5265 0         0 if ($here_script eq '') {
5266             $here_script = CORE::substr $_, pos $_;
5267 0 0       0 $here_script =~ s/.*?\n//oxm;
5268 0         0 }
5269 0         0 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
5270 0         0 my $heredoc = $1;
5271 0         0 my $indent = $2;
5272 0         0 $heredoc =~ s{^$indent}{}msg; # no /ox
5273             push @heredoc, e_heredoc($heredoc) . qq{\n$delimiter\n};
5274             push @heredoc_delimiter, qq{\\s*$delimiter};
5275 0         0 }
5276             else {
5277 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5278             }
5279             $e_string .= qq{<<`$delimiter`};
5280             }
5281              
5282 0         0 # <<'HEREDOC'
5283 0         0 elsif ($string =~ /\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
5284 0         0 $slash = 'm//';
5285             my $here_quote = $1;
5286             my $delimiter = $2;
5287 0 0       0  
5288 0         0 # get here document
5289 0         0 if ($here_script eq '') {
5290             $here_script = CORE::substr $_, pos $_;
5291 0 0       0 $here_script =~ s/.*?\n//oxm;
5292 0         0 }
5293 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5294             push @heredoc, $1 . qq{\n$delimiter\n};
5295             push @heredoc_delimiter, $delimiter;
5296 0         0 }
5297             else {
5298 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5299             }
5300             $e_string .= $here_quote;
5301             }
5302              
5303 0         0 # <<\HEREDOC
5304 0         0 elsif ($string =~ /\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
5305 0         0 $slash = 'm//';
5306             my $here_quote = $1;
5307             my $delimiter = $2;
5308 0 0       0  
5309 0         0 # get here document
5310 0         0 if ($here_script eq '') {
5311             $here_script = CORE::substr $_, pos $_;
5312 0 0       0 $here_script =~ s/.*?\n//oxm;
5313 0         0 }
5314 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5315             push @heredoc, $1 . qq{\n$delimiter\n};
5316             push @heredoc_delimiter, $delimiter;
5317 0         0 }
5318             else {
5319 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5320             }
5321             $e_string .= $here_quote;
5322             }
5323              
5324 0         0 # <<"HEREDOC"
5325 0         0 elsif ($string =~ /\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
5326 0         0 $slash = 'm//';
5327             my $here_quote = $1;
5328             my $delimiter = $2;
5329 0 0       0  
5330 0         0 # get here document
5331 0         0 if ($here_script eq '') {
5332             $here_script = CORE::substr $_, pos $_;
5333 0 0       0 $here_script =~ s/.*?\n//oxm;
5334 0         0 }
5335 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5336             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5337             push @heredoc_delimiter, $delimiter;
5338 0         0 }
5339             else {
5340 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5341             }
5342             $e_string .= $here_quote;
5343             }
5344              
5345 0         0 # <
5346 0         0 elsif ($string =~ /\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
5347 0         0 $slash = 'm//';
5348             my $here_quote = $1;
5349             my $delimiter = $2;
5350 0 0       0  
5351 0         0 # get here document
5352 0         0 if ($here_script eq '') {
5353             $here_script = CORE::substr $_, pos $_;
5354 0 0       0 $here_script =~ s/.*?\n//oxm;
5355 0         0 }
5356 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5357             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5358             push @heredoc_delimiter, $delimiter;
5359 0         0 }
5360             else {
5361 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5362             }
5363             $e_string .= $here_quote;
5364             }
5365              
5366 0         0 # <<`HEREDOC`
5367 0         0 elsif ($string =~ /\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
5368 0         0 $slash = 'm//';
5369             my $here_quote = $1;
5370             my $delimiter = $2;
5371 0 0       0  
5372 0         0 # get here document
5373 0         0 if ($here_script eq '') {
5374             $here_script = CORE::substr $_, pos $_;
5375 0 0       0 $here_script =~ s/.*?\n//oxm;
5376 0         0 }
5377 0         0 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
5378             push @heredoc, e_heredoc($1) . qq{\n$delimiter\n};
5379             push @heredoc_delimiter, $delimiter;
5380 0         0 }
5381             else {
5382 0         0 die __FILE__, ": Can't find string terminator $delimiter anywhere before EOF\n";
5383             }
5384             $e_string .= $here_quote;
5385             }
5386              
5387             # any operator before div
5388             elsif ($string =~ /\G (
5389             -- | \+\+ |
5390 0         0 [\)\}\]]
  39         66  
5391              
5392             ) /oxgc) { $slash = 'div'; $e_string .= $1; }
5393              
5394             # yada-yada or triple-dot operator
5395             elsif ($string =~ /\G (
5396 39         121 \.\.\.
  0         0  
5397              
5398             ) /oxgc) { $slash = 'm//'; $e_string .= q{die('Unimplemented')}; }
5399              
5400             # any operator before m//
5401             elsif ($string =~ /\G ((?>
5402              
5403             !~~ | !~ | != | ! |
5404             %= | % |
5405             &&= | && | &= | &\.= | &\. | & |
5406             -= | -> | - |
5407             :(?>\s*)= |
5408             : |
5409             <<>> |
5410             <<= | <=> | <= | < |
5411             == | => | =~ | = |
5412             >>= | >> | >= | > |
5413             \*\*= | \*\* | \*= | \* |
5414             \+= | \+ |
5415             \.\. | \.= | \. |
5416             \/\/= | \/\/ |
5417             \/= | \/ |
5418             \? |
5419             \\ |
5420             \^= | \^\.= | \^\. | \^ |
5421             \b x= |
5422             \|\|= | \|\| | \|= | \|\.= | \|\. | \| |
5423             ~~ | ~\. | ~ |
5424             \b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
5425             \b(?: print )\b |
5426              
5427 0         0 [,;\(\{\[]
  49         101  
5428              
5429             )) /oxgc) { $slash = 'm//'; $e_string .= $1; }
5430 49         194  
5431             # other any character
5432             elsif ($string =~ /\G ($q_char) /oxgc) { $e_string .= $1; }
5433              
5434 179         722 # system error
5435             else {
5436             die __FILE__, ": Oops, this shouldn't happen!\n";
5437             }
5438 0         0 }
5439              
5440             return $e_string;
5441             }
5442              
5443             #
5444             # character class
5445 38     3059 0 141 #
5446             sub character_class {
5447 3059 100       6444 my($char,$modifier) = @_;
5448 3059 100       4937  
5449 115         223 if ($char eq '.') {
5450             if ($modifier =~ /s/) {
5451             return '${Eeucjp::dot_s}';
5452 23         56 }
5453             else {
5454             return '${Eeucjp::dot}';
5455             }
5456 92         211 }
5457             else {
5458             return Eeucjp::classic_character_class($char);
5459             }
5460             }
5461              
5462             #
5463             # escape capture ($1, $2, $3, ...)
5464             #
5465 2944     547 0 5394 sub e_capture {
5466 547         2373  
5467             return join '', '${Eeucjp::capture(', $_[0], ')}';
5468             return join '', '${', $_[0], '}';
5469             }
5470              
5471             #
5472             # escape transliteration (tr/// or y///)
5473 0     11 0 0 #
5474 11         55 sub e_tr {
5475 11   100     17 my($variable,$charclass,$e,$charclass2,$modifier) = @_;
5476             my $e_tr = '';
5477 11         32 $modifier ||= '';
5478              
5479             $slash = 'div';
5480 11         15  
5481             # quote character class 1
5482             $charclass = q_tr($charclass);
5483 11         33  
5484             # quote character class 2
5485             $charclass2 = q_tr($charclass2);
5486 11 50       18  
5487 11 0       34 # /b /B modifier
5488 0         0 if ($modifier =~ tr/bB//d) {
5489             if ($variable eq '') {
5490             $e_tr = qq{tr$charclass$e$charclass2$modifier};
5491 0         0 }
5492             else {
5493             $e_tr = qq{$variable${bind_operator}tr$charclass$e$charclass2$modifier};
5494             }
5495 0 100       0 }
5496 11         22 else {
5497             if ($variable eq '') {
5498             $e_tr = qq{Eeucjp::tr(\$_,' =~ ',$charclass,$e$charclass2,'$modifier')};
5499 2         7 }
5500             else {
5501             $e_tr = qq{Eeucjp::tr($variable,'$bind_operator',$charclass,$e$charclass2,'$modifier')};
5502             }
5503             }
5504 9         32  
5505 11         21 # clear tr/// variable
5506             $tr_variable = '';
5507 11         13 $bind_operator = '';
5508              
5509             return $e_tr;
5510             }
5511              
5512             #
5513             # quote for escape transliteration (tr/// or y///)
5514 11     22 0 65 #
5515             sub q_tr {
5516             my($charclass) = @_;
5517 22 50       33  
    0          
    0          
    0          
    0          
    0          
5518 22         47 # quote character class
5519             if ($charclass !~ /'/oxms) {
5520             return e_q('', "'", "'", $charclass); # --> q' '
5521 22         38 }
5522             elsif ($charclass !~ /\//oxms) {
5523             return e_q('q', '/', '/', $charclass); # --> q/ /
5524 0         0 }
5525             elsif ($charclass !~ /\#/oxms) {
5526             return e_q('q', '#', '#', $charclass); # --> q# #
5527 0         0 }
5528             elsif ($charclass !~ /[\<\>]/oxms) {
5529             return e_q('q', '<', '>', $charclass); # --> q< >
5530 0         0 }
5531             elsif ($charclass !~ /[\(\)]/oxms) {
5532             return e_q('q', '(', ')', $charclass); # --> q( )
5533 0         0 }
5534             elsif ($charclass !~ /[\{\}]/oxms) {
5535             return e_q('q', '{', '}', $charclass); # --> q{ }
5536 0         0 }
5537 0 0       0 else {
5538 0         0 for my $char (qw( ! " $ % & * + . : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5539             if ($charclass !~ /\Q$char\E/xms) {
5540             return e_q('q', $char, $char, $charclass);
5541             }
5542             }
5543 0         0 }
5544              
5545             return e_q('q', '{', '}', $charclass);
5546             }
5547              
5548             #
5549             # escape q string (q//, '')
5550 0     2416 0 0 #
5551             sub e_q {
5552 2416         6004 my($ope,$delimiter,$end_delimiter,$string) = @_;
5553              
5554 2416         3463 $slash = 'div';
5555              
5556             return join '', $ope, $delimiter, $string, $end_delimiter;
5557             }
5558              
5559             #
5560             # escape qq string (qq//, "", qx//, ``)
5561 2416     6990 0 11795 #
5562             sub e_qq {
5563 6990         15597 my($ope,$delimiter,$end_delimiter,$string) = @_;
5564              
5565 6990         8944 $slash = 'div';
5566 6990         8101  
5567             my $left_e = 0;
5568             my $right_e = 0;
5569 6990         7439  
5570             # split regexp
5571             my @char = $string =~ /\G((?>
5572             [^\x8E\x8F\xA1-\xFE\\\$]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
5573             \\x\{ (?>[0-9A-Fa-f]+) \} |
5574             \\o\{ (?>[0-7]+) \} |
5575             \\N\{ (?>[^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} |
5576             \\ $q_char |
5577             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5578             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5579             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5580             \$ (?>\s* [0-9]+) |
5581             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5582             \$ \$ (?![\w\{]) |
5583             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5584             $q_char
5585 6990         273565 ))/oxmsg;
5586              
5587             for (my $i=0; $i <= $#char; $i++) {
5588 6990 50 66     21844  
    50 33        
    100          
    100          
    50          
5589 216502         663361 # "\L\u" --> "\u\L"
5590             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
5591             @char[$i,$i+1] = @char[$i+1,$i];
5592             }
5593              
5594 0         0 # "\U\l" --> "\l\U"
5595             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5596             @char[$i,$i+1] = @char[$i+1,$i];
5597             }
5598              
5599 0         0 # octal escape sequence
5600             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5601             $char[$i] = Eeucjp::octchr($1);
5602             }
5603              
5604 1         5 # hexadecimal escape sequence
5605             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5606             $char[$i] = Eeucjp::hexchr($1);
5607             }
5608              
5609 1         4 # \N{CHARNAME} --> N{CHARNAME}
5610             elsif ($char[$i] =~ /\A \\ ( N\{ ([^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} ) \z/oxms) {
5611             $char[$i] = $1;
5612 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          
5613              
5614             if (0) {
5615             }
5616              
5617             # \F
5618             #
5619             # P.69 Table 2-6. Translation escapes
5620             # in Chapter 2: Bits and Pieces
5621             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5622             # (and so on)
5623 216502         1719418  
5624 0 50       0 # \u \l \U \L \F \Q \E
5625 602         1271 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
5626             if ($right_e < $left_e) {
5627             $char[$i] = '\\' . $char[$i];
5628             }
5629             }
5630             elsif ($char[$i] eq '\u') {
5631              
5632             # "STRING @{[ LIST EXPR ]} MORE STRING"
5633              
5634             # P.257 Other Tricks You Can Do with Hard References
5635             # in Chapter 8: References
5636             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
5637              
5638             # P.353 Other Tricks You Can Do with Hard References
5639             # in Chapter 8: References
5640             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5641              
5642 0         0 # (and so on)
5643 0         0  
5644             $char[$i] = '@{[Eeucjp::ucfirst qq<';
5645             $left_e++;
5646 0         0 }
5647 0         0 elsif ($char[$i] eq '\l') {
5648             $char[$i] = '@{[Eeucjp::lcfirst qq<';
5649             $left_e++;
5650 0         0 }
5651 0         0 elsif ($char[$i] eq '\U') {
5652             $char[$i] = '@{[Eeucjp::uc qq<';
5653             $left_e++;
5654 0         0 }
5655 6         9 elsif ($char[$i] eq '\L') {
5656             $char[$i] = '@{[Eeucjp::lc qq<';
5657             $left_e++;
5658 6         12 }
5659 9         13 elsif ($char[$i] eq '\F') {
5660             $char[$i] = '@{[Eeucjp::fc qq<';
5661             $left_e++;
5662 9         15 }
5663 0         0 elsif ($char[$i] eq '\Q') {
5664             $char[$i] = '@{[CORE::quotemeta qq<';
5665             $left_e++;
5666 0 50       0 }
5667 12         23 elsif ($char[$i] eq '\E') {
5668 12         14 if ($right_e < $left_e) {
5669             $char[$i] = '>]}';
5670             $right_e++;
5671 12         22 }
5672             else {
5673             $char[$i] = '';
5674             }
5675 0         0 }
5676 0 0       0 elsif ($char[$i] eq '\Q') {
5677 0         0 while (1) {
5678             if (++$i > $#char) {
5679 0 0       0 last;
5680 0         0 }
5681             if ($char[$i] eq '\E') {
5682             last;
5683             }
5684             }
5685             }
5686             elsif ($char[$i] eq '\E') {
5687             }
5688              
5689             # $0 --> $0
5690             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
5691             }
5692             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
5693             }
5694              
5695             # $$ --> $$
5696             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
5697             }
5698              
5699             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
5700 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
5701             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
5702             $char[$i] = e_capture($1);
5703 415         965 }
5704             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
5705             $char[$i] = e_capture($1);
5706             }
5707              
5708 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
5709             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
5710             $char[$i] = e_capture($1.'->'.$2);
5711             }
5712              
5713 0         0 # $$foo{ ... } --> $ $foo->{ ... }
5714             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
5715             $char[$i] = e_capture($1.'->'.$2);
5716             }
5717              
5718 0         0 # $$foo
5719             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
5720             $char[$i] = e_capture($1);
5721             }
5722              
5723 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeucjp::PREMATCH()
5724             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
5725             $char[$i] = '@{[Eeucjp::PREMATCH()]}';
5726             }
5727              
5728 44         114 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeucjp::MATCH()
5729             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
5730             $char[$i] = '@{[Eeucjp::MATCH()]}';
5731             }
5732              
5733 45         138 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeucjp::POSTMATCH()
5734             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
5735             $char[$i] = '@{[Eeucjp::POSTMATCH()]}';
5736             }
5737              
5738             # ${ foo } --> ${ foo }
5739             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
5740             }
5741              
5742 33         95 # ${ ... }
5743             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
5744             $char[$i] = e_capture($1);
5745             }
5746             }
5747 0 100       0  
5748 6990         12876 # return string
5749             if ($left_e > $right_e) {
5750 3         20 return join '', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter;
5751             }
5752             return join '', $ope, $delimiter, @char, $end_delimiter;
5753             }
5754              
5755             #
5756             # escape qw string (qw//)
5757 6987     34 0 58987 #
5758             sub e_qw {
5759 34         160 my($ope,$delimiter,$end_delimiter,$string) = @_;
5760              
5761             $slash = 'div';
5762 34         69  
  34         326  
5763 621 50       985 # choice again delimiter
    0          
    0          
    0          
    0          
5764 34         175 my %octet = map {$_ => 1} ($string =~ /\G ([\x00-\xFF]) /oxmsg);
5765             if (not $octet{$end_delimiter}) {
5766             return join '', $ope, $delimiter, $string, $end_delimiter;
5767 34         224 }
5768             elsif (not $octet{')'}) {
5769             return join '', $ope, '(', $string, ')';
5770 0         0 }
5771             elsif (not $octet{'}'}) {
5772             return join '', $ope, '{', $string, '}';
5773 0         0 }
5774             elsif (not $octet{']'}) {
5775             return join '', $ope, '[', $string, ']';
5776 0         0 }
5777             elsif (not $octet{'>'}) {
5778             return join '', $ope, '<', $string, '>';
5779 0         0 }
5780 0 0       0 else {
5781 0         0 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5782             if (not $octet{$char}) {
5783             return join '', $ope, $char, $string, $char;
5784             }
5785             }
5786             }
5787 0         0  
5788 0         0 # qw/AAA BBB C'CC/ --> ('AAA', 'BBB', 'C\'CC')
5789 0         0 my @string = CORE::split(/\s+/, $string);
5790 0         0 for my $string (@string) {
5791 0 0       0 my @octet = $string =~ /\G ([\x00-\xFF]) /oxmsg;
5792 0         0 for my $octet (@octet) {
5793             if ($octet =~ /\A (['\\]) \z/oxms) {
5794             $octet = '\\' . $1;
5795 0         0 }
5796             }
5797 0         0 $string = join '', @octet;
  0         0  
5798             }
5799             return join '', '(', (join ', ', map { "'$_'" } @string), ')';
5800             }
5801              
5802             #
5803             # escape here document (<<"HEREDOC", <
5804 0     108 0 0 #
5805             sub e_heredoc {
5806 108         283 my($string) = @_;
5807              
5808 108         184 $slash = 'm//';
5809              
5810 108         540 my $metachar = qr/[\@\\|]/oxms; # '|' is for <<`HEREDOC`
5811 108         187  
5812             my $left_e = 0;
5813             my $right_e = 0;
5814 108         159  
5815             # split regexp
5816             my @char = $string =~ /\G((?>
5817             [^\x8E\x8F\xA1-\xFE\\\$]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
5818             \\x\{ (?>[0-9A-Fa-f]+) \} |
5819             \\o\{ (?>[0-7]+) \} |
5820             \\N\{ (?>[^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} |
5821             \\ $q_char |
5822             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5823             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5824             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5825             \$ (?>\s* [0-9]+) |
5826             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5827             \$ \$ (?![\w\{]) |
5828             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5829             $q_char
5830 108         13646 ))/oxmsg;
5831              
5832             for (my $i=0; $i <= $#char; $i++) {
5833 108 50 66     519  
    50 33        
    100          
    100          
    50          
5834 3251         10491 # "\L\u" --> "\u\L"
5835             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
5836             @char[$i,$i+1] = @char[$i+1,$i];
5837             }
5838              
5839 0         0 # "\U\l" --> "\l\U"
5840             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5841             @char[$i,$i+1] = @char[$i+1,$i];
5842             }
5843              
5844 0         0 # octal escape sequence
5845             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5846             $char[$i] = Eeucjp::octchr($1);
5847             }
5848              
5849 1         4 # hexadecimal escape sequence
5850             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5851             $char[$i] = Eeucjp::hexchr($1);
5852             }
5853              
5854 1         3 # \N{CHARNAME} --> N{CHARNAME}
5855             elsif ($char[$i] =~ /\A \\ ( N\{ ([^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} ) \z/oxms) {
5856             $char[$i] = $1;
5857 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          
5858              
5859             if (0) {
5860             }
5861 3251         44757  
5862 0 50       0 # \u \l \U \L \F \Q \E
5863 72         139 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
5864             if ($right_e < $left_e) {
5865             $char[$i] = '\\' . $char[$i];
5866             }
5867 0         0 }
5868 0         0 elsif ($char[$i] eq '\u') {
5869             $char[$i] = '@{[Eeucjp::ucfirst qq<';
5870             $left_e++;
5871 0         0 }
5872 0         0 elsif ($char[$i] eq '\l') {
5873             $char[$i] = '@{[Eeucjp::lcfirst qq<';
5874             $left_e++;
5875 0         0 }
5876 0         0 elsif ($char[$i] eq '\U') {
5877             $char[$i] = '@{[Eeucjp::uc qq<';
5878             $left_e++;
5879 0         0 }
5880 6         10 elsif ($char[$i] eq '\L') {
5881             $char[$i] = '@{[Eeucjp::lc qq<';
5882             $left_e++;
5883 6         10 }
5884 0         0 elsif ($char[$i] eq '\F') {
5885             $char[$i] = '@{[Eeucjp::fc qq<';
5886             $left_e++;
5887 0         0 }
5888 0         0 elsif ($char[$i] eq '\Q') {
5889             $char[$i] = '@{[CORE::quotemeta qq<';
5890             $left_e++;
5891 0 50       0 }
5892 3         7 elsif ($char[$i] eq '\E') {
5893 3         4 if ($right_e < $left_e) {
5894             $char[$i] = '>]}';
5895             $right_e++;
5896 3         6 }
5897             else {
5898             $char[$i] = '';
5899             }
5900 0         0 }
5901 0 0       0 elsif ($char[$i] eq '\Q') {
5902 0         0 while (1) {
5903             if (++$i > $#char) {
5904 0 0       0 last;
5905 0         0 }
5906             if ($char[$i] eq '\E') {
5907             last;
5908             }
5909             }
5910             }
5911             elsif ($char[$i] eq '\E') {
5912             }
5913              
5914             # $0 --> $0
5915             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
5916             }
5917             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
5918             }
5919              
5920             # $$ --> $$
5921             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
5922             }
5923              
5924             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
5925 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
5926             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
5927             $char[$i] = e_capture($1);
5928 0         0 }
5929             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
5930             $char[$i] = e_capture($1);
5931             }
5932              
5933 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
5934             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
5935             $char[$i] = e_capture($1.'->'.$2);
5936             }
5937              
5938 0         0 # $$foo{ ... } --> $ $foo->{ ... }
5939             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
5940             $char[$i] = e_capture($1.'->'.$2);
5941             }
5942              
5943 0         0 # $$foo
5944             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
5945             $char[$i] = e_capture($1);
5946             }
5947              
5948 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeucjp::PREMATCH()
5949             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
5950             $char[$i] = '@{[Eeucjp::PREMATCH()]}';
5951             }
5952              
5953 8         45 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeucjp::MATCH()
5954             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
5955             $char[$i] = '@{[Eeucjp::MATCH()]}';
5956             }
5957              
5958 8         50 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeucjp::POSTMATCH()
5959             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
5960             $char[$i] = '@{[Eeucjp::POSTMATCH()]}';
5961             }
5962              
5963             # ${ foo } --> ${ foo }
5964             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
5965             }
5966              
5967 6         55 # ${ ... }
5968             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
5969             $char[$i] = e_capture($1);
5970             }
5971             }
5972 0 100       0  
5973 108         246 # return string
5974             if ($left_e > $right_e) {
5975 3         26 return join '', @char, '>]}' x ($left_e - $right_e);
5976             }
5977             return join '', @char;
5978             }
5979              
5980             #
5981             # escape regexp (m//, qr//)
5982 105     1426 0 790 #
5983 1426   100     5642 sub e_qr {
5984             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
5985 1426         4964 $modifier ||= '';
5986 1426 50       2561  
5987 1426         3857 $modifier =~ tr/p//d;
5988 0         0 if ($modifier =~ /([adlu])/oxms) {
5989 0 0       0 my $line = 0;
5990 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
5991 0         0 if ($filename ne __FILE__) {
5992             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
5993             last;
5994 0         0 }
5995             }
5996             die qq{Unsupported modifier "$1" used at line $line.\n};
5997 0         0 }
5998              
5999             $slash = 'div';
6000 1426 100       2179  
    100          
6001 1426         3986 # literal null string pattern
6002 8         8 if ($string eq '') {
6003 8         11 $modifier =~ tr/bB//d;
6004             $modifier =~ tr/i//d;
6005             return join '', $ope, $delimiter, $end_delimiter, $modifier;
6006             }
6007              
6008             # /b /B modifier
6009             elsif ($modifier =~ tr/bB//d) {
6010 8 50       36  
6011 60         195 # choice again delimiter
6012 0         0 if ($delimiter =~ / [\@:] /oxms) {
  0         0  
6013 0 0       0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
    0          
    0          
    0          
6014 0         0 my %octet = map {$_ => 1} @char;
6015 0         0 if (not $octet{')'}) {
6016             $delimiter = '(';
6017             $end_delimiter = ')';
6018 0         0 }
6019 0         0 elsif (not $octet{'}'}) {
6020             $delimiter = '{';
6021             $end_delimiter = '}';
6022 0         0 }
6023 0         0 elsif (not $octet{']'}) {
6024             $delimiter = '[';
6025             $end_delimiter = ']';
6026 0         0 }
6027 0         0 elsif (not $octet{'>'}) {
6028             $delimiter = '<';
6029             $end_delimiter = '>';
6030 0         0 }
6031 0 0       0 else {
6032 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6033 0         0 if (not $octet{$char}) {
6034 0         0 $delimiter = $char;
6035             $end_delimiter = $char;
6036             last;
6037             }
6038             }
6039             }
6040 0 100 100     0 }
6041 60         316  
6042             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6043             return join '', $ope, $delimiter, $string, $matched, $end_delimiter, $modifier;
6044 18         97 }
6045             else {
6046             return join '', $ope, $delimiter, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
6047             }
6048 42 100       255 }
6049 1358         3205  
6050             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6051             my $metachar = qr/[\@\\|[\]{^]/oxms;
6052 1358         5261  
6053             # split regexp
6054             my @char = $string =~ /\G((?>
6055             [^\x8E\x8F\xA1-\xFE\\\$\@\[\(]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
6056             \\x (?>[0-9A-Fa-f]{1,2}) |
6057             \\ (?>[0-7]{2,3}) |
6058             \\c [\x40-\x5F] |
6059             \\x\{ (?>[0-9A-Fa-f]+) \} |
6060             \\o\{ (?>[0-7]+) \} |
6061             \\[bBNpP]\{ (?>[^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} |
6062             \\ $q_char |
6063             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
6064             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
6065             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
6066             [\$\@] $qq_variable |
6067             \$ (?>\s* [0-9]+) |
6068             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
6069             \$ \$ (?![\w\{]) |
6070             \$ (?>\s*) \$ (?>\s*) $qq_variable |
6071             \[\^ |
6072             \[\: (?>[a-z]+) :\] |
6073             \[\:\^ (?>[a-z]+) :\] |
6074             \(\? |
6075             $q_char
6076             ))/oxmsg;
6077 1358 50       129736  
6078 1358         6078 # choice again delimiter
  0         0  
6079 0 0       0 if ($delimiter =~ / [\@:] /oxms) {
    0          
    0          
    0          
6080 0         0 my %octet = map {$_ => 1} @char;
6081 0         0 if (not $octet{')'}) {
6082             $delimiter = '(';
6083             $end_delimiter = ')';
6084 0         0 }
6085 0         0 elsif (not $octet{'}'}) {
6086             $delimiter = '{';
6087             $end_delimiter = '}';
6088 0         0 }
6089 0         0 elsif (not $octet{']'}) {
6090             $delimiter = '[';
6091             $end_delimiter = ']';
6092 0         0 }
6093 0         0 elsif (not $octet{'>'}) {
6094             $delimiter = '<';
6095             $end_delimiter = '>';
6096 0         0 }
6097 0 0       0 else {
6098 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6099 0         0 if (not $octet{$char}) {
6100 0         0 $delimiter = $char;
6101             $end_delimiter = $char;
6102             last;
6103             }
6104             }
6105             }
6106 0         0 }
6107 1358         2036  
6108 1358         1749 my $left_e = 0;
6109             my $right_e = 0;
6110             for (my $i=0; $i <= $#char; $i++) {
6111 1358 50 66     3471  
    50 66        
    100          
    100          
    100          
    100          
6112 3269         17170 # "\L\u" --> "\u\L"
6113             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
6114             @char[$i,$i+1] = @char[$i+1,$i];
6115             }
6116              
6117 0         0 # "\U\l" --> "\l\U"
6118             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
6119             @char[$i,$i+1] = @char[$i+1,$i];
6120             }
6121              
6122 0         0 # octal escape sequence
6123             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
6124             $char[$i] = Eeucjp::octchr($1);
6125             }
6126              
6127 1         4 # hexadecimal escape sequence
6128             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
6129             $char[$i] = Eeucjp::hexchr($1);
6130             }
6131              
6132             # \b{...} --> b\{...}
6133             # \B{...} --> B\{...}
6134             # \N{CHARNAME} --> N\{CHARNAME}
6135             # \p{PROPERTY} --> p\{PROPERTY}
6136 1         3 # \P{PROPERTY} --> P\{PROPERTY}
6137             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} ) \z/oxms) {
6138             $char[$i] = $1 . '\\' . $2;
6139             }
6140              
6141 6         18 # \p, \P, \X --> p, P, X
6142             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
6143             $char[$i] = $1;
6144 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          
6145              
6146             if (0) {
6147             }
6148 3269         9525  
6149 0 50 33     0 # join separated multiple-octet
    50 33        
    50 33        
      33        
      66        
      33        
6150 6         83 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
6151             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)) {
6152             $char[$i] .= join '', splice @char, $i+1, 3;
6153 0         0 }
6154             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)) {
6155             $char[$i] .= join '', splice @char, $i+1, 2;
6156 0         0 }
6157             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)) {
6158             $char[$i] .= join '', splice @char, $i+1, 1;
6159             }
6160             }
6161              
6162 0         0 # open character class [...]
6163             elsif ($char[$i] eq '[') {
6164             my $left = $i;
6165              
6166             # [] make die "Unmatched [] in regexp ...\n"
6167 586 100       772 # (and so on)
6168 586         1451  
6169             if ($char[$i+1] eq ']') {
6170             $i++;
6171 3         4 }
6172 586 50       746  
6173 2583         3693 while (1) {
6174             if (++$i > $#char) {
6175 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
6176 2583         3911 }
6177             if ($char[$i] eq ']') {
6178             my $right = $i;
6179 586 100       714  
6180 586         2967 # [...]
  90         197  
6181             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6182             splice @char, $left, $right-$left+1, sprintf(q{@{[Eeucjp::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
6183 270         401 }
6184             else {
6185             splice @char, $left, $right-$left+1, Eeucjp::charlist_qr(@char[$left+1..$right-1], $modifier);
6186 496         1888 }
6187 586         1054  
6188             $i = $left;
6189             last;
6190             }
6191             }
6192             }
6193              
6194 586         1499 # open character class [^...]
6195             elsif ($char[$i] eq '[^') {
6196             my $left = $i;
6197              
6198             # [^] make die "Unmatched [] in regexp ...\n"
6199 328 100       449 # (and so on)
6200 328         742  
6201             if ($char[$i+1] eq ']') {
6202             $i++;
6203 5         8 }
6204 328 50       389  
6205 1447         2004 while (1) {
6206             if (++$i > $#char) {
6207 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
6208 1447         2075 }
6209             if ($char[$i] eq ']') {
6210             my $right = $i;
6211 328 100       393  
6212 328         2288 # [^...]
  90         225  
6213             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6214             splice @char, $left, $right-$left+1, sprintf(q{@{[Eeucjp::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
6215 270         432 }
6216             else {
6217             splice @char, $left, $right-$left+1, Eeucjp::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6218 238         786 }
6219 328         669  
6220             $i = $left;
6221             last;
6222             }
6223             }
6224             }
6225              
6226 328         847 # rewrite character class or escape character
6227             elsif (my $char = character_class($char[$i],$modifier)) {
6228             $char[$i] = $char;
6229             }
6230              
6231 215 50       496 # /i modifier
6232 54         149 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeucjp::uc($char[$i]) ne Eeucjp::fc($char[$i]))) {
6233             if (CORE::length(Eeucjp::fc($char[$i])) == 1) {
6234             $char[$i] = '[' . Eeucjp::uc($char[$i]) . Eeucjp::fc($char[$i]) . ']';
6235 54         108 }
6236             else {
6237             $char[$i] = '(?:' . Eeucjp::uc($char[$i]) . '|' . Eeucjp::fc($char[$i]) . ')';
6238             }
6239             }
6240              
6241 0 50       0 # \u \l \U \L \F \Q \E
6242 1         5 elsif ($char[$i] =~ /\A [<>] \z/oxms) {
6243             if ($right_e < $left_e) {
6244             $char[$i] = '\\' . $char[$i];
6245             }
6246 0         0 }
6247 0         0 elsif ($char[$i] eq '\u') {
6248             $char[$i] = '@{[Eeucjp::ucfirst qq<';
6249             $left_e++;
6250 0         0 }
6251 0         0 elsif ($char[$i] eq '\l') {
6252             $char[$i] = '@{[Eeucjp::lcfirst qq<';
6253             $left_e++;
6254 0         0 }
6255 1         3 elsif ($char[$i] eq '\U') {
6256             $char[$i] = '@{[Eeucjp::uc qq<';
6257             $left_e++;
6258 1         4 }
6259 1         4 elsif ($char[$i] eq '\L') {
6260             $char[$i] = '@{[Eeucjp::lc qq<';
6261             $left_e++;
6262 1         2 }
6263 9         19 elsif ($char[$i] eq '\F') {
6264             $char[$i] = '@{[Eeucjp::fc qq<';
6265             $left_e++;
6266 9         19 }
6267 20         40 elsif ($char[$i] eq '\Q') {
6268             $char[$i] = '@{[CORE::quotemeta qq<';
6269             $left_e++;
6270 20 50       47 }
6271 31         68 elsif ($char[$i] eq '\E') {
6272 31         45 if ($right_e < $left_e) {
6273             $char[$i] = '>]}';
6274             $right_e++;
6275 31         64 }
6276             else {
6277             $char[$i] = '';
6278             }
6279 0         0 }
6280 0 0       0 elsif ($char[$i] eq '\Q') {
6281 0         0 while (1) {
6282             if (++$i > $#char) {
6283 0 0       0 last;
6284 0         0 }
6285             if ($char[$i] eq '\E') {
6286             last;
6287             }
6288             }
6289             }
6290             elsif ($char[$i] eq '\E') {
6291             }
6292              
6293 0 0       0 # $0 --> $0
6294 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
6295             if ($ignorecase) {
6296             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6297             }
6298 0 0       0 }
6299 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
6300             if ($ignorecase) {
6301             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6302             }
6303             }
6304              
6305             # $$ --> $$
6306             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
6307             }
6308              
6309             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6310 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
6311 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
6312 0         0 $char[$i] = e_capture($1);
6313             if ($ignorecase) {
6314             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6315             }
6316 0         0 }
6317 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6318 0         0 $char[$i] = e_capture($1);
6319             if ($ignorecase) {
6320             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6321             }
6322             }
6323              
6324 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
6325 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) {
6326 0         0 $char[$i] = e_capture($1.'->'.$2);
6327             if ($ignorecase) {
6328             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6329             }
6330             }
6331              
6332 0         0 # $$foo{ ... } --> $ $foo->{ ... }
6333 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) {
6334 0         0 $char[$i] = e_capture($1.'->'.$2);
6335             if ($ignorecase) {
6336             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6337             }
6338             }
6339              
6340 0         0 # $$foo
6341 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
6342 0         0 $char[$i] = e_capture($1);
6343             if ($ignorecase) {
6344             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6345             }
6346             }
6347              
6348 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeucjp::PREMATCH()
6349 8         20 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
6350             if ($ignorecase) {
6351             $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::PREMATCH())]}';
6352 0         0 }
6353             else {
6354             $char[$i] = '@{[Eeucjp::PREMATCH()]}';
6355             }
6356             }
6357              
6358 8 50       23 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeucjp::MATCH()
6359 8         24 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
6360             if ($ignorecase) {
6361             $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::MATCH())]}';
6362 0         0 }
6363             else {
6364             $char[$i] = '@{[Eeucjp::MATCH()]}';
6365             }
6366             }
6367              
6368 8 50       26 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeucjp::POSTMATCH()
6369 6         20 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
6370             if ($ignorecase) {
6371             $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::POSTMATCH())]}';
6372 0         0 }
6373             else {
6374             $char[$i] = '@{[Eeucjp::POSTMATCH()]}';
6375             }
6376             }
6377              
6378 6 0       18 # ${ foo }
6379 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) {
6380             if ($ignorecase) {
6381             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6382             }
6383             }
6384              
6385 0         0 # ${ ... }
6386 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
6387 0         0 $char[$i] = e_capture($1);
6388             if ($ignorecase) {
6389             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6390             }
6391             }
6392              
6393 0         0 # $scalar or @array
6394 29 100       82 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
6395 29         105 $char[$i] = e_string($char[$i]);
6396             if ($ignorecase) {
6397             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6398             }
6399             }
6400              
6401 4 100 66     15 # quote character before ? + * {
    50          
6402             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6403             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
6404 188         1451 }
6405 0 0       0 elsif (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6406 0         0 my $char = $char[$i-1];
6407             if ($char[$i] eq '{') {
6408             die __FILE__, qq{: "MULTIBYTE{n}" should be "(MULTIBYTE){n}" in m?? (and shift \$1,\$2,\$3,...) ($char){n}\n};
6409 0         0 }
6410             else {
6411             die __FILE__, qq{: "MULTIBYTE$char[$i]" should be "(MULTIBYTE)$char[$i]" in m?? (and shift \$1,\$2,\$3,...) ($char)$char[$i]\n};
6412             }
6413 0         0 }
6414             else {
6415             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6416             }
6417             }
6418             }
6419 187         722  
6420 1358 50       2567 # make regexp string
6421 1358 0 0     2761 $modifier =~ tr/i//d;
6422 0         0 if ($left_e > $right_e) {
6423             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6424             return join '', $ope, $delimiter, $anchor, @char, '>]}' x ($left_e - $right_e), $matched, $end_delimiter, $modifier;
6425 0         0 }
6426             else {
6427             return join '', $ope, $delimiter, $anchor, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
6428 0 100 100     0 }
6429 1358         8156 }
6430             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
6431             return join '', $ope, $delimiter, $anchor, @char, $matched, $end_delimiter, $modifier;
6432 42         362 }
6433             else {
6434             return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6435             }
6436             }
6437              
6438             #
6439             # double quote stuff
6440 1316     540 0 11054 #
6441             sub qq_stuff {
6442             my($delimiter,$end_delimiter,$stuff) = @_;
6443 540 100       920  
6444 540         1114 # scalar variable or array variable
6445             if ($stuff =~ /\A [\$\@] /oxms) {
6446             return $stuff;
6447             }
6448 300         980  
  240         559  
6449 280         764 # quote by delimiter
6450 240 50       647 my %octet = map {$_ => 1} ($stuff =~ /\G ([\x00-\xFF]) /oxmsg);
6451 240 50       415 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6452 240 50       403 next if $char eq $delimiter;
6453 240         443 next if $char eq $end_delimiter;
6454             if (not $octet{$char}) {
6455             return join '', 'qq', $char, $stuff, $char;
6456 240         914 }
6457             }
6458             return join '', 'qq', '<', $stuff, '>';
6459             }
6460              
6461             #
6462             # escape regexp (m'', qr'', and m''b, qr''b)
6463 0     39 0 0 #
6464 39   100     338 sub e_qr_q {
6465             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6466 39         132 $modifier ||= '';
6467 39 50       71  
6468 39         97 $modifier =~ tr/p//d;
6469 0         0 if ($modifier =~ /([adlu])/oxms) {
6470 0 0       0 my $line = 0;
6471 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6472 0         0 if ($filename ne __FILE__) {
6473             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6474             last;
6475 0         0 }
6476             }
6477             die qq{Unsupported modifier "$1" used at line $line.\n};
6478 0         0 }
6479              
6480             $slash = 'div';
6481 39 100       64  
    100          
6482 39         278 # literal null string pattern
6483 8         10 if ($string eq '') {
6484 8         7 $modifier =~ tr/bB//d;
6485             $modifier =~ tr/i//d;
6486             return join '', $ope, $delimiter, $end_delimiter, $modifier;
6487             }
6488              
6489 8         35 # with /b /B modifier
6490             elsif ($modifier =~ tr/bB//d) {
6491             return e_qr_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
6492             }
6493              
6494 17         48 # without /b /B modifier
6495             else {
6496             return e_qr_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
6497             }
6498             }
6499              
6500             #
6501             # escape regexp (m'', qr'')
6502 14     14 0 51 #
6503             sub e_qr_qt {
6504 14 100       38 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6505              
6506             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6507 14         48  
6508             # split regexp
6509             my @char = $string =~ /\G((?>
6510             [^\x8E\x8F\xA1-\xFE\\\[\$\@\/] |
6511             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
6512             \[\^ |
6513             \[\: (?>[a-z]+) \:\] |
6514             \[\:\^ (?>[a-z]+) \:\] |
6515             [\$\@\/] |
6516             \\ (?:$q_char) |
6517             (?:$q_char)
6518             ))/oxmsg;
6519 14         782  
6520 14 50 100     72 # unescape character
    50 100        
    50 66        
    50          
    100          
    50          
6521             for (my $i=0; $i <= $#char; $i++) {
6522             if (0) {
6523             }
6524 27         310  
6525 0         0 # open character class [...]
6526 0 0       0 elsif ($char[$i] eq '[') {
6527 0         0 my $left = $i;
6528             if ($char[$i+1] eq ']') {
6529 0         0 $i++;
6530 0 0       0 }
6531 0         0 while (1) {
6532             if (++$i > $#char) {
6533 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6534 0         0 }
6535             if ($char[$i] eq ']') {
6536             my $right = $i;
6537 0         0  
6538             # [...]
6539 0         0 splice @char, $left, $right-$left+1, Eeucjp::charlist_qr(@char[$left+1..$right-1], $modifier);
6540 0         0  
6541             $i = $left;
6542             last;
6543             }
6544             }
6545             }
6546              
6547 0         0 # open character class [^...]
6548 0 0       0 elsif ($char[$i] eq '[^') {
6549 0         0 my $left = $i;
6550             if ($char[$i+1] eq ']') {
6551 0         0 $i++;
6552 0 0       0 }
6553 0         0 while (1) {
6554             if (++$i > $#char) {
6555 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6556 0         0 }
6557             if ($char[$i] eq ']') {
6558             my $right = $i;
6559 0         0  
6560             # [^...]
6561 0         0 splice @char, $left, $right-$left+1, Eeucjp::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6562 0         0  
6563             $i = $left;
6564             last;
6565             }
6566             }
6567             }
6568              
6569 0         0 # escape $ @ / and \
6570             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6571             $char[$i] = '\\' . $char[$i];
6572             }
6573              
6574 0         0 # rewrite character class or escape character
6575             elsif (my $char = character_class($char[$i],$modifier)) {
6576             $char[$i] = $char;
6577             }
6578              
6579 0 50       0 # /i modifier
6580 4         10 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeucjp::uc($char[$i]) ne Eeucjp::fc($char[$i]))) {
6581             if (CORE::length(Eeucjp::fc($char[$i])) == 1) {
6582             $char[$i] = '[' . Eeucjp::uc($char[$i]) . Eeucjp::fc($char[$i]) . ']';
6583 4         11 }
6584             else {
6585             $char[$i] = '(?:' . Eeucjp::uc($char[$i]) . '|' . Eeucjp::fc($char[$i]) . ')';
6586             }
6587             }
6588              
6589 0 0       0 # quote character before ? + * {
6590             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6591             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
6592 0         0 }
6593             else {
6594             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6595             }
6596             }
6597 0         0 }
6598 14         33  
6599             $delimiter = '/';
6600 14         27 $end_delimiter = '/';
6601 14         86  
6602             $modifier =~ tr/i//d;
6603             return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6604             }
6605              
6606             #
6607             # escape regexp (m''b, qr''b)
6608 14     17 0 142 #
6609             sub e_qr_qb {
6610             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6611 17         44  
6612             # split regexp
6613             my @char = $string =~ /\G ((?>[^\\]|\\\\|[\x00-\xFF])) /oxmsg;
6614 17         78  
6615 17 50       64 # unescape character
    50          
6616             for (my $i=0; $i <= $#char; $i++) {
6617             if (0) {
6618             }
6619 51         172  
6620             # remain \\
6621             elsif ($char[$i] eq '\\\\') {
6622             }
6623              
6624 0         0 # escape $ @ / and \
6625             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6626             $char[$i] = '\\' . $char[$i];
6627             }
6628 0         0 }
6629 17         31  
6630 17         25 $delimiter = '/';
6631             $end_delimiter = '/';
6632             return join '', $ope, $delimiter, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6633             }
6634              
6635             #
6636             # escape regexp (s/here//)
6637 17     122 0 103 #
6638 122   100     362 sub e_s1 {
6639             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6640 122         22079 $modifier ||= '';
6641 122 50       299  
6642 122         430 $modifier =~ tr/p//d;
6643 0         0 if ($modifier =~ /([adlu])/oxms) {
6644 0 0       0 my $line = 0;
6645 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6646 0         0 if ($filename ne __FILE__) {
6647             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6648             last;
6649 0         0 }
6650             }
6651             die qq{Unsupported modifier "$1" used at line $line.\n};
6652 0         0 }
6653              
6654             $slash = 'div';
6655 122 100       421  
    100          
6656 122         467 # literal null string pattern
6657 8         9 if ($string eq '') {
6658 8         9 $modifier =~ tr/bB//d;
6659             $modifier =~ tr/i//d;
6660             return join '', $ope, $delimiter, $end_delimiter, $modifier;
6661             }
6662              
6663             # /b /B modifier
6664             elsif ($modifier =~ tr/bB//d) {
6665 8 50       43  
6666 8         21 # choice again delimiter
6667 0         0 if ($delimiter =~ / [\@:] /oxms) {
  0         0  
6668 0 0       0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
    0          
    0          
    0          
6669 0         0 my %octet = map {$_ => 1} @char;
6670 0         0 if (not $octet{')'}) {
6671             $delimiter = '(';
6672             $end_delimiter = ')';
6673 0         0 }
6674 0         0 elsif (not $octet{'}'}) {
6675             $delimiter = '{';
6676             $end_delimiter = '}';
6677 0         0 }
6678 0         0 elsif (not $octet{']'}) {
6679             $delimiter = '[';
6680             $end_delimiter = ']';
6681 0         0 }
6682 0         0 elsif (not $octet{'>'}) {
6683             $delimiter = '<';
6684             $end_delimiter = '>';
6685 0         0 }
6686 0 0       0 else {
6687 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6688 0         0 if (not $octet{$char}) {
6689 0         0 $delimiter = $char;
6690             $end_delimiter = $char;
6691             last;
6692             }
6693             }
6694             }
6695 0         0 }
6696 8         17  
6697 8         11 my $prematch = '';
6698             $prematch = q{(\G[\x00-\xFF]*?)};
6699             return join '', $ope, $delimiter, $prematch, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
6700 8 100       64 }
6701 106         364  
6702             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6703             my $metachar = qr/[\@\\|[\]{^]/oxms;
6704 106         597  
6705             # split regexp
6706             my @char = $string =~ /\G((?>
6707             [^\x8E\x8F\xA1-\xFE\\\$\@\[\(]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
6708             \\ (?>[1-9][0-9]*) |
6709             \\g (?>\s*) (?>[1-9][0-9]*) |
6710             \\g (?>\s*) \{ (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
6711             \\g (?>\s*) \{ (?>\s*) - (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
6712             \\x (?>[0-9A-Fa-f]{1,2}) |
6713             \\ (?>[0-7]{2,3}) |
6714             \\c [\x40-\x5F] |
6715             \\x\{ (?>[0-9A-Fa-f]+) \} |
6716             \\o\{ (?>[0-7]+) \} |
6717             \\[bBNpP]\{ (?>[^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} |
6718             \\ $q_char |
6719             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
6720             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
6721             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
6722             [\$\@] $qq_variable |
6723             \$ (?>\s* [0-9]+) |
6724             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
6725             \$ \$ (?![\w\{]) |
6726             \$ (?>\s*) \$ (?>\s*) $qq_variable |
6727             \[\^ |
6728             \[\: (?>[a-z]+) :\] |
6729             \[\:\^ (?>[a-z]+) :\] |
6730             \(\? |
6731             $q_char
6732             ))/oxmsg;
6733 106 50       42358  
6734 106         1139 # choice again delimiter
  0         0  
6735 0 0       0 if ($delimiter =~ / [\@:] /oxms) {
    0          
    0          
    0          
6736 0         0 my %octet = map {$_ => 1} @char;
6737 0         0 if (not $octet{')'}) {
6738             $delimiter = '(';
6739             $end_delimiter = ')';
6740 0         0 }
6741 0         0 elsif (not $octet{'}'}) {
6742             $delimiter = '{';
6743             $end_delimiter = '}';
6744 0         0 }
6745 0         0 elsif (not $octet{']'}) {
6746             $delimiter = '[';
6747             $end_delimiter = ']';
6748 0         0 }
6749 0         0 elsif (not $octet{'>'}) {
6750             $delimiter = '<';
6751             $end_delimiter = '>';
6752 0         0 }
6753 0 0       0 else {
6754 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6755 0         0 if (not $octet{$char}) {
6756 0         0 $delimiter = $char;
6757             $end_delimiter = $char;
6758             last;
6759             }
6760             }
6761             }
6762             }
6763 0         0  
  106         232  
6764             # count '('
6765 436         843 my $parens = grep { $_ eq '(' } @char;
6766 106         217  
6767 106         233 my $left_e = 0;
6768             my $right_e = 0;
6769             for (my $i=0; $i <= $#char; $i++) {
6770 106 50 33     407  
    50 33        
    100          
    100          
    50          
    50          
6771 357         2558 # "\L\u" --> "\u\L"
6772             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
6773             @char[$i,$i+1] = @char[$i+1,$i];
6774             }
6775              
6776 0         0 # "\U\l" --> "\l\U"
6777             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
6778             @char[$i,$i+1] = @char[$i+1,$i];
6779             }
6780              
6781 0         0 # octal escape sequence
6782             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
6783             $char[$i] = Eeucjp::octchr($1);
6784             }
6785              
6786 1         5 # hexadecimal escape sequence
6787             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
6788             $char[$i] = Eeucjp::hexchr($1);
6789             }
6790              
6791             # \b{...} --> b\{...}
6792             # \B{...} --> B\{...}
6793             # \N{CHARNAME} --> N\{CHARNAME}
6794             # \p{PROPERTY} --> p\{PROPERTY}
6795 1         3 # \P{PROPERTY} --> P\{PROPERTY}
6796             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} ) \z/oxms) {
6797             $char[$i] = $1 . '\\' . $2;
6798             }
6799              
6800 0         0 # \p, \P, \X --> p, P, X
6801             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
6802             $char[$i] = $1;
6803 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          
6804              
6805             if (0) {
6806             }
6807 357         1356  
6808 0 0 0     0 # join separated multiple-octet
    0 0        
    0 0        
      0        
      0        
      0        
6809 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
6810             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)) {
6811             $char[$i] .= join '', splice @char, $i+1, 3;
6812 0         0 }
6813             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)) {
6814             $char[$i] .= join '', splice @char, $i+1, 2;
6815 0         0 }
6816             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)) {
6817             $char[$i] .= join '', splice @char, $i+1, 1;
6818             }
6819             }
6820              
6821 0         0 # open character class [...]
6822 20 50       37 elsif ($char[$i] eq '[') {
6823 20         73 my $left = $i;
6824             if ($char[$i+1] eq ']') {
6825 0         0 $i++;
6826 20 50       29 }
6827 79         132 while (1) {
6828             if (++$i > $#char) {
6829 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
6830 79         168 }
6831             if ($char[$i] eq ']') {
6832             my $right = $i;
6833 20 50       32  
6834 20         137 # [...]
  0         0  
6835             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6836             splice @char, $left, $right-$left+1, sprintf(q{@{[Eeucjp::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
6837 0         0 }
6838             else {
6839             splice @char, $left, $right-$left+1, Eeucjp::charlist_qr(@char[$left+1..$right-1], $modifier);
6840 20         100 }
6841 20         42  
6842             $i = $left;
6843             last;
6844             }
6845             }
6846             }
6847              
6848 20         66 # open character class [^...]
6849 0 0       0 elsif ($char[$i] eq '[^') {
6850 0         0 my $left = $i;
6851             if ($char[$i+1] eq ']') {
6852 0         0 $i++;
6853 0 0       0 }
6854 0         0 while (1) {
6855             if (++$i > $#char) {
6856 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6857 0         0 }
6858             if ($char[$i] eq ']') {
6859             my $right = $i;
6860 0 0       0  
6861 0         0 # [^...]
  0         0  
6862             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6863             splice @char, $left, $right-$left+1, sprintf(q{@{[Eeucjp::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
6864 0         0 }
6865             else {
6866             splice @char, $left, $right-$left+1, Eeucjp::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6867 0         0 }
6868 0         0  
6869             $i = $left;
6870             last;
6871             }
6872             }
6873             }
6874              
6875 0         0 # rewrite character class or escape character
6876             elsif (my $char = character_class($char[$i],$modifier)) {
6877             $char[$i] = $char;
6878             }
6879              
6880 11 50       27 # /i modifier
6881 5         10 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeucjp::uc($char[$i]) ne Eeucjp::fc($char[$i]))) {
6882             if (CORE::length(Eeucjp::fc($char[$i])) == 1) {
6883             $char[$i] = '[' . Eeucjp::uc($char[$i]) . Eeucjp::fc($char[$i]) . ']';
6884 5         11 }
6885             else {
6886             $char[$i] = '(?:' . Eeucjp::uc($char[$i]) . '|' . Eeucjp::fc($char[$i]) . ')';
6887             }
6888             }
6889              
6890 0 50       0 # \u \l \U \L \F \Q \E
6891 8         23 elsif ($char[$i] =~ /\A [<>] \z/oxms) {
6892             if ($right_e < $left_e) {
6893             $char[$i] = '\\' . $char[$i];
6894             }
6895 0         0 }
6896 0         0 elsif ($char[$i] eq '\u') {
6897             $char[$i] = '@{[Eeucjp::ucfirst qq<';
6898             $left_e++;
6899 0         0 }
6900 0         0 elsif ($char[$i] eq '\l') {
6901             $char[$i] = '@{[Eeucjp::lcfirst qq<';
6902             $left_e++;
6903 0         0 }
6904 0         0 elsif ($char[$i] eq '\U') {
6905             $char[$i] = '@{[Eeucjp::uc qq<';
6906             $left_e++;
6907 0         0 }
6908 0         0 elsif ($char[$i] eq '\L') {
6909             $char[$i] = '@{[Eeucjp::lc qq<';
6910             $left_e++;
6911 0         0 }
6912 0         0 elsif ($char[$i] eq '\F') {
6913             $char[$i] = '@{[Eeucjp::fc qq<';
6914             $left_e++;
6915 0         0 }
6916 5         6 elsif ($char[$i] eq '\Q') {
6917             $char[$i] = '@{[CORE::quotemeta qq<';
6918             $left_e++;
6919 5 50       11 }
6920 5         9 elsif ($char[$i] eq '\E') {
6921 5         9 if ($right_e < $left_e) {
6922             $char[$i] = '>]}';
6923             $right_e++;
6924 5         10 }
6925             else {
6926             $char[$i] = '';
6927             }
6928 0         0 }
6929 0 0       0 elsif ($char[$i] eq '\Q') {
6930 0         0 while (1) {
6931             if (++$i > $#char) {
6932 0 0       0 last;
6933 0         0 }
6934             if ($char[$i] eq '\E') {
6935             last;
6936             }
6937             }
6938             }
6939             elsif ($char[$i] eq '\E') {
6940             }
6941              
6942             # \0 --> \0
6943             elsif ($char[$i] =~ /\A \\ (?>\s*) 0 \z/oxms) {
6944             }
6945              
6946             # \g{N}, \g{-N}
6947              
6948             # P.108 Using Simple Patterns
6949             # in Chapter 7: In the World of Regular Expressions
6950             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
6951              
6952             # P.221 Capturing
6953             # in Chapter 5: Pattern Matching
6954             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
6955              
6956             # \g{-1}, \g{-2}, \g{-3} --> \g{-1}, \g{-2}, \g{-3}
6957             elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) - (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6958             }
6959              
6960 0 0       0 # \g{1}, \g{2}, \g{3} --> \g{2}, \g{3}, \g{4} (only when multibyte anchoring is enable)
6961 0         0 elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6962             if ($1 <= $parens) {
6963             $char[$i] = '\\g{' . ($1 + 1) . '}';
6964             }
6965             }
6966              
6967 0 0       0 # \g1, \g2, \g3 --> \g2, \g3, \g4 (only when multibyte anchoring is enable)
6968 0         0 elsif ($char[$i] =~ /\A \\g (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
6969             if ($1 <= $parens) {
6970             $char[$i] = '\\g' . ($1 + 1);
6971             }
6972             }
6973              
6974 0 0       0 # \1, \2, \3 --> \2, \3, \4 (only when multibyte anchoring is enable)
6975 0         0 elsif ($char[$i] =~ /\A \\ (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
6976             if ($1 <= $parens) {
6977             $char[$i] = '\\' . ($1 + 1);
6978             }
6979             }
6980              
6981 0 0       0 # $0 --> $0
6982 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
6983             if ($ignorecase) {
6984             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6985             }
6986 0 0       0 }
6987 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
6988             if ($ignorecase) {
6989             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
6990             }
6991             }
6992              
6993             # $$ --> $$
6994             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
6995             }
6996              
6997             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6998 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
6999 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
7000 0         0 $char[$i] = e_capture($1);
7001             if ($ignorecase) {
7002             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7003             }
7004 0         0 }
7005 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
7006 0         0 $char[$i] = e_capture($1);
7007             if ($ignorecase) {
7008             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7009             }
7010             }
7011              
7012 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
7013 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) {
7014 0         0 $char[$i] = e_capture($1.'->'.$2);
7015             if ($ignorecase) {
7016             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7017             }
7018             }
7019              
7020 0         0 # $$foo{ ... } --> $ $foo->{ ... }
7021 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) {
7022 0         0 $char[$i] = e_capture($1.'->'.$2);
7023             if ($ignorecase) {
7024             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7025             }
7026             }
7027              
7028 0         0 # $$foo
7029 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
7030 0         0 $char[$i] = e_capture($1);
7031             if ($ignorecase) {
7032             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7033             }
7034             }
7035              
7036 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeucjp::PREMATCH()
7037 4         14 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
7038             if ($ignorecase) {
7039             $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::PREMATCH())]}';
7040 0         0 }
7041             else {
7042             $char[$i] = '@{[Eeucjp::PREMATCH()]}';
7043             }
7044             }
7045              
7046 4 50       14 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeucjp::MATCH()
7047 4         14 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
7048             if ($ignorecase) {
7049             $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::MATCH())]}';
7050 0         0 }
7051             else {
7052             $char[$i] = '@{[Eeucjp::MATCH()]}';
7053             }
7054             }
7055              
7056 4 50       13 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeucjp::POSTMATCH()
7057 3         11 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
7058             if ($ignorecase) {
7059             $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::POSTMATCH())]}';
7060 0         0 }
7061             else {
7062             $char[$i] = '@{[Eeucjp::POSTMATCH()]}';
7063             }
7064             }
7065              
7066 3 0       10 # ${ foo }
7067 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) {
7068             if ($ignorecase) {
7069             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7070             }
7071             }
7072              
7073 0         0 # ${ ... }
7074 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
7075 0         0 $char[$i] = e_capture($1);
7076             if ($ignorecase) {
7077             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7078             }
7079             }
7080              
7081 0         0 # $scalar or @array
7082 9 50       41 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
7083 9         67 $char[$i] = e_string($char[$i]);
7084             if ($ignorecase) {
7085             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7086             }
7087             }
7088              
7089 0 50       0 # quote character before ? + * {
7090             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7091             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
7092 23         142 }
7093             else {
7094             $char[$i-1] = '(?:' . $char[$i-1] . ')';
7095             }
7096             }
7097             }
7098 23         124  
7099 106         259 # make regexp string
7100 106         323 my $prematch = '';
7101 106 50       187 $prematch = "($anchor)";
7102 106         630 $modifier =~ tr/i//d;
7103             if ($left_e > $right_e) {
7104 0         0 return join '', $ope, $delimiter, $prematch, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
7105             }
7106             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
7107             }
7108              
7109             #
7110             # escape regexp (s'here'' or s'here''b)
7111 106     34 0 1309 #
7112 34   100     83 sub e_s1_q {
7113             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7114 34         95 $modifier ||= '';
7115 34 50       44  
7116 34         90 $modifier =~ tr/p//d;
7117 0         0 if ($modifier =~ /([adlu])/oxms) {
7118 0 0       0 my $line = 0;
7119 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7120 0         0 if ($filename ne __FILE__) {
7121             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7122             last;
7123 0         0 }
7124             }
7125             die qq{Unsupported modifier "$1" used at line $line.\n};
7126 0         0 }
7127              
7128             $slash = 'div';
7129 34 100       50  
    100          
7130 34         82 # literal null string pattern
7131 8         10 if ($string eq '') {
7132 8         8 $modifier =~ tr/bB//d;
7133             $modifier =~ tr/i//d;
7134             return join '', $ope, $delimiter, $end_delimiter, $modifier;
7135             }
7136              
7137 8         41 # with /b /B modifier
7138             elsif ($modifier =~ tr/bB//d) {
7139             return e_s1_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
7140             }
7141              
7142 8         20 # without /b /B modifier
7143             else {
7144             return e_s1_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
7145             }
7146             }
7147              
7148             #
7149             # escape regexp (s'here'')
7150 18     18 0 46 #
7151             sub e_s1_qt {
7152 18 100       36 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7153              
7154             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7155 18         68  
7156             # split regexp
7157             my @char = $string =~ /\G((?>
7158             [^\x8E\x8F\xA1-\xFE\\\[\$\@\/] |
7159             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
7160             \[\^ |
7161             \[\: (?>[a-z]+) \:\] |
7162             \[\:\^ (?>[a-z]+) \:\] |
7163             [\$\@\/] |
7164             \\ (?:$q_char) |
7165             (?:$q_char)
7166             ))/oxmsg;
7167 18         505  
7168 18 50 100     70 # unescape character
    50 100        
    50 66        
    100          
    100          
    50          
7169             for (my $i=0; $i <= $#char; $i++) {
7170             if (0) {
7171             }
7172 36         207  
7173 0         0 # open character class [...]
7174 0 0       0 elsif ($char[$i] eq '[') {
7175 0         0 my $left = $i;
7176             if ($char[$i+1] eq ']') {
7177 0         0 $i++;
7178 0 0       0 }
7179 0         0 while (1) {
7180             if (++$i > $#char) {
7181 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
7182 0         0 }
7183             if ($char[$i] eq ']') {
7184             my $right = $i;
7185 0         0  
7186             # [...]
7187 0         0 splice @char, $left, $right-$left+1, Eeucjp::charlist_qr(@char[$left+1..$right-1], $modifier);
7188 0         0  
7189             $i = $left;
7190             last;
7191             }
7192             }
7193             }
7194              
7195 0         0 # open character class [^...]
7196 0 0       0 elsif ($char[$i] eq '[^') {
7197 0         0 my $left = $i;
7198             if ($char[$i+1] eq ']') {
7199 0         0 $i++;
7200 0 0       0 }
7201 0         0 while (1) {
7202             if (++$i > $#char) {
7203 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
7204 0         0 }
7205             if ($char[$i] eq ']') {
7206             my $right = $i;
7207 0         0  
7208             # [^...]
7209 0         0 splice @char, $left, $right-$left+1, Eeucjp::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7210 0         0  
7211             $i = $left;
7212             last;
7213             }
7214             }
7215             }
7216              
7217 0         0 # escape $ @ / and \
7218             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
7219             $char[$i] = '\\' . $char[$i];
7220             }
7221              
7222 0         0 # rewrite character class or escape character
7223             elsif (my $char = character_class($char[$i],$modifier)) {
7224             $char[$i] = $char;
7225             }
7226              
7227 6 50       14 # /i modifier
7228 2         5 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeucjp::uc($char[$i]) ne Eeucjp::fc($char[$i]))) {
7229             if (CORE::length(Eeucjp::fc($char[$i])) == 1) {
7230             $char[$i] = '[' . Eeucjp::uc($char[$i]) . Eeucjp::fc($char[$i]) . ']';
7231 2         5 }
7232             else {
7233             $char[$i] = '(?:' . Eeucjp::uc($char[$i]) . '|' . Eeucjp::fc($char[$i]) . ')';
7234             }
7235             }
7236              
7237 0 0       0 # quote character before ? + * {
7238             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7239             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
7240 0         0 }
7241             else {
7242             $char[$i-1] = '(?:' . $char[$i-1] . ')';
7243             }
7244             }
7245 0         0 }
7246 18         35  
7247 18         28 $modifier =~ tr/i//d;
7248 18         23 $delimiter = '/';
7249 18         24 $end_delimiter = '/';
7250 18         39 my $prematch = '';
7251             $prematch = "($anchor)";
7252             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
7253             }
7254              
7255             #
7256             # escape regexp (s'here''b)
7257 18     8 0 143 #
7258             sub e_s1_qb {
7259             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7260 8         20  
7261             # split regexp
7262             my @char = $string =~ /\G (?>[^\\]|\\\\|[\x00-\xFF]) /oxmsg;
7263 8         32  
7264 8 50       44 # unescape character
    50          
7265             for (my $i=0; $i <= $#char; $i++) {
7266             if (0) {
7267             }
7268 24         77  
7269             # remain \\
7270             elsif ($char[$i] eq '\\\\') {
7271             }
7272              
7273 0         0 # escape $ @ / and \
7274             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
7275             $char[$i] = '\\' . $char[$i];
7276             }
7277 0         0 }
7278 8         12  
7279 8         11 $delimiter = '/';
7280 8         9 $end_delimiter = '/';
7281 8         12 my $prematch = '';
7282             $prematch = q{(\G[\x00-\xFF]*?)};
7283             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
7284             }
7285              
7286             #
7287             # escape regexp (s''here')
7288 8     29 0 56 #
7289             sub e_s2_q {
7290 29         55 my($ope,$delimiter,$end_delimiter,$string) = @_;
7291              
7292 29         45 $slash = 'div';
7293 29         244  
7294 29 100       77 my @char = $string =~ / \G (?>[^\x8E\x8F\xA1-\xFE\\]|\\\\|$q_char) /oxmsg;
    100          
7295             for (my $i=0; $i <= $#char; $i++) {
7296             if (0) {
7297             }
7298 9         32  
7299             # not escape \\
7300             elsif ($char[$i] =~ /\A \\\\ \z/oxms) {
7301             }
7302              
7303 0         0 # escape $ @ / and \
7304             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
7305             $char[$i] = '\\' . $char[$i];
7306             }
7307 5         13 }
7308              
7309             return join '', $ope, $delimiter, @char, $end_delimiter;
7310             }
7311              
7312             #
7313             # escape regexp (s/here/and here/modifier)
7314 29     156 0 95 #
7315 156   100     1221 sub e_sub {
7316             my($variable,$delimiter1,$pattern,$end_delimiter1,$delimiter2,$replacement,$end_delimiter2,$modifier) = @_;
7317 156         664 $modifier ||= '';
7318 156 50       305  
7319 156         598 $modifier =~ tr/p//d;
7320 0         0 if ($modifier =~ /([adlu])/oxms) {
7321 0 0       0 my $line = 0;
7322 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7323 0         0 if ($filename ne __FILE__) {
7324             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7325             last;
7326 0         0 }
7327             }
7328             die qq{Unsupported modifier "$1" used at line $line.\n};
7329 0 100       0 }
7330 156         413  
7331 37         90 if ($variable eq '') {
7332             $variable = '$_';
7333             $bind_operator = ' =~ ';
7334 37         53 }
7335              
7336             $slash = 'div';
7337              
7338             # P.128 Start of match (or end of previous match): \G
7339             # P.130 Advanced Use of \G with Perl
7340             # in Chapter 3: Overview of Regular Expression Features and Flavors
7341             # P.312 Iterative Matching: Scalar Context, with /g
7342             # in Chapter 7: Perl
7343             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
7344              
7345             # P.181 Where You Left Off: The \G Assertion
7346             # in Chapter 5: Pattern Matching
7347             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
7348              
7349             # P.220 Where You Left Off: The \G Assertion
7350             # in Chapter 5: Pattern Matching
7351 156         332 # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7352 156         255  
7353             my $e_modifier = $modifier =~ tr/e//d;
7354 156         271 my $r_modifier = $modifier =~ tr/r//d;
7355 156 50       228  
7356 156         448 my $my = '';
7357 0         0 if ($variable =~ s/\A \( (?>\s*) ( (?>(?: local \b | my \b | our \b | state \b )?) .+ ) \) \z/$1/oxms) {
7358 0         0 $my = $variable;
7359             $variable =~ s/ (?: local \b | my \b | our \b | state \b ) (?>\s*) //oxms;
7360             $variable =~ s/ = .+ \z//oxms;
7361 0         0 }
7362 156         429  
7363             (my $variable_basename = $variable) =~ s/ [\[\{].* \z//oxms;
7364             $variable_basename =~ s/ \s+ \z//oxms;
7365 156         285  
7366 156 100       236 # quote replacement string
7367 156         406 my $e_replacement = '';
7368 17         30 if ($e_modifier >= 1) {
7369             $e_replacement = e_qq('', '', '', $replacement);
7370             $e_modifier--;
7371 17 100       27 }
7372 139         349 else {
7373             if ($delimiter2 eq "'") {
7374             $e_replacement = e_s2_q('qq', '/', '/', $replacement);
7375 29         59 }
7376             else {
7377             $e_replacement = e_qq ('qq', $delimiter2, $end_delimiter2, $replacement);
7378             }
7379 110         403 }
7380              
7381             my $sub = '';
7382 156 100       272  
7383 156 100       444 # with /r
    50          
7384             if ($r_modifier) {
7385             if (0) {
7386             }
7387 8         17  
7388 0 50       0 # s///gr with multibyte anchoring
7389             elsif ($modifier =~ /g/oxms) {
7390             $sub = sprintf(
7391             # 1 2 3 4 5
7392             q,
7393              
7394             $variable, # 1
7395             ($delimiter1 eq "'") ? # 2
7396             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7397             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7398             $s_matched, # 3
7399             $e_replacement, # 4
7400             '$Eeucjp::re_r=CORE::eval $Eeucjp::re_r; ' x $e_modifier, # 5
7401             );
7402             }
7403              
7404 4 0       11 # s///gr without multibyte anchoring
7405             elsif ($modifier =~ /g/oxms) {
7406             $sub = sprintf(
7407             # 1 2 3 4 5
7408             q,
7409              
7410             $variable, # 1
7411             ($delimiter1 eq "'") ? # 2
7412             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7413             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7414             $s_matched, # 3
7415             $e_replacement, # 4
7416             '$Eeucjp::re_r=CORE::eval $Eeucjp::re_r; ' x $e_modifier, # 5
7417             );
7418             }
7419              
7420             # s///r
7421 0         0 else {
7422 4         5  
7423             my $prematch = q{$`};
7424 4 50       5 $prematch = q{${1}};
7425              
7426             $sub = sprintf(
7427             # 1 2 3 4 5 6 7
7428             q<(%s =~ %s) ? CORE::eval{%s local $^W=0; local $Eeucjp::re_r=%s; %s"%s$Eeucjp::re_r$'" } : %s>,
7429              
7430             $variable, # 1
7431             ($delimiter1 eq "'") ? # 2
7432             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7433             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7434             $s_matched, # 3
7435             $e_replacement, # 4
7436             '$Eeucjp::re_r=CORE::eval $Eeucjp::re_r; ' x $e_modifier, # 5
7437             $prematch, # 6
7438             $variable, # 7
7439             );
7440             }
7441 4 50       17  
7442 8         20 # $var !~ s///r doesn't make sense
7443             if ($bind_operator =~ / !~ /oxms) {
7444             $sub = q{die("$0: Using !~ with s///r doesn't make sense"), } . $sub;
7445             }
7446             }
7447              
7448 0 100       0 # without /r
    50          
7449             else {
7450             if (0) {
7451             }
7452 148         575  
7453 0 100       0 # s///g with multibyte anchoring
    100          
7454             elsif ($modifier =~ /g/oxms) {
7455             $sub = sprintf(
7456             # 1 2 3 4 5 6 7 8 9 10
7457             q,
7458              
7459             $variable, # 1
7460             ($delimiter1 eq "'") ? # 2
7461             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7462             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7463             $s_matched, # 3
7464             $e_replacement, # 4
7465             '$Eeucjp::re_r=CORE::eval $Eeucjp::re_r; ' x $e_modifier, # 5
7466             $variable, # 6
7467             $variable, # 7
7468             $variable, # 8
7469             $variable, # 9
7470              
7471             # Binary "!~" is just like "=~" except the return value is negated in the logical sense.
7472             # It returns false if the match succeeds, and true if it fails.
7473             # (and so on)
7474              
7475             ($bind_operator =~ / !~ /oxms) ? '!' : '', # 10
7476             );
7477             }
7478              
7479 29 0       352 # s///g without multibyte anchoring
    0          
7480             elsif ($modifier =~ /g/oxms) {
7481             $sub = sprintf(
7482             # 1 2 3 4 5 6 7 8
7483             q,
7484              
7485             $variable, # 1
7486             ($delimiter1 eq "'") ? # 2
7487             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7488             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7489             $s_matched, # 3
7490             $e_replacement, # 4
7491             '$Eeucjp::re_r=CORE::eval $Eeucjp::re_r; ' x $e_modifier, # 5
7492             $variable, # 6
7493             $variable, # 7
7494             ($bind_operator =~ / !~ /oxms) ? '!' : '', # 8
7495             );
7496             }
7497              
7498             # s///
7499 0         0 else {
7500 119         196  
7501             my $prematch = q{$`};
7502 119 100       175 $prematch = q{${1}};
    100          
7503              
7504             $sub = sprintf(
7505              
7506             ($bind_operator =~ / =~ /oxms) ?
7507              
7508             # 1 2 3 4 5 6 7 8
7509             q<(%s%s%s) ? CORE::eval{%s local $^W=0; local $Eeucjp::re_r=%s; %s%s="%s$Eeucjp::re_r$'"; 1 } : undef> :
7510              
7511             # 1 2 3 4 5 6 7 8
7512             q<(%s%s%s) ? 1 : CORE::eval{%s local $^W=0; local $Eeucjp::re_r=%s; %s%s="%s$Eeucjp::re_r$'"; undef }>,
7513              
7514             $variable, # 1
7515             $bind_operator, # 2
7516             ($delimiter1 eq "'") ? # 3
7517             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7518             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7519             $s_matched, # 4
7520             $e_replacement, # 5
7521             '$Eeucjp::re_r=CORE::eval $Eeucjp::re_r; ' x $e_modifier, # 6
7522             $variable, # 7
7523             $prematch, # 8
7524             );
7525             }
7526             }
7527 119 50       647  
7528 156         472 # (my $foo = $bar) =~ s/// --> (my $foo = $bar, CORE::eval { ... })[1]
7529             if ($my ne '') {
7530             $sub = "($my, $sub)[1]";
7531             }
7532 0         0  
7533 156         248 # clear s/// variable
7534             $sub_variable = '';
7535 156         220 $bind_operator = '';
7536              
7537             return $sub;
7538             }
7539              
7540             #
7541             # escape regexp of split qr//
7542 156     137 0 1709 #
7543 137   100     572 sub e_split {
7544             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7545 137         626 $modifier ||= '';
7546 137 50       238  
7547 137         318 $modifier =~ tr/p//d;
7548 0         0 if ($modifier =~ /([adlu])/oxms) {
7549 0 0       0 my $line = 0;
7550 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7551 0         0 if ($filename ne __FILE__) {
7552             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7553             last;
7554 0         0 }
7555             }
7556             die qq{Unsupported modifier "$1" used at line $line.\n};
7557 0         0 }
7558              
7559             $slash = 'div';
7560 137 100       224  
7561 137         269 # /b /B modifier
7562             if ($modifier =~ tr/bB//d) {
7563             return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
7564 18 100       88 }
7565 119         290  
7566             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7567             my $metachar = qr/[\@\\|[\]{^]/oxms;
7568 119         1513  
7569             # split regexp
7570             my @char = $string =~ /\G((?>
7571             [^\x8E\x8F\xA1-\xFE\\\$\@\[\(]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
7572             \\x (?>[0-9A-Fa-f]{1,2}) |
7573             \\ (?>[0-7]{2,3}) |
7574             \\c [\x40-\x5F] |
7575             \\x\{ (?>[0-9A-Fa-f]+) \} |
7576             \\o\{ (?>[0-7]+) \} |
7577             \\[bBNpP]\{ (?>[^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} |
7578             \\ $q_char |
7579             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
7580             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
7581             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
7582             [\$\@] $qq_variable |
7583             \$ (?>\s* [0-9]+) |
7584             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
7585             \$ \$ (?![\w\{]) |
7586             \$ (?>\s*) \$ (?>\s*) $qq_variable |
7587             \[\^ |
7588             \[\: (?>[a-z]+) :\] |
7589             \[\:\^ (?>[a-z]+) :\] |
7590             \(\? |
7591             $q_char
7592 119         17823 ))/oxmsg;
7593 119         490  
7594 119         179 my $left_e = 0;
7595             my $right_e = 0;
7596             for (my $i=0; $i <= $#char; $i++) {
7597 119 50 33     342  
    50 33        
    100          
    100          
    50          
    50          
7598 302         1672 # "\L\u" --> "\u\L"
7599             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
7600             @char[$i,$i+1] = @char[$i+1,$i];
7601             }
7602              
7603 0         0 # "\U\l" --> "\l\U"
7604             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
7605             @char[$i,$i+1] = @char[$i+1,$i];
7606             }
7607              
7608 0         0 # octal escape sequence
7609             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
7610             $char[$i] = Eeucjp::octchr($1);
7611             }
7612              
7613 1         5 # hexadecimal escape sequence
7614             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
7615             $char[$i] = Eeucjp::hexchr($1);
7616             }
7617              
7618             # \b{...} --> b\{...}
7619             # \B{...} --> B\{...}
7620             # \N{CHARNAME} --> N\{CHARNAME}
7621             # \p{PROPERTY} --> p\{PROPERTY}
7622 1         3 # \P{PROPERTY} --> P\{PROPERTY}
7623             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\x8E\x8F\xA1-\xFE0-9\}][^\x8E\x8F\xA1-\xFE\}]*) \} ) \z/oxms) {
7624             $char[$i] = $1 . '\\' . $2;
7625             }
7626              
7627 0         0 # \p, \P, \X --> p, P, X
7628             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
7629             $char[$i] = $1;
7630 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          
7631              
7632             if (0) {
7633             }
7634 302         965  
7635 0 0 0     0 # join separated multiple-octet
    0 0        
    0 0        
      0        
      0        
      0        
7636 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
7637             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)) {
7638             $char[$i] .= join '', splice @char, $i+1, 3;
7639 0         0 }
7640             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)) {
7641             $char[$i] .= join '', splice @char, $i+1, 2;
7642 0         0 }
7643             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)) {
7644             $char[$i] .= join '', splice @char, $i+1, 1;
7645             }
7646             }
7647              
7648 0         0 # open character class [...]
7649 3 50       6 elsif ($char[$i] eq '[') {
7650 3         8 my $left = $i;
7651             if ($char[$i+1] eq ']') {
7652 0         0 $i++;
7653 3 50       3 }
7654 7         13 while (1) {
7655             if (++$i > $#char) {
7656 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
7657 7         13 }
7658             if ($char[$i] eq ']') {
7659             my $right = $i;
7660 3 50       4  
7661 3         14 # [...]
  0         0  
7662             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7663             splice @char, $left, $right-$left+1, sprintf(q{@{[Eeucjp::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
7664 0         0 }
7665             else {
7666             splice @char, $left, $right-$left+1, Eeucjp::charlist_qr(@char[$left+1..$right-1], $modifier);
7667 3         13 }
7668 3         5  
7669             $i = $left;
7670             last;
7671             }
7672             }
7673             }
7674              
7675 3         6 # open character class [^...]
7676 1 50       3 elsif ($char[$i] eq '[^') {
7677 1         3 my $left = $i;
7678             if ($char[$i+1] eq ']') {
7679 0         0 $i++;
7680 1 50       2 }
7681 2         5 while (1) {
7682             if (++$i > $#char) {
7683 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
7684 2         4 }
7685             if ($char[$i] eq ']') {
7686             my $right = $i;
7687 1 50       2  
7688 1         8 # [^...]
  0         0  
7689             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7690             splice @char, $left, $right-$left+1, sprintf(q{@{[Eeucjp::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
7691 0         0 }
7692             else {
7693             splice @char, $left, $right-$left+1, Eeucjp::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7694 1         6 }
7695 1         2  
7696             $i = $left;
7697             last;
7698             }
7699             }
7700             }
7701              
7702 1         3 # rewrite character class or escape character
7703             elsif (my $char = character_class($char[$i],$modifier)) {
7704             $char[$i] = $char;
7705             }
7706              
7707             # P.794 29.2.161. split
7708             # in Chapter 29: Functions
7709             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
7710              
7711             # P.951 split
7712             # in Chapter 27: Functions
7713             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7714              
7715             # said "The //m modifier is assumed when you split on the pattern /^/",
7716             # but perl5.008 is not so. Therefore, this software adds //m.
7717             # (and so on)
7718              
7719 5         16 # split(m/^/) --> split(m/^/m)
7720             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
7721             $modifier .= 'm';
7722             }
7723              
7724 11 50       36 # /i modifier
7725 6         15 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeucjp::uc($char[$i]) ne Eeucjp::fc($char[$i]))) {
7726             if (CORE::length(Eeucjp::fc($char[$i])) == 1) {
7727             $char[$i] = '[' . Eeucjp::uc($char[$i]) . Eeucjp::fc($char[$i]) . ']';
7728 6         15 }
7729             else {
7730             $char[$i] = '(?:' . Eeucjp::uc($char[$i]) . '|' . Eeucjp::fc($char[$i]) . ')';
7731             }
7732             }
7733              
7734 0 50       0 # \u \l \U \L \F \Q \E
7735 2         8 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
7736             if ($right_e < $left_e) {
7737             $char[$i] = '\\' . $char[$i];
7738             }
7739 0         0 }
7740 0         0 elsif ($char[$i] eq '\u') {
7741             $char[$i] = '@{[Eeucjp::ucfirst qq<';
7742             $left_e++;
7743 0         0 }
7744 0         0 elsif ($char[$i] eq '\l') {
7745             $char[$i] = '@{[Eeucjp::lcfirst qq<';
7746             $left_e++;
7747 0         0 }
7748 0         0 elsif ($char[$i] eq '\U') {
7749             $char[$i] = '@{[Eeucjp::uc qq<';
7750             $left_e++;
7751 0         0 }
7752 0         0 elsif ($char[$i] eq '\L') {
7753             $char[$i] = '@{[Eeucjp::lc qq<';
7754             $left_e++;
7755 0         0 }
7756 0         0 elsif ($char[$i] eq '\F') {
7757             $char[$i] = '@{[Eeucjp::fc qq<';
7758             $left_e++;
7759 0         0 }
7760 0         0 elsif ($char[$i] eq '\Q') {
7761             $char[$i] = '@{[CORE::quotemeta qq<';
7762             $left_e++;
7763 0 0       0 }
7764 0         0 elsif ($char[$i] eq '\E') {
7765 0         0 if ($right_e < $left_e) {
7766             $char[$i] = '>]}';
7767             $right_e++;
7768 0         0 }
7769             else {
7770             $char[$i] = '';
7771             }
7772 0         0 }
7773 0 0       0 elsif ($char[$i] eq '\Q') {
7774 0         0 while (1) {
7775             if (++$i > $#char) {
7776 0 0       0 last;
7777 0         0 }
7778             if ($char[$i] eq '\E') {
7779             last;
7780             }
7781             }
7782             }
7783             elsif ($char[$i] eq '\E') {
7784             }
7785              
7786 0 0       0 # $0 --> $0
7787 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
7788             if ($ignorecase) {
7789             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7790             }
7791 0 0       0 }
7792 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
7793             if ($ignorecase) {
7794             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7795             }
7796             }
7797              
7798             # $$ --> $$
7799             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
7800             }
7801              
7802             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
7803 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
7804 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
7805 0         0 $char[$i] = e_capture($1);
7806             if ($ignorecase) {
7807             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7808             }
7809 0         0 }
7810 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
7811 0         0 $char[$i] = e_capture($1);
7812             if ($ignorecase) {
7813             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7814             }
7815             }
7816              
7817 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
7818 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) {
7819 0         0 $char[$i] = e_capture($1.'->'.$2);
7820             if ($ignorecase) {
7821             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7822             }
7823             }
7824              
7825 0         0 # $$foo{ ... } --> $ $foo->{ ... }
7826 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) {
7827 0         0 $char[$i] = e_capture($1.'->'.$2);
7828             if ($ignorecase) {
7829             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7830             }
7831             }
7832              
7833 0         0 # $$foo
7834 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
7835 0         0 $char[$i] = e_capture($1);
7836             if ($ignorecase) {
7837             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7838             }
7839             }
7840              
7841 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eeucjp::PREMATCH()
7842 12         30 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
7843             if ($ignorecase) {
7844             $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::PREMATCH())]}';
7845 0         0 }
7846             else {
7847             $char[$i] = '@{[Eeucjp::PREMATCH()]}';
7848             }
7849             }
7850              
7851 12 50       82 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eeucjp::MATCH()
7852 12         35 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
7853             if ($ignorecase) {
7854             $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::MATCH())]}';
7855 0         0 }
7856             else {
7857             $char[$i] = '@{[Eeucjp::MATCH()]}';
7858             }
7859             }
7860              
7861 12 50       53 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eeucjp::POSTMATCH()
7862 9         25 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
7863             if ($ignorecase) {
7864             $char[$i] = '@{[Eeucjp::ignorecase(Eeucjp::POSTMATCH())]}';
7865 0         0 }
7866             else {
7867             $char[$i] = '@{[Eeucjp::POSTMATCH()]}';
7868             }
7869             }
7870              
7871 9 0       55 # ${ foo }
7872 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) {
7873             if ($ignorecase) {
7874             $char[$i] = '@{[Eeucjp::ignorecase(' . $1 . ')]}';
7875             }
7876             }
7877              
7878 0         0 # ${ ... }
7879 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
7880 0         0 $char[$i] = e_capture($1);
7881             if ($ignorecase) {
7882             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7883             }
7884             }
7885              
7886 0         0 # $scalar or @array
7887 3 50       10 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
7888 3         14 $char[$i] = e_string($char[$i]);
7889             if ($ignorecase) {
7890             $char[$i] = '@{[Eeucjp::ignorecase(' . $char[$i] . ')]}';
7891             }
7892             }
7893              
7894 0 100       0 # quote character before ? + * {
7895             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7896             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
7897 7         38 }
7898             else {
7899             $char[$i-1] = '(?:' . $char[$i-1] . ')';
7900             }
7901             }
7902             }
7903 4         22  
7904 119 50       234 # make regexp string
7905 119         1348 $modifier =~ tr/i//d;
7906             if ($left_e > $right_e) {
7907 0         0 return join '', 'Eeucjp::split', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter, $modifier;
7908             }
7909             return join '', 'Eeucjp::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
7910             }
7911              
7912             #
7913             # escape regexp of split qr''
7914 119     24 0 1173 #
7915 24   100     139 sub e_split_q {
7916             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7917 24         81 $modifier ||= '';
7918 24 50       46  
7919 24         69 $modifier =~ tr/p//d;
7920 0         0 if ($modifier =~ /([adlu])/oxms) {
7921 0 0       0 my $line = 0;
7922 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7923 0         0 if ($filename ne __FILE__) {
7924             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7925             last;
7926 0         0 }
7927             }
7928             die qq{Unsupported modifier "$1" used at line $line.\n};
7929 0         0 }
7930              
7931             $slash = 'div';
7932 24 100       42  
7933 24         56 # /b /B modifier
7934             if ($modifier =~ tr/bB//d) {
7935             return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
7936 12 100       81 }
7937              
7938             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7939 12         32  
7940             # split regexp
7941             my @char = $string =~ /\G((?>
7942             [^\x8E\x8F\xA1-\xFE\\\[] |
7943             [\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\x00-\xFF] |
7944             \[\^ |
7945             \[\: (?>[a-z]+) \:\] |
7946             \[\:\^ (?>[a-z]+) \:\] |
7947             \\ (?:$q_char) |
7948             (?:$q_char)
7949             ))/oxmsg;
7950 12         197  
7951 12 50 33     49 # unescape character
    50 100        
    50 66        
    50 33        
    100          
    50          
7952             for (my $i=0; $i <= $#char; $i++) {
7953             if (0) {
7954             }
7955 12         67  
7956 0         0 # open character class [...]
7957 0 0       0 elsif ($char[$i] eq '[') {
7958 0         0 my $left = $i;
7959             if ($char[$i+1] eq ']') {
7960 0         0 $i++;
7961 0 0       0 }
7962 0         0 while (1) {
7963             if (++$i > $#char) {
7964 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
7965 0         0 }
7966             if ($char[$i] eq ']') {
7967             my $right = $i;
7968 0         0  
7969             # [...]
7970 0         0 splice @char, $left, $right-$left+1, Eeucjp::charlist_qr(@char[$left+1..$right-1], $modifier);
7971 0         0  
7972             $i = $left;
7973             last;
7974             }
7975             }
7976             }
7977              
7978 0         0 # open character class [^...]
7979 0 0       0 elsif ($char[$i] eq '[^') {
7980 0         0 my $left = $i;
7981             if ($char[$i+1] eq ']') {
7982 0         0 $i++;
7983 0 0       0 }
7984 0         0 while (1) {
7985             if (++$i > $#char) {
7986 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
7987 0         0 }
7988             if ($char[$i] eq ']') {
7989             my $right = $i;
7990 0         0  
7991             # [^...]
7992 0         0 splice @char, $left, $right-$left+1, Eeucjp::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7993 0         0  
7994             $i = $left;
7995             last;
7996             }
7997             }
7998             }
7999              
8000 0         0 # rewrite character class or escape character
8001             elsif (my $char = character_class($char[$i],$modifier)) {
8002             $char[$i] = $char;
8003             }
8004              
8005 0         0 # split(m/^/) --> split(m/^/m)
8006             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
8007             $modifier .= 'm';
8008             }
8009              
8010 0 50       0 # /i modifier
8011 4         10 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eeucjp::uc($char[$i]) ne Eeucjp::fc($char[$i]))) {
8012             if (CORE::length(Eeucjp::fc($char[$i])) == 1) {
8013             $char[$i] = '[' . Eeucjp::uc($char[$i]) . Eeucjp::fc($char[$i]) . ']';
8014 4         61 }
8015             else {
8016             $char[$i] = '(?:' . Eeucjp::uc($char[$i]) . '|' . Eeucjp::fc($char[$i]) . ')';
8017             }
8018             }
8019              
8020 0 0       0 # quote character before ? + * {
8021             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
8022             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
8023 0         0 }
8024             else {
8025             $char[$i-1] = '(?:' . $char[$i-1] . ')';
8026             }
8027             }
8028 0         0 }
8029 12         31  
8030             $modifier =~ tr/i//d;
8031             return join '', 'Eeucjp::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
8032             }
8033              
8034             #
8035             # instead of Carp::carp
8036 12     0 0 92 #
8037 0           sub carp {
8038             my($package,$filename,$line) = caller(1);
8039             print STDERR "@_ at $filename line $line.\n";
8040             }
8041              
8042             #
8043             # instead of Carp::croak
8044 0     0 0   #
8045 0           sub croak {
8046 0           my($package,$filename,$line) = caller(1);
8047             print STDERR "@_ at $filename line $line.\n";
8048             die "\n";
8049             }
8050              
8051             #
8052             # instead of Carp::cluck
8053 0     0 0   #
8054 0           sub cluck {
8055 0           my $i = 0;
8056 0           my @cluck = ();
8057 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
8058             push @cluck, "[$i] $filename($line) $package::$subroutine\n";
8059 0           $i++;
8060 0           }
8061 0           print STDERR CORE::reverse @cluck;
8062             print STDERR "\n";
8063             print STDERR @_;
8064             }
8065              
8066             #
8067             # instead of Carp::confess
8068 0     0 0   #
8069 0           sub confess {
8070 0           my $i = 0;
8071 0           my @confess = ();
8072 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
8073             push @confess, "[$i] $filename($line) $package::$subroutine\n";
8074 0           $i++;
8075 0           }
8076 0           print STDERR CORE::reverse @confess;
8077 0           print STDERR "\n";
8078             print STDERR @_;
8079             die "\n";
8080             }
8081              
8082             1;
8083              
8084             __END__