File Coverage

blib/lib/Eksc5601.pm
Criterion Covered Total %
statement 1072 2885 37.1
branch 1037 2474 41.9
condition 145 361 40.1
subroutine 59 116 50.8
pod 7 76 9.2
total 2320 5912 39.2


line stmt bran cond sub pod time code
1             package Eksc5601;
2 331     331   2010 use strict;
  331         538  
  331         13098  
3 331 50   331   6072 BEGIN { $INC{'warnings.pm'} = '' if $] < 5.006 } use warnings;
  331     331   1392  
  331         483  
  331         9407  
4             ######################################################################
5             #
6             # Eksc5601 - Run-time routines for KSC5601.pm
7             #
8             # http://search.cpan.org/dist/Char-KSC5601/
9             #
10             # Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2018, 2019 INABA Hitoshi
11             ######################################################################
12              
13 331     331   5120 use 5.00503; # Galapagos Consensus 1998 for primetools
  331         1301  
14             # use 5.008001; # Lancaster Consensus 2013 for toolchains
15              
16             # 12.3. Delaying use Until Runtime
17             # in Chapter 12. Packages, Libraries, and Modules
18             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
19             # (and so on)
20              
21             # Version numbers should be boring
22             # http://www.dagolden.com/index.php/369/version-numbers-should-be-boring/
23             # For the impatient, the disinterested or those who just want to follow
24             # a recipe, my advice for all modules is this:
25             # our $VERSION = "0.001"; # or "0.001_001" for a dev release
26             # $VERSION = eval $VERSION; # No!! because '1.10' makes '1.1'
27              
28 331     331   2185 use vars qw($VERSION);
  331         637  
  331         47047  
29             $VERSION = '1.22';
30             $VERSION = $VERSION;
31              
32             BEGIN {
33 331 50   331   2042 if ($^X =~ / jperl /oxmsi) {
34 0         0 die __FILE__, ": needs perl(not jperl) 5.00503 or later. (\$^X==$^X)\n";
35             }
36 331         538 if (CORE::ord('A') == 193) {
37             die __FILE__, ": is not US-ASCII script (may be EBCDIC or EBCDIK script).\n";
38             }
39 331         42372 if (CORE::ord('A') != 0x41) {
40             die __FILE__, ": is not US-ASCII script (must be US-ASCII script).\n";
41             }
42             }
43              
44             BEGIN {
45              
46             # instead of utf8.pm
47 331     331   21084 CORE::eval q{
  331     331   1943  
  331     114   672  
  331         35430  
  0         0  
  0         0  
  0         0  
  0         0  
48             no warnings qw(redefine);
49             *utf8::upgrade = sub { CORE::length $_[0] };
50             *utf8::downgrade = sub { 1 };
51             *utf8::encode = sub { };
52             *utf8::decode = sub { 1 };
53             *utf8::is_utf8 = sub { };
54             *utf8::valid = sub { 1 };
55             };
56 331 50       132841 if ($@) {
57 0         0 *utf8::upgrade = sub { CORE::length $_[0] };
  0         0  
58 0         0 *utf8::downgrade = sub { 1 };
  0         0  
59 0         0 *utf8::encode = sub { };
60 0         0 *utf8::decode = sub { 1 };
  0         0  
61 0         0 *utf8::is_utf8 = sub { };
62 0         0 *utf8::valid = sub { 1 };
  0         0  
63             }
64             }
65              
66             # instead of Symbol.pm
67 0         0 BEGIN {
68             sub gensym () {
69 0 0   0 0 0 if ($] < 5.006) {
70 0         0 return \do { local *_ };
  0         0  
71             }
72             else {
73 0         0 return undef;
74             }
75             }
76              
77             sub qualify ($$) {
78 0     0 0 0 my($name) = @_;
79              
80 0 0       0 if (ref $name) {
    0          
    0          
    0          
    0          
    0          
    0          
81 0         0 return $name;
82             }
83             elsif (Eksc5601::index($name,'::') >= 0) {
84 0         0 return $name;
85             }
86             elsif (Eksc5601::index($name,"'") >= 0) {
87 0         0 return $name;
88             }
89              
90             # special character, "^xyz"
91             elsif ($name =~ /\A \^ [ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]+ \z/x) {
92              
93             # RGS 2001-11-05 : translate leading ^X to control-char
94 0         0 $name =~ s{\A \^ ([ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]) }{'qq(\c'.$1.')'}xee;
  0         0  
95 0         0 return 'main::' . $name;
96             }
97              
98             # Global names
99             elsif ($name =~ /\A (?: ARGV | ARGVOUT | ENV | INC | SIG | STDERR | STDIN | STDOUT ) \z/x) {
100 0         0 return 'main::' . $name;
101             }
102              
103             # or other
104             elsif ($name =~ /\A [^ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz] \z/x) {
105 0         0 return 'main::' . $name;
106             }
107              
108             elsif (defined $_[1]) {
109 0         0 return $_[1] . '::' . $name;
110             }
111             else {
112 0         0 return (caller)[0] . '::' . $name;
113             }
114             }
115              
116             sub qualify_to_ref ($;$) {
117 0 0   0 0 0 if (defined $_[1]) {
118 331     331   2249 no strict qw(refs);
  331         586  
  331         21370  
119 0         0 return \*{ qualify $_[0], $_[1] };
  0         0  
120             }
121             else {
122 331     331   1954 no strict qw(refs);
  331     0   661  
  331         55094  
123 0         0 return \*{ qualify $_[0], (caller)[0] };
  0         0  
124             }
125             }
126             }
127              
128             # P.714 29.2.39. flock
129             # in Chapter 29: Functions
130             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
131              
132             # P.863 flock
133             # in Chapter 27: Functions
134             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
135              
136             sub LOCK_SH() {1}
137             sub LOCK_EX() {2}
138             sub LOCK_UN() {8}
139             sub LOCK_NB() {4}
140              
141             # instead of Carp.pm
142             sub carp;
143             sub croak;
144             sub cluck;
145             sub confess;
146              
147             # 6.18. Matching Multiple-Byte Characters
148             # in Chapter 6. Pattern Matching
149             # of ISBN 978-1-56592-243-3 Perl Perl Cookbook.
150             # (and so on)
151              
152             # regexp of character
153             my $your_char = q{[\xA1-\xFE][\x00-\xFF]|[\x00-\xFF]};
154 331     331   2212 use vars qw($qq_char); $qq_char = qr/\\c[\x40-\x5F]|\\?(?:$your_char)/oxms;
  331         818  
  331         20146  
155 331     331   3204 use vars qw($q_char); $q_char = qr/$your_char/oxms;
  331         2266  
  331         329193  
156              
157             #
158             # KSC5601 character range per length
159             #
160             my %range_tr = ();
161              
162             #
163             # KSC5601 case conversion
164             #
165             my %lc = ();
166             @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)} =
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             my %uc = ();
169             @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)} =
170             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);
171             my %fc = ();
172             @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)} =
173             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);
174              
175             if (0) {
176             }
177              
178             elsif (__PACKAGE__ =~ / \b Eksc5601 \z/oxms) {
179             %range_tr = (
180             1 => [ [0x00..0xA0],
181             [0xFF..0xFF],
182             ],
183             2 => [ [0xA1..0xFE],[0xA1..0xFE],
184             ],
185             );
186             }
187              
188             else {
189             croak "Don't know my package name '@{[__PACKAGE__]}'";
190             }
191              
192             #
193             # @ARGV wildcard globbing
194             #
195             sub import {
196              
197 0 0   0   0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
198 0         0 my @argv = ();
199 0         0 for (@ARGV) {
200              
201             # has space
202 0 0       0 if (/\A (?:$q_char)*? [ ] /oxms) {
    0          
203 0 0       0 if (my @glob = Eksc5601::glob(qq{"$_"})) {
204 0         0 push @argv, @glob;
205             }
206             else {
207 0         0 push @argv, $_;
208             }
209             }
210              
211             # has wildcard metachar
212             elsif (/\A (?:$q_char)*? [*?] /oxms) {
213 0 0       0 if (my @glob = Eksc5601::glob($_)) {
214 0         0 push @argv, @glob;
215             }
216             else {
217 0         0 push @argv, $_;
218             }
219             }
220              
221             # no wildcard globbing
222             else {
223 0         0 push @argv, $_;
224             }
225             }
226 0         0 @ARGV = @argv;
227             }
228              
229 0         0 *Char::ord = \&KSC5601::ord;
230 0         0 *Char::ord_ = \&KSC5601::ord_;
231 0         0 *Char::reverse = \&KSC5601::reverse;
232 0         0 *Char::getc = \&KSC5601::getc;
233 0         0 *Char::length = \&KSC5601::length;
234 0         0 *Char::substr = \&KSC5601::substr;
235 0         0 *Char::index = \&KSC5601::index;
236 0         0 *Char::rindex = \&KSC5601::rindex;
237 0         0 *Char::eval = \&KSC5601::eval;
238 0         0 *Char::escape = \&KSC5601::escape;
239 0         0 *Char::escape_token = \&KSC5601::escape_token;
240 0         0 *Char::escape_script = \&KSC5601::escape_script;
241             }
242              
243             # P.230 Care with Prototypes
244             # in Chapter 6: Subroutines
245             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
246             #
247             # If you aren't careful, you can get yourself into trouble with prototypes.
248             # But if you are careful, you can do a lot of neat things with them. This is
249             # all very powerful, of course, and should only be used in moderation to make
250             # the world a better place.
251              
252             # P.332 Care with Prototypes
253             # in Chapter 7: Subroutines
254             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
255             #
256             # If you aren't careful, you can get yourself into trouble with prototypes.
257             # But if you are careful, you can do a lot of neat things with them. This is
258             # all very powerful, of course, and should only be used in moderation to make
259             # the world a better place.
260              
261             #
262             # Prototypes of subroutines
263             #
264       0     sub unimport {}
265             sub Eksc5601::split(;$$$);
266             sub Eksc5601::tr($$$$;$);
267             sub Eksc5601::chop(@);
268             sub Eksc5601::index($$;$);
269             sub Eksc5601::rindex($$;$);
270             sub Eksc5601::lcfirst(@);
271             sub Eksc5601::lcfirst_();
272             sub Eksc5601::lc(@);
273             sub Eksc5601::lc_();
274             sub Eksc5601::ucfirst(@);
275             sub Eksc5601::ucfirst_();
276             sub Eksc5601::uc(@);
277             sub Eksc5601::uc_();
278             sub Eksc5601::fc(@);
279             sub Eksc5601::fc_();
280             sub Eksc5601::ignorecase;
281             sub Eksc5601::classic_character_class;
282             sub Eksc5601::capture;
283             sub Eksc5601::chr(;$);
284             sub Eksc5601::chr_();
285             sub Eksc5601::glob($);
286             sub Eksc5601::glob_();
287              
288             sub KSC5601::ord(;$);
289             sub KSC5601::ord_();
290             sub KSC5601::reverse(@);
291             sub KSC5601::getc(;*@);
292             sub KSC5601::length(;$);
293             sub KSC5601::substr($$;$$);
294             sub KSC5601::index($$;$);
295             sub KSC5601::rindex($$;$);
296             sub KSC5601::escape(;$);
297              
298             #
299             # Regexp work
300             #
301 331         33163 use vars qw(
302             $re_a
303             $re_t
304             $re_n
305             $re_r
306 331     331   2402 );
  331         5591  
307              
308             #
309             # Character class
310             #
311 331         90160 use vars qw(
312             $dot
313             $dot_s
314             $eD
315             $eS
316             $eW
317             $eH
318             $eV
319             $eR
320             $eN
321             $not_alnum
322             $not_alpha
323             $not_ascii
324             $not_blank
325             $not_cntrl
326             $not_digit
327             $not_graph
328             $not_lower
329             $not_lower_i
330             $not_print
331             $not_punct
332             $not_space
333             $not_upper
334             $not_upper_i
335             $not_word
336             $not_xdigit
337             $eb
338             $eB
339 331     331   5180 );
  331         601  
340              
341 331         3589518 use vars qw(
342             $anchor
343             $matched
344 331     331   4889 );
  331         6559  
345             ${Eksc5601::anchor} = qr{\G(?>[^\xA1-\xFE]|[\xA1-\xFE][\x00-\xFF])*?}oxms;
346             my $q_char_SADAHIRO_Tomoyuki_2002_01_17 = '';
347              
348             # Quantifiers
349             # {n,m} --- Match at least n but not more than m times
350             #
351             # n and m are limited to non-negative integral values less than a
352             # preset limit defined when perl is built. This is usually 32766 on
353             # the most common platforms.
354             #
355             # The following code is an attempt to solve the above limitations
356             # in a multi-byte anchoring.
357              
358             # avoid "Segmentation fault" and "Error: Parse exception"
359              
360             # perl5101delta
361             # http://perldoc.perl.org/perl5101delta.html
362             # In 5.10.0, the * quantifier in patterns was sometimes treated as {0,32767}
363             # [RT #60034, #60464]. For example, this match would fail:
364             # ("ab" x 32768) =~ /^(ab)*$/
365              
366             # SEE ALSO
367             #
368             # Complex regular subexpression recursion limit
369             # http://www.perlmonks.org/?node_id=810857
370             #
371             # regexp iteration limits
372             # http://www.nntp.perl.org/group/perl.perl5.porters/2009/02/msg144065.html
373             #
374             # latest Perl won't match certain regexes more than 32768 characters long
375             # http://stackoverflow.com/questions/26226630/latest-perl-wont-match-certain-regexes-more-than-32768-characters-long
376             #
377             # Break through the limitations of regular expressions of Perl
378             # http://d.hatena.ne.jp/gfx/20110212/1297512479
379              
380             if (($] >= 5.010001) or
381             # ActivePerl 5.6 or later (include 5.10.0)
382             (defined($ActivePerl::VERSION) and ($ActivePerl::VERSION > 800)) or
383             (($^O eq 'MSWin32') and ($] =~ /\A 5\.006/oxms))
384             ) {
385             my $sbcs = ''; # Single Byte Character Set
386             for my $range (@{ $range_tr{1} }) {
387             $sbcs .= sprintf('\\x%02X-\\x%02X', $range->[0], $range->[-1]);
388             }
389              
390             if (0) {
391             }
392              
393             # other encoding
394             else {
395             ${Eksc5601::q_char_SADAHIRO_Tomoyuki_2002_01_17} = qr{.*?[$sbcs](?:[^$sbcs][^$sbcs])*?}oxms;
396             # ******* octets not in multiple octet char (always char boundary)
397             # **************** 2 octet chars
398             }
399              
400             ${Eksc5601::anchor_SADAHIRO_Tomoyuki_2002_01_17} =
401             qr{\G(?(?=.{0,32766}\z)(?:[^\xA1-\xFE]|[\xA1-\xFE][\x00-\xFF])*?|(?(?=[$sbcs]+\z).*?|(?:${Eksc5601::q_char_SADAHIRO_Tomoyuki_2002_01_17})))}oxms;
402             # qr{
403             # \G # (1), (2)
404             # (? # (3)
405             # (?=.{0,32766}\z) # (4)
406             # (?:[^\xA1-\xFE]|[\xA1-\xFE][\x00-\xFF])*?| # (5)
407             # (?(?=[$sbcs]+\z) # (6)
408             # .*?| #(7)
409             # (?:${Eksc5601::q_char_SADAHIRO_Tomoyuki_2002_01_17}) # (8)
410             # ))}oxms;
411              
412             # avoid: Complex regular subexpression recursion limit (32766) exceeded at here.
413             local $^W = 0;
414             local $SIG{__WARN__} = sub {};
415              
416             if (((('A' x 32768).'B') !~ / ${Eksc5601::anchor} B /oxms) and
417             ((('A' x 32768).'B') =~ / ${Eksc5601::anchor_SADAHIRO_Tomoyuki_2002_01_17} B /oxms)
418             ) {
419             ${Eksc5601::anchor} = ${Eksc5601::anchor_SADAHIRO_Tomoyuki_2002_01_17};
420             }
421             else {
422             undef ${Eksc5601::q_char_SADAHIRO_Tomoyuki_2002_01_17};
423             }
424             }
425              
426             # (1)
427             # P.128 Start of match (or end of previous match): \G
428             # P.130 Advanced Use of \G with Perl
429             # in Chapter3: Over view of Regular Expression Features and Flavors
430             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
431              
432             # (2)
433             # P.255 Use leading anchors
434             # P.256 Expose ^ and \G at the front of expressions
435             # in Chapter6: Crafting an Efficient Expression
436             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
437              
438             # (3)
439             # P.138 Conditional: (? if then| else)
440             # in Chapter3: Over view of Regular Expression Features and Flavors
441             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
442              
443             # (4)
444             # perlre
445             # http://perldoc.perl.org/perlre.html
446             # The "*" quantifier is equivalent to {0,} , the "+" quantifier to {1,} ,
447             # and the "?" quantifier to {0,1}, ., n, and m are limited to non-negative
448             # integral values less than a preset limit defined when perl is built.
449             # This is usually 32766 on the most common platforms. The actual limit
450             # can be seen in the error message generated by code such as this:
451             # $_ **= $_ , / {$_} / for 2 .. 42;
452              
453             # (5)
454             # P.1023 Multiple-Byte Anchoring
455             # in Appendix W Perl Code Examples
456             # of ISBN 1-56592-224-7 CJKV Information Processing
457              
458             # (6)
459             # if string has only SBCS (Single Byte Character Set)
460              
461             # (7)
462             # then .*? (isn't limited to 32766)
463              
464             # (8)
465             # else KSC5601::Regexp::Const (SADAHIRO Tomoyuki)
466             # http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm#long
467             # http://search.cpan.org/~sadahiro/KSC5601-Regexp/
468             # $PadA = ' (?:\A| [\x00-\x80\xA0-\xDF])(?:[\xA1-\xFE]{2})*?';
469             # $PadG = '\G(?: |[\x00-\xFF]*?[\x00-\x80\xA0-\xDF])(?:[\xA1-\xFE]{2})*?';
470             # $PadGA = '\G(?:\A|(?:[\xA1-\xFE]{2})+?|[\x00-\xFF]*?[\x00-\x80\xA0-\xDF] (?:[\xA1-\xFE]{2})*?)';
471              
472             ${Eksc5601::dot} = qr{(?>[^\xA1-\xFE\x0A]|[\xA1-\xFE][\x00-\xFF])};
473             ${Eksc5601::dot_s} = qr{(?>[^\xA1-\xFE]|[\xA1-\xFE][\x00-\xFF])};
474             ${Eksc5601::eD} = qr{(?>[^\xA1-\xFE0-9]|[\xA1-\xFE][\x00-\xFF])};
475              
476             # Vertical tabs are now whitespace
477             # \s in a regex now matches a vertical tab in all circumstances.
478             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
479             # ${Eksc5601::eS} = qr{(?>[^\xA1-\xFE\x09\x0A \x0C\x0D\x20]|[\xA1-\xFE][\x00-\xFF])};
480             # ${Eksc5601::eS} = qr{(?>[^\xA1-\xFE\x09\x0A\x0B\x0C\x0D\x20]|[\xA1-\xFE][\x00-\xFF])};
481             ${Eksc5601::eS} = qr{(?>[^\xA1-\xFE\s]|[\xA1-\xFE][\x00-\xFF])};
482              
483             ${Eksc5601::eW} = qr{(?>[^\xA1-\xFE0-9A-Z_a-z]|[\xA1-\xFE][\x00-\xFF])};
484             ${Eksc5601::eH} = qr{(?>[^\xA1-\xFE\x09\x20]|[\xA1-\xFE][\x00-\xFF])};
485             ${Eksc5601::eV} = qr{(?>[^\xA1-\xFE\x0A\x0B\x0C\x0D]|[\xA1-\xFE][\x00-\xFF])};
486             ${Eksc5601::eR} = qr{(?>\x0D\x0A|[\x0A\x0D])};
487             ${Eksc5601::eN} = qr{(?>[^\xA1-\xFE\x0A]|[\xA1-\xFE][\x00-\xFF])};
488             ${Eksc5601::not_alnum} = qr{(?>[^\xA1-\xFE\x30-\x39\x41-\x5A\x61-\x7A]|[\xA1-\xFE][\x00-\xFF])};
489             ${Eksc5601::not_alpha} = qr{(?>[^\xA1-\xFE\x41-\x5A\x61-\x7A]|[\xA1-\xFE][\x00-\xFF])};
490             ${Eksc5601::not_ascii} = qr{(?>[^\xA1-\xFE\x00-\x7F]|[\xA1-\xFE][\x00-\xFF])};
491             ${Eksc5601::not_blank} = qr{(?>[^\xA1-\xFE\x09\x20]|[\xA1-\xFE][\x00-\xFF])};
492             ${Eksc5601::not_cntrl} = qr{(?>[^\xA1-\xFE\x00-\x1F\x7F]|[\xA1-\xFE][\x00-\xFF])};
493             ${Eksc5601::not_digit} = qr{(?>[^\xA1-\xFE\x30-\x39]|[\xA1-\xFE][\x00-\xFF])};
494             ${Eksc5601::not_graph} = qr{(?>[^\xA1-\xFE\x21-\x7F]|[\xA1-\xFE][\x00-\xFF])};
495             ${Eksc5601::not_lower} = qr{(?>[^\xA1-\xFE\x61-\x7A]|[\xA1-\xFE][\x00-\xFF])};
496             ${Eksc5601::not_lower_i} = qr{(?>[^\xA1-\xFE\x41-\x5A\x61-\x7A]|[\xA1-\xFE][\x00-\xFF])}; # Perl 5.16 compatible
497             # ${Eksc5601::not_lower_i} = qr{(?>[^\xA1-\xFE]|[\xA1-\xFE][\x00-\xFF])}; # older Perl compatible
498             ${Eksc5601::not_print} = qr{(?>[^\xA1-\xFE\x20-\x7F]|[\xA1-\xFE][\x00-\xFF])};
499             ${Eksc5601::not_punct} = qr{(?>[^\xA1-\xFE\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]|[\xA1-\xFE][\x00-\xFF])};
500             ${Eksc5601::not_space} = qr{(?>[^\xA1-\xFE\s\x0B]|[\xA1-\xFE][\x00-\xFF])};
501             ${Eksc5601::not_upper} = qr{(?>[^\xA1-\xFE\x41-\x5A]|[\xA1-\xFE][\x00-\xFF])};
502             ${Eksc5601::not_upper_i} = qr{(?>[^\xA1-\xFE\x41-\x5A\x61-\x7A]|[\xA1-\xFE][\x00-\xFF])}; # Perl 5.16 compatible
503             # ${Eksc5601::not_upper_i} = qr{(?>[^\xA1-\xFE]|[\xA1-\xFE][\x00-\xFF])}; # older Perl compatible
504             ${Eksc5601::not_word} = qr{(?>[^\xA1-\xFE\x30-\x39\x41-\x5A\x5F\x61-\x7A]|[\xA1-\xFE][\x00-\xFF])};
505             ${Eksc5601::not_xdigit} = qr{(?>[^\xA1-\xFE\x30-\x39\x41-\x46\x61-\x66]|[\xA1-\xFE][\x00-\xFF])};
506             ${Eksc5601::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))};
507             ${Eksc5601::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]))};
508              
509             # avoid: Name "Eksc5601::foo" used only once: possible typo at here.
510             ${Eksc5601::dot} = ${Eksc5601::dot};
511             ${Eksc5601::dot_s} = ${Eksc5601::dot_s};
512             ${Eksc5601::eD} = ${Eksc5601::eD};
513             ${Eksc5601::eS} = ${Eksc5601::eS};
514             ${Eksc5601::eW} = ${Eksc5601::eW};
515             ${Eksc5601::eH} = ${Eksc5601::eH};
516             ${Eksc5601::eV} = ${Eksc5601::eV};
517             ${Eksc5601::eR} = ${Eksc5601::eR};
518             ${Eksc5601::eN} = ${Eksc5601::eN};
519             ${Eksc5601::not_alnum} = ${Eksc5601::not_alnum};
520             ${Eksc5601::not_alpha} = ${Eksc5601::not_alpha};
521             ${Eksc5601::not_ascii} = ${Eksc5601::not_ascii};
522             ${Eksc5601::not_blank} = ${Eksc5601::not_blank};
523             ${Eksc5601::not_cntrl} = ${Eksc5601::not_cntrl};
524             ${Eksc5601::not_digit} = ${Eksc5601::not_digit};
525             ${Eksc5601::not_graph} = ${Eksc5601::not_graph};
526             ${Eksc5601::not_lower} = ${Eksc5601::not_lower};
527             ${Eksc5601::not_lower_i} = ${Eksc5601::not_lower_i};
528             ${Eksc5601::not_print} = ${Eksc5601::not_print};
529             ${Eksc5601::not_punct} = ${Eksc5601::not_punct};
530             ${Eksc5601::not_space} = ${Eksc5601::not_space};
531             ${Eksc5601::not_upper} = ${Eksc5601::not_upper};
532             ${Eksc5601::not_upper_i} = ${Eksc5601::not_upper_i};
533             ${Eksc5601::not_word} = ${Eksc5601::not_word};
534             ${Eksc5601::not_xdigit} = ${Eksc5601::not_xdigit};
535             ${Eksc5601::eb} = ${Eksc5601::eb};
536             ${Eksc5601::eB} = ${Eksc5601::eB};
537              
538             #
539             # KSC5601 split
540             #
541             sub Eksc5601::split(;$$$) {
542              
543             # P.794 29.2.161. split
544             # in Chapter 29: Functions
545             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
546              
547             # P.951 split
548             # in Chapter 27: Functions
549             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
550              
551 0     0 0 0 my $pattern = $_[0];
552 0         0 my $string = $_[1];
553 0         0 my $limit = $_[2];
554              
555             # if $pattern is also omitted or is the literal space, " "
556 0 0       0 if (not defined $pattern) {
557 0         0 $pattern = ' ';
558             }
559              
560             # if $string is omitted, the function splits the $_ string
561 0 0       0 if (not defined $string) {
562 0 0       0 if (defined $_) {
563 0         0 $string = $_;
564             }
565             else {
566 0         0 $string = '';
567             }
568             }
569              
570 0         0 my @split = ();
571              
572             # when string is empty
573 0 0       0 if ($string eq '') {
    0          
574              
575             # resulting list value in list context
576 0 0       0 if (wantarray) {
577 0         0 return @split;
578             }
579              
580             # count of substrings in scalar context
581             else {
582 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
583 0         0 @_ = @split;
584 0         0 return scalar @_;
585             }
586             }
587              
588             # split's first argument is more consistently interpreted
589             #
590             # After some changes earlier in v5.17, split's behavior has been simplified:
591             # if the PATTERN argument evaluates to a string containing one space, it is
592             # treated the way that a literal string containing one space once was.
593             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#split's_first_argument_is_more_consistently_interpreted
594              
595             # if $pattern is also omitted or is the literal space, " ", the function splits
596             # on whitespace, /\s+/, after skipping any leading whitespace
597             # (and so on)
598              
599             elsif ($pattern eq ' ') {
600 0 0       0 if (not defined $limit) {
601 0         0 return CORE::split(' ', $string);
602             }
603             else {
604 0         0 return CORE::split(' ', $string, $limit);
605             }
606             }
607              
608 0         0 local $q_char = $q_char;
609 0 0       0 if (CORE::length($string) > 32766) {
610 0 0       0 if ($string =~ /\A [\x00-\x7F]+ \z/oxms) {
    0          
611 0         0 $q_char = qr{.}s;
612             }
613             elsif (defined ${Eksc5601::q_char_SADAHIRO_Tomoyuki_2002_01_17}) {
614 0         0 $q_char = ${Eksc5601::q_char_SADAHIRO_Tomoyuki_2002_01_17};
615             }
616             }
617              
618             # if $limit is negative, it is treated as if an arbitrarily large $limit has been specified
619 0 0 0     0 if ((not defined $limit) or ($limit <= 0)) {
    0          
620              
621             # a pattern capable of matching either the null string or something longer than the
622             # null string will split the value of $string into separate characters wherever it
623             # matches the null string between characters
624             # (and so on)
625              
626 0 0       0 if ('' =~ / \A $pattern \z /xms) {
627 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
628 0         0 my $limit = scalar(() = $string =~ /($pattern)/oxmsg);
629              
630             # P.1024 Appendix W.10 Multibyte Processing
631             # of ISBN 1-56592-224-7 CJKV Information Processing
632             # (and so on)
633              
634             # the //m modifier is assumed when you split on the pattern /^/
635             # (and so on)
636              
637 0         0 eval q{ no warnings }; # avoid: Complex regular subexpression recursion limit (32766) exceeded at ...
638             # V
639 0   0     0 while ((--$limit > 0) and ($string =~ s/\A((?:$q_char)+?)$pattern//m)) {
640              
641             # if the $pattern contains parentheses, then the substring matched by each pair of parentheses
642             # is included in the resulting list, interspersed with the fields that are ordinarily returned
643             # (and so on)
644              
645 0         0 local $@;
646 0         0 eval q{ no warnings }; # avoid: Complex regular subexpression recursion limit (32766) exceeded at ...
647 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
648 0         0 push @split, CORE::eval('$' . $digit);
649             }
650             }
651             }
652              
653             else {
654 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
655              
656 0         0 eval q{ no warnings }; # avoid: Complex regular subexpression recursion limit (32766) exceeded at ...
657             # V
658 0         0 while ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
659 0         0 local $@;
660 0         0 eval q{ no warnings }; # avoid: Complex regular subexpression recursion limit (32766) exceeded at ...
661 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
662 0         0 push @split, CORE::eval('$' . $digit);
663             }
664             }
665             }
666             }
667              
668             elsif ($limit > 0) {
669 0 0       0 if ('' =~ / \A $pattern \z /xms) {
670 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
671 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
672              
673 0         0 eval q{ no warnings }; # avoid: Complex regular subexpression recursion limit (32766) exceeded at ...
674             # V
675 0 0       0 if ($string =~ s/\A((?:$q_char)+?)$pattern//m) {
676 0         0 local $@;
677 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
678 0         0 push @split, CORE::eval('$' . $digit);
679             }
680             }
681             }
682             }
683             else {
684 0         0 my $last_subexpression_offsets = _last_subexpression_offsets($pattern);
685 0   0     0 while ((--$limit > 0) and (CORE::length($string) > 0)) {
686              
687 0         0 eval q{ no warnings }; # avoid: Complex regular subexpression recursion limit (32766) exceeded at ...
688             # V
689 0 0       0 if ($string =~ s/\A((?:$q_char)*?)$pattern//m) {
690 0         0 local $@;
691 0         0 for (my $digit=1; $digit <= ($last_subexpression_offsets + 1); $digit++) {
692 0         0 push @split, CORE::eval('$' . $digit);
693             }
694             }
695             }
696             }
697             }
698              
699 0 0       0 if (CORE::length($string) > 0) {
700 0         0 push @split, $string;
701             }
702              
703             # if $_[2] (NOT "$limit") is omitted or zero, trailing null fields are stripped from the result
704 0 0 0     0 if ((not defined $_[2]) or ($_[2] == 0)) {
705 0   0     0 while ((scalar(@split) >= 1) and ($split[-1] eq '')) {
706 0         0 pop @split;
707             }
708             }
709              
710             # resulting list value in list context
711 0 0       0 if (wantarray) {
712 0         0 return @split;
713             }
714              
715             # count of substrings in scalar context
716             else {
717 0 0       0 carp "Use of implicit split to \@_ is deprecated" if $^W;
718 0         0 @_ = @split;
719 0         0 return scalar @_;
720             }
721             }
722              
723             #
724             # get last subexpression offsets
725             #
726             sub _last_subexpression_offsets {
727 0     0   0 my $pattern = $_[0];
728              
729             # remove comment
730 0         0 $pattern =~ s/\(\?\# .*? \)//oxmsg;
731              
732 0         0 my $modifier = '';
733 0 0       0 if ($pattern =~ /\(\?\^? ([\-A-Za-z]+) :/oxms) {
734 0         0 $modifier = $1;
735 0         0 $modifier =~ s/-[A-Za-z]*//;
736             }
737              
738             # with /x modifier
739 0         0 my @char = ();
740 0 0       0 if ($modifier =~ /x/oxms) {
741 0         0 @char = $pattern =~ /\G((?>
742             [^\xA1-\xFE\\\#\[\(]|[\xA1-\xFE][\x00-\xFF] |
743             \\ $q_char |
744             \# (?>[^\n]*) $ |
745             \[ (?>(?:[^\xA1-\xFE\\\]]|[\xA1-\xFE][\x00-\xFF]|\\\\|\\\]|$q_char)+) \] |
746             \(\? |
747             $q_char
748             ))/oxmsg;
749             }
750              
751             # without /x modifier
752             else {
753 0         0 @char = $pattern =~ /\G((?>
754             [^\xA1-\xFE\\\[\(]|[\xA1-\xFE][\x00-\xFF] |
755             \\ $q_char |
756             \[ (?>(?:[^\xA1-\xFE\\\]]|[\xA1-\xFE][\x00-\xFF]|\\\\|\\\]|$q_char)+) \] |
757             \(\? |
758             $q_char
759             ))/oxmsg;
760             }
761              
762 0         0 return scalar grep { $_ eq '(' } @char;
  0         0  
763             }
764              
765             #
766             # KSC5601 transliteration (tr///)
767             #
768             sub Eksc5601::tr($$$$;$) {
769              
770 0     0 0 0 my $bind_operator = $_[1];
771 0         0 my $searchlist = $_[2];
772 0         0 my $replacementlist = $_[3];
773 0   0     0 my $modifier = $_[4] || '';
774              
775 0 0       0 if ($modifier =~ /r/oxms) {
776 0 0       0 if ($bind_operator =~ / !~ /oxms) {
777 0         0 croak "Using !~ with tr///r doesn't make sense";
778             }
779             }
780              
781 0         0 my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
782 0         0 my @searchlist = _charlist_tr($searchlist);
783 0         0 my @replacementlist = _charlist_tr($replacementlist);
784              
785 0         0 my %tr = ();
786 0         0 for (my $i=0; $i <= $#searchlist; $i++) {
787 0 0       0 if (not exists $tr{$searchlist[$i]}) {
788 0 0 0     0 if (defined $replacementlist[$i] and ($replacementlist[$i] ne '')) {
    0 0        
    0          
789 0         0 $tr{$searchlist[$i]} = $replacementlist[$i];
790             }
791             elsif ($modifier =~ /d/oxms) {
792 0         0 $tr{$searchlist[$i]} = '';
793             }
794             elsif (defined $replacementlist[-1] and ($replacementlist[-1] ne '')) {
795 0         0 $tr{$searchlist[$i]} = $replacementlist[-1];
796             }
797             else {
798 0         0 $tr{$searchlist[$i]} = $searchlist[$i];
799             }
800             }
801             }
802              
803 0         0 my $tr = 0;
804 0         0 my $replaced = '';
805 0 0       0 if ($modifier =~ /c/oxms) {
806 0         0 while (defined(my $char = shift @char)) {
807 0 0       0 if (not exists $tr{$char}) {
808 0 0       0 if (defined $replacementlist[-1]) {
809 0         0 $replaced .= $replacementlist[-1];
810             }
811 0         0 $tr++;
812 0 0       0 if ($modifier =~ /s/oxms) {
813 0   0     0 while (@char and (not exists $tr{$char[0]})) {
814 0         0 shift @char;
815 0         0 $tr++;
816             }
817             }
818             }
819             else {
820 0         0 $replaced .= $char;
821             }
822             }
823             }
824             else {
825 0         0 while (defined(my $char = shift @char)) {
826 0 0       0 if (exists $tr{$char}) {
827 0         0 $replaced .= $tr{$char};
828 0         0 $tr++;
829 0 0       0 if ($modifier =~ /s/oxms) {
830 0   0     0 while (@char and (exists $tr{$char[0]}) and ($tr{$char[0]} eq $tr{$char})) {
      0        
831 0         0 shift @char;
832 0         0 $tr++;
833             }
834             }
835             }
836             else {
837 0         0 $replaced .= $char;
838             }
839             }
840             }
841              
842 0 0       0 if ($modifier =~ /r/oxms) {
843 0         0 return $replaced;
844             }
845             else {
846 0         0 $_[0] = $replaced;
847 0 0       0 if ($bind_operator =~ / !~ /oxms) {
848 0         0 return not $tr;
849             }
850             else {
851 0         0 return $tr;
852             }
853             }
854             }
855              
856             #
857             # KSC5601 chop
858             #
859             sub Eksc5601::chop(@) {
860              
861 0     0 0 0 my $chop;
862 0 0       0 if (@_ == 0) {
863 0         0 my @char = /\G (?>$q_char) /oxmsg;
864 0         0 $chop = pop @char;
865 0         0 $_ = join '', @char;
866             }
867             else {
868 0         0 for (@_) {
869 0         0 my @char = /\G (?>$q_char) /oxmsg;
870 0         0 $chop = pop @char;
871 0         0 $_ = join '', @char;
872             }
873             }
874 0         0 return $chop;
875             }
876              
877             #
878             # KSC5601 index by octet
879             #
880             sub Eksc5601::index($$;$) {
881              
882 0     0 1 0 my($str,$substr,$position) = @_;
883 0   0     0 $position ||= 0;
884 0         0 my $pos = 0;
885              
886 0         0 while ($pos < CORE::length($str)) {
887 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
888 0 0       0 if ($pos >= $position) {
889 0         0 return $pos;
890             }
891             }
892 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
893 0         0 $pos += CORE::length($1);
894             }
895             else {
896 0         0 $pos += 1;
897             }
898             }
899 0         0 return -1;
900             }
901              
902             #
903             # KSC5601 reverse index
904             #
905             sub Eksc5601::rindex($$;$) {
906              
907 0     0 0 0 my($str,$substr,$position) = @_;
908 0   0     0 $position ||= CORE::length($str) - 1;
909 0         0 my $pos = 0;
910 0         0 my $rindex = -1;
911              
912 0   0     0 while (($pos < CORE::length($str)) and ($pos <= $position)) {
913 0 0       0 if (CORE::substr($str,$pos,CORE::length($substr)) eq $substr) {
914 0         0 $rindex = $pos;
915             }
916 0 0       0 if (CORE::substr($str,$pos) =~ /\A ($q_char) /oxms) {
917 0         0 $pos += CORE::length($1);
918             }
919             else {
920 0         0 $pos += 1;
921             }
922             }
923 0         0 return $rindex;
924             }
925              
926             #
927             # KSC5601 lower case first with parameter
928             #
929             sub Eksc5601::lcfirst(@) {
930 0 0   0 0 0 if (@_) {
931 0         0 my $s = shift @_;
932 0 0 0     0 if (@_ and wantarray) {
933 0         0 return Eksc5601::lc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
934             }
935             else {
936 0         0 return Eksc5601::lc(CORE::substr($s,0,1)) . CORE::substr($s,1);
937             }
938             }
939             else {
940 0         0 return Eksc5601::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
941             }
942             }
943              
944             #
945             # KSC5601 lower case first without parameter
946             #
947             sub Eksc5601::lcfirst_() {
948 0     0 0 0 return Eksc5601::lc(CORE::substr($_,0,1)) . CORE::substr($_,1);
949             }
950              
951             #
952             # KSC5601 lower case with parameter
953             #
954             sub Eksc5601::lc(@) {
955 0 0   0 0 0 if (@_) {
956 0         0 my $s = shift @_;
957 0 0 0     0 if (@_ and wantarray) {
958 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
959             }
960             else {
961 0 0       0 return join('', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  0         0  
962             }
963             }
964             else {
965 0         0 return Eksc5601::lc_();
966             }
967             }
968              
969             #
970             # KSC5601 lower case without parameter
971             #
972             sub Eksc5601::lc_() {
973 0     0 0 0 my $s = $_;
974 0 0       0 return join '', map {defined($lc{$_}) ? $lc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
975             }
976              
977             #
978             # KSC5601 upper case first with parameter
979             #
980             sub Eksc5601::ucfirst(@) {
981 0 0   0 0 0 if (@_) {
982 0         0 my $s = shift @_;
983 0 0 0     0 if (@_ and wantarray) {
984 0         0 return Eksc5601::uc(CORE::substr($s,0,1)) . CORE::substr($s,1), @_;
985             }
986             else {
987 0         0 return Eksc5601::uc(CORE::substr($s,0,1)) . CORE::substr($s,1);
988             }
989             }
990             else {
991 0         0 return Eksc5601::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
992             }
993             }
994              
995             #
996             # KSC5601 upper case first without parameter
997             #
998             sub Eksc5601::ucfirst_() {
999 0     0 0 0 return Eksc5601::uc(CORE::substr($_,0,1)) . CORE::substr($_,1);
1000             }
1001              
1002             #
1003             # KSC5601 upper case with parameter
1004             #
1005             sub Eksc5601::uc(@) {
1006 0 50   2800 0 0 if (@_) {
1007 2800         3857 my $s = shift @_;
1008 2800 50 33     3113 if (@_ and wantarray) {
1009 2800 0       4448 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
1010             }
1011             else {
1012 0 100       0 return join('', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  2800         6758  
1013             }
1014             }
1015             else {
1016 2800         8369 return Eksc5601::uc_();
1017             }
1018             }
1019              
1020             #
1021             # KSC5601 upper case without parameter
1022             #
1023             sub Eksc5601::uc_() {
1024 0     0 0 0 my $s = $_;
1025 0 0       0 return join '', map {defined($uc{$_}) ? $uc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
1026             }
1027              
1028             #
1029             # KSC5601 fold case with parameter
1030             #
1031             sub Eksc5601::fc(@) {
1032 0 50   2875 0 0 if (@_) {
1033 2875         3717 my $s = shift @_;
1034 2875 50 33     3222 if (@_ and wantarray) {
1035 2875 0       4627 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg)), @_;
  0         0  
1036             }
1037             else {
1038 0 100       0 return join('', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg));
  2875         6546  
1039             }
1040             }
1041             else {
1042 2875         9085 return Eksc5601::fc_();
1043             }
1044             }
1045              
1046             #
1047             # KSC5601 fold case without parameter
1048             #
1049             sub Eksc5601::fc_() {
1050 0     0 0 0 my $s = $_;
1051 0 0       0 return join '', map {defined($fc{$_}) ? $fc{$_} : $_} ($s =~ /\G ($q_char) /oxmsg);
  0         0  
1052             }
1053              
1054             #
1055             # KSC5601 regexp capture
1056             #
1057             {
1058             # 10.3. Creating Persistent Private Variables
1059             # in Chapter 10. Subroutines
1060             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
1061              
1062             my $last_s_matched = 0;
1063              
1064             sub Eksc5601::capture {
1065 0 0 0 0 1 0 if ($last_s_matched and ($_[0] =~ /\A (?>[1-9][0-9]*) \z/oxms)) {
1066 0         0 return $_[0] + 1;
1067             }
1068 0         0 return $_[0];
1069             }
1070              
1071             # KSC5601 mark last regexp matched
1072             sub Eksc5601::matched() {
1073 0     0 0 0 $last_s_matched = 0;
1074             }
1075              
1076             # KSC5601 mark last s/// matched
1077             sub Eksc5601::s_matched() {
1078 0     0 0 0 $last_s_matched = 1;
1079             }
1080              
1081             # P.854 31.17. use re
1082             # in Chapter 31. Pragmatic Modules
1083             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1084              
1085             # P.1026 re
1086             # in Chapter 29. Pragmatic Modules
1087             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1088              
1089             $Eksc5601::matched = qr/(?{Eksc5601::matched})/;
1090             }
1091              
1092             #
1093             # KSC5601 regexp ignore case modifier
1094             #
1095             sub Eksc5601::ignorecase {
1096              
1097 0     0 0 0 my @string = @_;
1098 0         0 my $metachar = qr/[\@\\|[\]{]/oxms;
1099              
1100             # ignore case of $scalar or @array
1101 0         0 for my $string (@string) {
1102              
1103             # split regexp
1104 0         0 my @char = $string =~ /\G (?>\[\^|\\$q_char|$q_char) /oxmsg;
1105              
1106             # unescape character
1107 0         0 for (my $i=0; $i <= $#char; $i++) {
1108 0 0       0 next if not defined $char[$i];
1109              
1110             # open character class [...]
1111 0 0       0 if ($char[$i] eq '[') {
    0          
    0          
    0          
1112 0         0 my $left = $i;
1113              
1114             # [] make die "unmatched [] in regexp ...\n"
1115              
1116 0 0       0 if ($char[$i+1] eq ']') {
1117 0         0 $i++;
1118             }
1119              
1120 0         0 while (1) {
1121 0 0       0 if (++$i > $#char) {
1122 0         0 croak "Unmatched [] in regexp";
1123             }
1124 0 0       0 if ($char[$i] eq ']') {
1125 0         0 my $right = $i;
1126 0         0 my @charlist = charlist_qr(@char[$left+1..$right-1], 'i');
1127              
1128             # escape character
1129 0         0 for my $char (@charlist) {
1130 0 0       0 if (0) {
1131             }
1132              
1133 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
1134 0         0 $char = '\\' . $char;
1135             }
1136             }
1137              
1138             # [...]
1139 0         0 splice @char, $left, $right-$left+1, '(?:' . join('|', @charlist) . ')';
1140              
1141 0         0 $i = $left;
1142 0         0 last;
1143             }
1144             }
1145             }
1146              
1147             # open character class [^...]
1148             elsif ($char[$i] eq '[^') {
1149 0         0 my $left = $i;
1150              
1151             # [^] make die "unmatched [] in regexp ...\n"
1152              
1153 0 0       0 if ($char[$i+1] eq ']') {
1154 0         0 $i++;
1155             }
1156              
1157 0         0 while (1) {
1158 0 0       0 if (++$i > $#char) {
1159 0         0 croak "Unmatched [] in regexp";
1160             }
1161 0 0       0 if ($char[$i] eq ']') {
1162 0         0 my $right = $i;
1163 0         0 my @charlist = charlist_not_qr(@char[$left+1..$right-1], 'i');
1164              
1165             # escape character
1166 0         0 for my $char (@charlist) {
1167 0 0       0 if (0) {
1168             }
1169              
1170 0         0 elsif ($char =~ /\A [.|)] \z/oxms) {
1171 0         0 $char = '\\' . $char;
1172             }
1173             }
1174              
1175             # [^...]
1176 0         0 splice @char, $left, $right-$left+1, '(?!' . join('|', @charlist) . ")(?:$your_char)";
1177              
1178 0         0 $i = $left;
1179 0         0 last;
1180             }
1181             }
1182             }
1183              
1184             # rewrite classic character class or escape character
1185             elsif (my $char = classic_character_class($char[$i])) {
1186 0         0 $char[$i] = $char;
1187             }
1188              
1189             # with /i modifier
1190             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
1191 0         0 my $uc = Eksc5601::uc($char[$i]);
1192 0         0 my $fc = Eksc5601::fc($char[$i]);
1193 0 0       0 if ($uc ne $fc) {
1194 0 0       0 if (CORE::length($fc) == 1) {
1195 0         0 $char[$i] = '[' . $uc . $fc . ']';
1196             }
1197             else {
1198 0         0 $char[$i] = '(?:' . $uc . '|' . $fc . ')';
1199             }
1200             }
1201             }
1202             }
1203              
1204             # characterize
1205 0         0 for (my $i=0; $i <= $#char; $i++) {
1206 0 0       0 next if not defined $char[$i];
1207              
1208 0 0       0 if (0) {
1209             }
1210              
1211             # quote character before ? + * {
1212 0 0       0 elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
1213 0 0       0 if ($char[$i-1] !~ /\A [\x00-\xFF] \z/oxms) {
1214 0         0 $char[$i-1] = '(?:' . $char[$i-1] . ')';
1215             }
1216             }
1217             }
1218              
1219 0         0 $string = join '', @char;
1220             }
1221              
1222             # make regexp string
1223 0         0 return @string;
1224             }
1225              
1226             #
1227             # classic character class ( \D \S \W \d \s \w \C \X \H \V \h \v \R \N \b \B )
1228             #
1229             sub Eksc5601::classic_character_class {
1230 0     2956 0 0 my($char) = @_;
1231              
1232             return {
1233             '\D' => '${Eksc5601::eD}',
1234             '\S' => '${Eksc5601::eS}',
1235             '\W' => '${Eksc5601::eW}',
1236             '\d' => '[0-9]',
1237              
1238             # Before Perl 5.6, \s only matched the five whitespace characters
1239             # tab, newline, form-feed, carriage return, and the space character
1240             # itself, which, taken together, is the character class [\t\n\f\r ].
1241              
1242             # Vertical tabs are now whitespace
1243             # \s in a regex now matches a vertical tab in all circumstances.
1244             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1245             # \t \n \v \f \r space
1246             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
1247             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
1248             '\s' => '\s',
1249              
1250             '\w' => '[0-9A-Z_a-z]',
1251             '\C' => '[\x00-\xFF]',
1252             '\X' => 'X',
1253              
1254             # \h \v \H \V
1255              
1256             # P.114 Character Class Shortcuts
1257             # in Chapter 7: In the World of Regular Expressions
1258             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
1259              
1260             # P.357 13.2.3 Whitespace
1261             # in Chapter 13: perlrecharclass: Perl Regular Expression Character Classes
1262             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
1263             #
1264             # 0x00009 CHARACTER TABULATION h s
1265             # 0x0000a LINE FEED (LF) vs
1266             # 0x0000b LINE TABULATION v
1267             # 0x0000c FORM FEED (FF) vs
1268             # 0x0000d CARRIAGE RETURN (CR) vs
1269             # 0x00020 SPACE h s
1270              
1271             # P.196 Table 5-9. Alphanumeric regex metasymbols
1272             # in Chapter 5. Pattern Matching
1273             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1274              
1275             # (and so on)
1276              
1277             '\H' => '${Eksc5601::eH}',
1278             '\V' => '${Eksc5601::eV}',
1279             '\h' => '[\x09\x20]',
1280             '\v' => '[\x0A\x0B\x0C\x0D]',
1281             '\R' => '${Eksc5601::eR}',
1282              
1283             # \N
1284             #
1285             # http://perldoc.perl.org/perlre.html
1286             # Character Classes and other Special Escapes
1287             # Any character but \n (experimental). Not affected by /s modifier
1288              
1289             '\N' => '${Eksc5601::eN}',
1290              
1291             # \b \B
1292              
1293             # P.180 Boundaries: The \b and \B Assertions
1294             # in Chapter 5: Pattern Matching
1295             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1296              
1297             # P.219 Boundaries: The \b and \B Assertions
1298             # in Chapter 5: Pattern Matching
1299             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1300              
1301             # \b really means (?:(?<=\w)(?!\w)|(?
1302             # or (?:(?<=\A|\W)(?=\w)|(?<=\w)(?=\W|\z))
1303             '\b' => '${Eksc5601::eb}',
1304              
1305             # \B really means (?:(?<=\w)(?=\w)|(?
1306             # or (?:(?<=\w)(?=\w)|(?<=\W)(?=\W))
1307             '\B' => '${Eksc5601::eB}',
1308              
1309 2956   100     4287 }->{$char} || '';
1310             }
1311              
1312             #
1313             # prepare KSC5601 characters per length
1314             #
1315              
1316             # 1 octet characters
1317             my @chars1 = ();
1318             sub chars1 {
1319 2956 0   0 0 112419 if (@chars1) {
1320 0         0 return @chars1;
1321             }
1322 0 0       0 if (exists $range_tr{1}) {
1323 0         0 my @ranges = @{ $range_tr{1} };
  0         0  
1324 0         0 while (my @range = splice(@ranges,0,1)) {
1325 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1326 0         0 push @chars1, pack 'C', $oct0;
1327             }
1328             }
1329             }
1330 0         0 return @chars1;
1331             }
1332              
1333             # 2 octets characters
1334             my @chars2 = ();
1335             sub chars2 {
1336 0 0   0 0 0 if (@chars2) {
1337 0         0 return @chars2;
1338             }
1339 0 0       0 if (exists $range_tr{2}) {
1340 0         0 my @ranges = @{ $range_tr{2} };
  0         0  
1341 0         0 while (my @range = splice(@ranges,0,2)) {
1342 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1343 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1344 0         0 push @chars2, pack 'CC', $oct0,$oct1;
1345             }
1346             }
1347             }
1348             }
1349 0         0 return @chars2;
1350             }
1351              
1352             # 3 octets characters
1353             my @chars3 = ();
1354             sub chars3 {
1355 0 0   0 0 0 if (@chars3) {
1356 0         0 return @chars3;
1357             }
1358 0 0       0 if (exists $range_tr{3}) {
1359 0         0 my @ranges = @{ $range_tr{3} };
  0         0  
1360 0         0 while (my @range = splice(@ranges,0,3)) {
1361 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1362 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1363 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
1364 0         0 push @chars3, pack 'CCC', $oct0,$oct1,$oct2;
1365             }
1366             }
1367             }
1368             }
1369             }
1370 0         0 return @chars3;
1371             }
1372              
1373             # 4 octets characters
1374             my @chars4 = ();
1375             sub chars4 {
1376 0 0   0 0 0 if (@chars4) {
1377 0         0 return @chars4;
1378             }
1379 0 0       0 if (exists $range_tr{4}) {
1380 0         0 my @ranges = @{ $range_tr{4} };
  0         0  
1381 0         0 while (my @range = splice(@ranges,0,4)) {
1382 0         0 for my $oct0 (@{$range[0]}) {
  0         0  
1383 0         0 for my $oct1 (@{$range[1]}) {
  0         0  
1384 0         0 for my $oct2 (@{$range[2]}) {
  0         0  
1385 0         0 for my $oct3 (@{$range[3]}) {
  0         0  
1386 0         0 push @chars4, pack 'CCCC', $oct0,$oct1,$oct2,$oct3;
1387             }
1388             }
1389             }
1390             }
1391             }
1392             }
1393 0         0 return @chars4;
1394             }
1395              
1396             #
1397             # KSC5601 open character list for tr
1398             #
1399             sub _charlist_tr {
1400              
1401 0     0   0 local $_ = shift @_;
1402              
1403             # unescape character
1404 0         0 my @char = ();
1405 0         0 while (not /\G \z/oxmsgc) {
1406 0 0       0 if (/\G (\\0?55|\\x2[Dd]|\\-) /oxmsgc) {
    0          
    0          
    0          
    0          
    0          
    0          
1407 0         0 push @char, '\-';
1408             }
1409             elsif (/\G \\ ([0-7]{2,3}) /oxmsgc) {
1410 0         0 push @char, CORE::chr(oct $1);
1411             }
1412             elsif (/\G \\x ([0-9A-Fa-f]{1,2}) /oxmsgc) {
1413 0         0 push @char, CORE::chr(hex $1);
1414             }
1415             elsif (/\G \\c ([\x40-\x5F]) /oxmsgc) {
1416 0         0 push @char, CORE::chr(CORE::ord($1) & 0x1F);
1417             }
1418             elsif (/\G (\\ [0nrtfbae]) /oxmsgc) {
1419             push @char, {
1420             '\0' => "\0",
1421             '\n' => "\n",
1422             '\r' => "\r",
1423             '\t' => "\t",
1424             '\f' => "\f",
1425             '\b' => "\x08", # \b means backspace in character class
1426             '\a' => "\a",
1427             '\e' => "\e",
1428 0         0 }->{$1};
1429             }
1430             elsif (/\G \\ ($q_char) /oxmsgc) {
1431 0         0 push @char, $1;
1432             }
1433             elsif (/\G ($q_char) /oxmsgc) {
1434 0         0 push @char, $1;
1435             }
1436             }
1437              
1438             # join separated multiple-octet
1439 0         0 @char = join('',@char) =~ /\G (?>\\-|$q_char) /oxmsg;
1440              
1441             # unescape '-'
1442 0         0 my @i = ();
1443 0         0 for my $i (0 .. $#char) {
1444 0 0       0 if ($char[$i] eq '\-') {
    0          
1445 0         0 $char[$i] = '-';
1446             }
1447             elsif ($char[$i] eq '-') {
1448 0 0 0     0 if ((0 < $i) and ($i < $#char)) {
1449 0         0 push @i, $i;
1450             }
1451             }
1452             }
1453              
1454             # open character list (reverse for splice)
1455 0         0 for my $i (CORE::reverse @i) {
1456 0         0 my @range = ();
1457              
1458             # range error
1459 0 0 0     0 if ((CORE::length($char[$i-1]) > CORE::length($char[$i+1])) or ($char[$i-1] gt $char[$i+1])) {
1460 0         0 croak "Invalid tr/// range \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1461             }
1462              
1463             # range of multiple-octet code
1464 0 0       0 if (CORE::length($char[$i-1]) == 1) {
    0          
    0          
    0          
1465 0 0       0 if (CORE::length($char[$i+1]) == 1) {
    0          
    0          
    0          
1466 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars1();
  0         0  
1467             }
1468             elsif (CORE::length($char[$i+1]) == 2) {
1469 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1470 0         0 push @range, grep {$_ le $char[$i+1]} chars2();
  0         0  
1471             }
1472             elsif (CORE::length($char[$i+1]) == 3) {
1473 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1474 0         0 push @range, chars2();
1475 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
1476             }
1477             elsif (CORE::length($char[$i+1]) == 4) {
1478 0         0 push @range, grep {$char[$i-1] le $_} chars1();
  0         0  
1479 0         0 push @range, chars2();
1480 0         0 push @range, chars3();
1481 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1482             }
1483             else {
1484 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1485             }
1486             }
1487             elsif (CORE::length($char[$i-1]) == 2) {
1488 0 0       0 if (CORE::length($char[$i+1]) == 2) {
    0          
    0          
1489 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars2();
  0         0  
1490             }
1491             elsif (CORE::length($char[$i+1]) == 3) {
1492 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
1493 0         0 push @range, grep {$_ le $char[$i+1]} chars3();
  0         0  
1494             }
1495             elsif (CORE::length($char[$i+1]) == 4) {
1496 0         0 push @range, grep {$char[$i-1] le $_} chars2();
  0         0  
1497 0         0 push @range, chars3();
1498 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1499             }
1500             else {
1501 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1502             }
1503             }
1504             elsif (CORE::length($char[$i-1]) == 3) {
1505 0 0       0 if (CORE::length($char[$i+1]) == 3) {
    0          
1506 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars3();
  0         0  
1507             }
1508             elsif (CORE::length($char[$i+1]) == 4) {
1509 0         0 push @range, grep {$char[$i-1] le $_} chars3();
  0         0  
1510 0         0 push @range, grep {$_ le $char[$i+1]} chars4();
  0         0  
1511             }
1512             else {
1513 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1514             }
1515             }
1516             elsif (CORE::length($char[$i-1]) == 4) {
1517 0 0       0 if (CORE::length($char[$i+1]) == 4) {
1518 0 0       0 push @range, grep {($char[$i-1] le $_) and ($_ le $char[$i+1])} chars4();
  0         0  
1519             }
1520             else {
1521 0         0 croak "Invalid tr/// range (over 4octets) \"\\x" . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]) . '"';
1522             }
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 0         0 splice @char, $i-1, 3, @range;
1529             }
1530              
1531 0         0 return @char;
1532             }
1533              
1534             #
1535             # KSC5601 open character class
1536             #
1537             sub _cc {
1538 0 50   342   0 if (scalar(@_) == 0) {
    100          
    50          
1539 342         845 die __FILE__, ": subroutine cc got no parameter.\n";
1540             }
1541             elsif (scalar(@_) == 1) {
1542 0         0 return sprintf('\x%02X',$_[0]);
1543             }
1544             elsif (scalar(@_) == 2) {
1545 151 50       562 if ($_[0] > $_[1]) {
    50          
    100          
1546 191         517 die __FILE__, ": subroutine cc got \$_[0] > \$_[1] parameters).\n";
1547             }
1548             elsif ($_[0] == $_[1]) {
1549 0         0 return sprintf('\x%02X',$_[0]);
1550             }
1551             elsif (($_[0]+1) == $_[1]) {
1552 0         0 return sprintf('[\\x%02X\\x%02X]',$_[0],$_[1]);
1553             }
1554             else {
1555 20         61 return sprintf('[\\x%02X-\\x%02X]',$_[0],$_[1]);
1556             }
1557             }
1558             else {
1559 171         891 die __FILE__, ": subroutine cc got 3 or more parameters (@{[scalar(@_)]} parameters).\n";
  0         0  
1560             }
1561             }
1562              
1563             #
1564             # KSC5601 octet range
1565             #
1566             sub _octets {
1567 0     537   0 my $length = shift @_;
1568              
1569 537 100       905 if ($length == 1) {
    50          
    0          
    0          
1570 537         1205 my($a1) = unpack 'C', $_[0];
1571 406         1054 my($z1) = unpack 'C', $_[1];
1572              
1573 406 50       711 if ($a1 > $z1) {
1574 406         825 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$a1) . '-\x' . unpack('H*',$z1);
1575             }
1576              
1577 0 100       0 if ($a1 == $z1) {
    50          
1578 406         1150 return sprintf('\x%02X',$a1);
1579             }
1580             elsif (($a1+1) == $z1) {
1581 20         84 return sprintf('\x%02X\x%02X',$a1,$z1);
1582             }
1583             else {
1584 0         0 return sprintf('\x%02X-\x%02X',$a1,$z1);
1585             }
1586             }
1587             elsif ($length == 2) {
1588 386         2320 my($a1,$a2) = unpack 'CC', $_[0];
1589 131         344 my($z1,$z2) = unpack 'CC', $_[1];
1590 131         299 my($A1,$A2) = unpack 'CC', $_[2];
1591 131         232 my($Z1,$Z2) = unpack 'CC', $_[3];
1592              
1593 131 100       226 if ($a1 == $z1) {
    50          
1594             return (
1595             # 11111111 222222222222
1596             # A A Z
1597 131         310 _cc($a1) . _cc($a2,$z2), # a2-z2
1598             );
1599             }
1600             elsif (($a1+1) == $z1) {
1601             return (
1602             # 11111111111 222222222222
1603             # A Z A Z
1604 111         219 _cc($a1) . _cc($a2,$Z2), # a2-
1605             _cc( $z1) . _cc($A2,$z2), # -z2
1606             );
1607             }
1608             else {
1609             return (
1610             # 1111111111111111 222222222222
1611             # A Z A Z
1612 0         0 _cc($a1) . _cc($a2,$Z2), # a2-
1613             _cc($a1+1,$z1-1) . _cc($A2,$Z2), # -
1614             _cc( $z1) . _cc($A2,$z2), # -z2
1615             );
1616             }
1617             }
1618             elsif ($length == 3) {
1619 20         40 my($a1,$a2,$a3) = unpack 'CCC', $_[0];
1620 0         0 my($z1,$z2,$z3) = unpack 'CCC', $_[1];
1621 0         0 my($A1,$A2,$A3) = unpack 'CCC', $_[2];
1622 0         0 my($Z1,$Z2,$Z3) = unpack 'CCC', $_[3];
1623              
1624 0 0       0 if ($a1 == $z1) {
    0          
1625 0 0       0 if ($a2 == $z2) {
    0          
1626             return (
1627             # 11111111 22222222 333333333333
1628             # A A A Z
1629 0         0 _cc($a1) . _cc($a2) . _cc($a3,$z3), # a3-z3
1630             );
1631             }
1632             elsif (($a2+1) == $z2) {
1633             return (
1634             # 11111111 22222222222 333333333333
1635             # A A Z A Z
1636 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1637             _cc($a1) . _cc( $z2) . _cc($A3,$z3), # -z3
1638             );
1639             }
1640             else {
1641             return (
1642             # 11111111 2222222222222222 333333333333
1643             # A A Z A Z
1644 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1645             _cc($a1) . _cc($a2+1,$z2-1) . _cc($A3,$Z3), # -
1646             _cc($a1) . _cc( $z2) . _cc($A3,$z3), # -z3
1647             );
1648             }
1649             }
1650             elsif (($a1+1) == $z1) {
1651             return (
1652             # 11111111111 22222222222222 333333333333
1653             # A Z A Z A Z
1654 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1655             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3), # -
1656             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3), # -
1657             _cc( $z1) . _cc( $z2) . _cc($A3,$z3), # -z3
1658             );
1659             }
1660             else {
1661             return (
1662             # 1111111111111111 22222222222222 333333333333
1663             # A Z A Z A Z
1664 0         0 _cc($a1) . _cc($a2) . _cc($a3,$Z3), # a3-
1665             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3), # -
1666             _cc($a1+1,$z1-1) . _cc($A2,$Z2) . _cc($A3,$Z3), # -
1667             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3), # -
1668             _cc( $z1) . _cc( $z2) . _cc($A3,$z3), # -z3
1669             );
1670             }
1671             }
1672             elsif ($length == 4) {
1673 0         0 my($a1,$a2,$a3,$a4) = unpack 'CCCC', $_[0];
1674 0         0 my($z1,$z2,$z3,$z4) = unpack 'CCCC', $_[1];
1675 0         0 my($A1,$A2,$A3,$A4) = unpack 'CCCC', $_[0];
1676 0         0 my($Z1,$Z2,$Z3,$Z4) = unpack 'CCCC', $_[1];
1677              
1678 0 0       0 if ($a1 == $z1) {
    0          
1679 0 0       0 if ($a2 == $z2) {
    0          
1680 0 0       0 if ($a3 == $z3) {
    0          
1681             return (
1682             # 11111111 22222222 33333333 444444444444
1683             # A A A A Z
1684 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$z4), # a4-z4
1685             );
1686             }
1687             elsif (($a3+1) == $z3) {
1688             return (
1689             # 11111111 22222222 33333333333 444444444444
1690             # A A A Z A Z
1691 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1692             _cc($a1) . _cc($a2) . _cc( $z3) . _cc($A4,$z4), # -z4
1693             );
1694             }
1695             else {
1696             return (
1697             # 11111111 22222222 3333333333333333 444444444444
1698             # A A A Z A Z
1699 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1700             _cc($a1) . _cc($a2) . _cc($a3+1,$z3-1) . _cc($A4,$Z4), # -
1701             _cc($a1) . _cc($a2) . _cc( $z3) . _cc($A4,$z4), # -z4
1702             );
1703             }
1704             }
1705             elsif (($a2+1) == $z2) {
1706             return (
1707             # 11111111 22222222222 33333333333333 444444444444
1708             # A A Z A Z A Z
1709 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1710             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1711             _cc($a1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1712             _cc($a1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1713             );
1714             }
1715             else {
1716             return (
1717             # 11111111 2222222222222222 33333333333333 444444444444
1718             # A A Z A Z A Z
1719 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1720             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1721             _cc($a1) . _cc($a2+1,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1722             _cc($a1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1723             _cc($a1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1724             );
1725             }
1726             }
1727             elsif (($a1+1) == $z1) {
1728             return (
1729             # 11111111111 22222222222222 33333333333333 444444444444
1730             # A Z A Z A Z A Z
1731 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1732             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1733             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1734             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1735             _cc( $z1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1736             _cc( $z1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1737             );
1738             }
1739             else {
1740             return (
1741             # 1111111111111111 22222222222222 33333333333333 444444444444
1742             # A Z A Z A Z A Z
1743 0         0 _cc($a1) . _cc($a2) . _cc($a3) . _cc($a4,$Z4), # a4-
1744             _cc($a1) . _cc($a2) . _cc($a3+1,$Z3) . _cc($A4,$Z4), # -
1745             _cc($a1) . _cc($a2+1,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1746             _cc($a1+1,$z1-1) . _cc($A2,$Z2) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1747             _cc( $z1) . _cc($A2,$z2-1) . _cc($A3,$Z3) . _cc($A4,$Z4), # -
1748             _cc( $z1) . _cc( $z2) . _cc($A3,$z3-1) . _cc($A4,$Z4), # -
1749             _cc( $z1) . _cc( $z2) . _cc( $z3) . _cc($A4,$z4), # -z4
1750             );
1751             }
1752             }
1753             else {
1754 0         0 die __FILE__, ": subroutine _octets got invalid length ($length).\n";
1755             }
1756             }
1757              
1758             #
1759             # KSC5601 range regexp
1760             #
1761             sub _range_regexp {
1762 0     517   0 my($length,$first,$last) = @_;
1763              
1764 517         1018 my @range_regexp = ();
1765 517 50       775 if (not exists $range_tr{$length}) {
1766 517         1251 return @range_regexp;
1767             }
1768              
1769 0         0 my @ranges = @{ $range_tr{$length} };
  517         661  
1770 517         1207 while (my @range = splice(@ranges,0,$length)) {
1771 517         1507 my $min = '';
1772 903         1235 my $max = '';
1773 903         995 for (my $i=0; $i < $length; $i++) {
1774 903         1836 $min .= pack 'C', $range[$i][0];
1775 1034         2510 $max .= pack 'C', $range[$i][-1];
1776             }
1777              
1778             # min___max
1779             # FIRST_____________LAST
1780             # (nothing)
1781              
1782 1034 50 66     2044 if ($max lt $first) {
    100 100        
    50 33        
    100 100        
    100 66        
    100 66        
    50 66        
1783             }
1784              
1785             # **********
1786             # min_________max
1787             # FIRST_____________LAST
1788             # **********
1789              
1790             elsif (($min le $first) and ($first le $max) and ($max le $last)) {
1791 903         8758 push @range_regexp, _octets($length,$first,$max,$min,$max);
1792             }
1793              
1794             # **********************
1795             # min________________max
1796             # FIRST_____________LAST
1797             # **********************
1798              
1799             elsif (($min eq $first) and ($max eq $last)) {
1800 20         48 push @range_regexp, _octets($length,$first,$last,$min,$max);
1801             }
1802              
1803             # *********
1804             # min___max
1805             # FIRST_____________LAST
1806             # *********
1807              
1808             elsif (($first le $min) and ($max le $last)) {
1809 0         0 push @range_regexp, _octets($length,$min,$max,$min,$max);
1810             }
1811              
1812             # **********************
1813             # min__________________________max
1814             # FIRST_____________LAST
1815             # **********************
1816              
1817             elsif (($min le $first) and ($last le $max)) {
1818 20         45 push @range_regexp, _octets($length,$first,$last,$min,$max);
1819             }
1820              
1821             # *********
1822             # min________max
1823             # FIRST_____________LAST
1824             # *********
1825              
1826             elsif (($first le $min) and ($min le $last) and ($last le $max)) {
1827 477         1150 push @range_regexp, _octets($length,$min,$last,$min,$max);
1828             }
1829              
1830             # min___max
1831             # FIRST_____________LAST
1832             # (nothing)
1833              
1834             elsif ($last lt $min) {
1835             }
1836              
1837             else {
1838 20         45 die __FILE__, ": subroutine _range_regexp panic.\n";
1839             }
1840             }
1841              
1842 0         0 return @range_regexp;
1843             }
1844              
1845             #
1846             # KSC5601 open character list for qr and not qr
1847             #
1848             sub _charlist {
1849              
1850 517     758   1282 my $modifier = pop @_;
1851 758         1292 my @char = @_;
1852              
1853 758 100       1736 my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
1854              
1855             # unescape character
1856 758         1709 for (my $i=0; $i <= $#char; $i++) {
1857              
1858             # escape - to ...
1859 758 100 100     2213 if ($char[$i] eq '-') {
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    100          
    100          
    100          
    100          
1860 2648 100 100     18071 if ((0 < $i) and ($i < $#char)) {
1861 522         1933 $char[$i] = '...';
1862             }
1863             }
1864              
1865             # octal escape sequence
1866             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
1867 497         1004 $char[$i] = octchr($1);
1868             }
1869              
1870             # hexadecimal escape sequence
1871             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
1872 0         0 $char[$i] = hexchr($1);
1873             }
1874              
1875             # \b{...} --> b\{...}
1876             # \B{...} --> B\{...}
1877             # \N{CHARNAME} --> N\{CHARNAME}
1878             # \p{PROPERTY} --> p\{PROPERTY}
1879             # \P{PROPERTY} --> P\{PROPERTY}
1880             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\xA1-\xFE0-9\}][^\xA1-\xFE\}]*) \} ) \z/oxms) {
1881 0         0 $char[$i] = $1 . '\\' . $2;
1882             }
1883              
1884             # \p, \P, \X --> p, P, X
1885             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
1886 0         0 $char[$i] = $1;
1887             }
1888              
1889             elsif ($char[$i] =~ /\A \\ ([0-7]{2,3}) \z/oxms) {
1890 0         0 $char[$i] = CORE::chr oct $1;
1891             }
1892             elsif ($char[$i] =~ /\A \\x ([0-9A-Fa-f]{1,2}) \z/oxms) {
1893 0         0 $char[$i] = CORE::chr hex $1;
1894             }
1895             elsif ($char[$i] =~ /\A \\c ([\x40-\x5F]) \z/oxms) {
1896 206         880 $char[$i] = CORE::chr(CORE::ord($1) & 0x1F);
1897             }
1898             elsif ($char[$i] =~ /\A (\\ [0nrtfbaedswDSWHVhvR]) \z/oxms) {
1899             $char[$i] = {
1900             '\0' => "\0",
1901             '\n' => "\n",
1902             '\r' => "\r",
1903             '\t' => "\t",
1904             '\f' => "\f",
1905             '\b' => "\x08", # \b means backspace in character class
1906             '\a' => "\a",
1907             '\e' => "\e",
1908             '\d' => '[0-9]',
1909              
1910             # Vertical tabs are now whitespace
1911             # \s in a regex now matches a vertical tab in all circumstances.
1912             # http://search.cpan.org/dist/perl-5.18.0/pod/perldelta.pod#Vertical_tabs_are_now_whitespace
1913             # \t \n \v \f \r space
1914             # '\s' => '[\x09\x0A \x0C\x0D\x20]',
1915             # '\s' => '[\x09\x0A\x0B\x0C\x0D\x20]',
1916             '\s' => '\s',
1917              
1918             '\w' => '[0-9A-Z_a-z]',
1919             '\D' => '${Eksc5601::eD}',
1920             '\S' => '${Eksc5601::eS}',
1921             '\W' => '${Eksc5601::eW}',
1922              
1923             '\H' => '${Eksc5601::eH}',
1924             '\V' => '${Eksc5601::eV}',
1925             '\h' => '[\x09\x20]',
1926             '\v' => '[\x0A\x0B\x0C\x0D]',
1927             '\R' => '${Eksc5601::eR}',
1928              
1929 0         0 }->{$1};
1930             }
1931              
1932             # POSIX-style character classes
1933             elsif ($ignorecase and ($char[$i] =~ /\A ( \[\: \^? (?:lower|upper) :\] ) \z/oxms)) {
1934             $char[$i] = {
1935              
1936             '[:lower:]' => '[\x41-\x5A\x61-\x7A]',
1937             '[:upper:]' => '[\x41-\x5A\x61-\x7A]',
1938             '[:^lower:]' => '${Eksc5601::not_lower_i}',
1939             '[:^upper:]' => '${Eksc5601::not_upper_i}',
1940              
1941 33         580 }->{$1};
1942             }
1943             elsif ($char[$i] =~ /\A ( \[\: \^? (?:alnum|alpha|ascii|blank|cntrl|digit|graph|lower|print|punct|space|upper|word|xdigit) :\] ) \z/oxms) {
1944             $char[$i] = {
1945              
1946             '[:alnum:]' => '[\x30-\x39\x41-\x5A\x61-\x7A]',
1947             '[:alpha:]' => '[\x41-\x5A\x61-\x7A]',
1948             '[:ascii:]' => '[\x00-\x7F]',
1949             '[:blank:]' => '[\x09\x20]',
1950             '[:cntrl:]' => '[\x00-\x1F\x7F]',
1951             '[:digit:]' => '[\x30-\x39]',
1952             '[:graph:]' => '[\x21-\x7F]',
1953             '[:lower:]' => '[\x61-\x7A]',
1954             '[:print:]' => '[\x20-\x7F]',
1955             '[:punct:]' => '[\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]',
1956              
1957             # P.174 POSIX-Style Character Classes
1958             # in Chapter 5: Pattern Matching
1959             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
1960              
1961             # P.311 11.2.4 Character Classes and other Special Escapes
1962             # in Chapter 11: perlre: Perl regular expressions
1963             # of ISBN-13: 978-1-906966-02-7 The Perl Language Reference Manual (for Perl version 5.12.1)
1964              
1965             # P.210 POSIX-Style Character Classes
1966             # in Chapter 5: Pattern Matching
1967             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
1968              
1969             '[:space:]' => '[\s\x0B]', # "\s" plus vertical tab ("\cK")
1970              
1971             '[:upper:]' => '[\x41-\x5A]',
1972             '[:word:]' => '[\x30-\x39\x41-\x5A\x5F\x61-\x7A]',
1973             '[:xdigit:]' => '[\x30-\x39\x41-\x46\x61-\x66]',
1974             '[:^alnum:]' => '${Eksc5601::not_alnum}',
1975             '[:^alpha:]' => '${Eksc5601::not_alpha}',
1976             '[:^ascii:]' => '${Eksc5601::not_ascii}',
1977             '[:^blank:]' => '${Eksc5601::not_blank}',
1978             '[:^cntrl:]' => '${Eksc5601::not_cntrl}',
1979             '[:^digit:]' => '${Eksc5601::not_digit}',
1980             '[:^graph:]' => '${Eksc5601::not_graph}',
1981             '[:^lower:]' => '${Eksc5601::not_lower}',
1982             '[:^print:]' => '${Eksc5601::not_print}',
1983             '[:^punct:]' => '${Eksc5601::not_punct}',
1984             '[:^space:]' => '${Eksc5601::not_space}',
1985             '[:^upper:]' => '${Eksc5601::not_upper}',
1986             '[:^word:]' => '${Eksc5601::not_word}',
1987             '[:^xdigit:]' => '${Eksc5601::not_xdigit}',
1988              
1989 8         72 }->{$1};
1990             }
1991             elsif ($char[$i] =~ /\A \\ ($q_char) \z/oxms) {
1992 70         1360 $char[$i] = $1;
1993             }
1994             }
1995              
1996             # open character list
1997 7         33 my @singleoctet = ();
1998 758         1244 my @multipleoctet = ();
1999 758         1054 for (my $i=0; $i <= $#char; ) {
2000              
2001             # escaped -
2002 758 100 100     1658 if (defined($char[$i+1]) and ($char[$i+1] eq '...')) {
    100          
    100          
    50          
    50          
    100          
2003 2151         8945 $i += 1;
2004 497         773 next;
2005             }
2006              
2007             # make range regexp
2008             elsif ($char[$i] eq '...') {
2009              
2010             # range error
2011 497 50       920 if (CORE::length($char[$i-1]) > CORE::length($char[$i+1])) {
    100          
2012 497         1859 croak 'Invalid [] range in regexp (length(A) > length(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
2013             }
2014             elsif (CORE::length($char[$i-1]) == CORE::length($char[$i+1])) {
2015 0 50       0 if ($char[$i-1] gt $char[$i+1]) {
2016 477         1160 croak 'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) ' . '\x' . unpack('H*',$char[$i-1]) . '-\x' . unpack('H*',$char[$i+1]);
2017             }
2018             }
2019              
2020             # make range regexp per length
2021 0         0 for my $length (CORE::length($char[$i-1]) .. CORE::length($char[$i+1])) {
2022 497         1345 my @regexp = ();
2023              
2024             # is first and last
2025 517 100 100     713 if (($length == CORE::length($char[$i-1])) and ($length == CORE::length($char[$i+1]))) {
    100 33        
    50          
    50          
2026 517         7324 push @regexp, _range_regexp($length, $char[$i-1], $char[$i+1]);
2027             }
2028              
2029             # is first
2030             elsif ($length == CORE::length($char[$i-1])) {
2031 477         1256 push @regexp, _range_regexp($length, $char[$i-1], "\xFF" x $length);
2032             }
2033              
2034             # is inside in first and last
2035             elsif ((CORE::length($char[$i-1]) < $length) and ($length < CORE::length($char[$i+1]))) {
2036 20         76 push @regexp, _range_regexp($length, "\x00" x $length, "\xFF" x $length);
2037             }
2038              
2039             # is last
2040             elsif ($length == CORE::length($char[$i+1])) {
2041 0         0 push @regexp, _range_regexp($length, "\x00" x $length, $char[$i+1]);
2042             }
2043              
2044             else {
2045 20         56 die __FILE__, ": subroutine make_regexp panic.\n";
2046             }
2047              
2048 0 100       0 if ($length == 1) {
2049 517         929 push @singleoctet, @regexp;
2050             }
2051             else {
2052 386         847 push @multipleoctet, @regexp;
2053             }
2054             }
2055              
2056 131         261 $i += 2;
2057             }
2058              
2059             # with /i modifier
2060             elsif ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) {
2061 497 100       974 if ($modifier =~ /i/oxms) {
2062 764         1369 my $uc = Eksc5601::uc($char[$i]);
2063 192         340 my $fc = Eksc5601::fc($char[$i]);
2064 192 50       15710 if ($uc ne $fc) {
2065 192 50       332 if (CORE::length($fc) == 1) {
2066 192         261 push @singleoctet, $uc, $fc;
2067             }
2068             else {
2069 192         352 push @singleoctet, $uc;
2070 0         0 push @multipleoctet, $fc;
2071             }
2072             }
2073             else {
2074 0         0 push @singleoctet, $char[$i];
2075             }
2076             }
2077             else {
2078 0         0 push @singleoctet, $char[$i];
2079             }
2080 572         993 $i += 1;
2081             }
2082              
2083             # single character of single octet code
2084             elsif ($char[$i] =~ /\A (?: \\h ) \z/oxms) {
2085 764         1242 push @singleoctet, "\t", "\x20";
2086 0         0 $i += 1;
2087             }
2088             elsif ($char[$i] =~ /\A (?: \\v ) \z/oxms) {
2089 0         0 push @singleoctet, "\x0A", "\x0B", "\x0C", "\x0D";
2090 0         0 $i += 1;
2091             }
2092             elsif ($char[$i] =~ /\A (?: \\d | \\s | \\w ) \z/oxms) {
2093 0         0 push @singleoctet, $char[$i];
2094 2         6 $i += 1;
2095             }
2096              
2097             # single character of multiple-octet code
2098             else {
2099 2         5 push @multipleoctet, $char[$i];
2100 391         669 $i += 1;
2101             }
2102             }
2103              
2104             # quote metachar
2105 391         638 for (@singleoctet) {
2106 758 50       1477 if ($_ eq '...') {
    100          
    100          
    100          
    100          
2107 1364         5920 $_ = '-';
2108             }
2109             elsif (/\A \n \z/oxms) {
2110 0         0 $_ = '\n';
2111             }
2112             elsif (/\A \r \z/oxms) {
2113 8         17 $_ = '\r';
2114             }
2115             elsif (/\A ([\x00-\x20\x7F-\xFF]) \z/oxms) {
2116 8         20 $_ = sprintf('\x%02X', CORE::ord $1);
2117             }
2118             elsif (/\A [\x00-\xFF] \z/oxms) {
2119 1         6 $_ = quotemeta $_;
2120             }
2121             }
2122              
2123             # return character list
2124 939         1405 return \@singleoctet, \@multipleoctet;
2125             }
2126              
2127             #
2128             # KSC5601 octal escape sequence
2129             #
2130             sub octchr {
2131 758     5 0 2495 my($octdigit) = @_;
2132              
2133 5         15 my @binary = ();
2134 5         7 for my $octal (split(//,$octdigit)) {
2135             push @binary, {
2136             '0' => '000',
2137             '1' => '001',
2138             '2' => '010',
2139             '3' => '011',
2140             '4' => '100',
2141             '5' => '101',
2142             '6' => '110',
2143             '7' => '111',
2144 5         22 }->{$octal};
2145             }
2146 50         177 my $binary = join '', @binary;
2147              
2148             my $octchr = {
2149             # 1234567
2150             1 => pack('B*', "0000000$binary"),
2151             2 => pack('B*', "000000$binary"),
2152             3 => pack('B*', "00000$binary"),
2153             4 => pack('B*', "0000$binary"),
2154             5 => pack('B*', "000$binary"),
2155             6 => pack('B*', "00$binary"),
2156             7 => pack('B*', "0$binary"),
2157             0 => pack('B*', "$binary"),
2158              
2159 5         15 }->{CORE::length($binary) % 8};
2160              
2161 5         55 return $octchr;
2162             }
2163              
2164             #
2165             # KSC5601 hexadecimal escape sequence
2166             #
2167             sub hexchr {
2168 5     5 0 19 my($hexdigit) = @_;
2169              
2170             my $hexchr = {
2171             1 => pack('H*', "0$hexdigit"),
2172             0 => pack('H*', "$hexdigit"),
2173              
2174 5         15 }->{CORE::length($_[0]) % 2};
2175              
2176 5         52 return $hexchr;
2177             }
2178              
2179             #
2180             # KSC5601 open character list for qr
2181             #
2182             sub charlist_qr {
2183              
2184 5     519 0 20 my $modifier = pop @_;
2185 519         954 my @char = @_;
2186              
2187 519         1522 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
2188 519         1433 my @singleoctet = @$singleoctet;
2189 519         1100 my @multipleoctet = @$multipleoctet;
2190              
2191             # return character list
2192 519 100       867 if (scalar(@singleoctet) >= 1) {
2193              
2194             # with /i modifier
2195 519 100       1161 if ($modifier =~ m/i/oxms) {
2196 384         917 my %singleoctet_ignorecase = ();
2197 107         162 for (@singleoctet) {
2198 107   100     157 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
2199 272         873 for my $ord (hex($1) .. hex($2)) {
2200 80         287 my $char = CORE::chr($ord);
2201 1206         1562 my $uc = Eksc5601::uc($char);
2202 1206         1473 my $fc = Eksc5601::fc($char);
2203 1206 100       1666 if ($uc eq $fc) {
2204 1206         1792 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
2205             }
2206             else {
2207 617 50       1343 if (CORE::length($fc) == 1) {
2208 589         745 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2209 589         1085 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
2210             }
2211             else {
2212 589         1363 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2213 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
2214             }
2215             }
2216             }
2217             }
2218 0 100       0 if ($_ ne '') {
2219 272         454 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
2220             }
2221             }
2222 192         727 my $i = 0;
2223 107         150 my @singleoctet_ignorecase = ();
2224 107         154 for my $ord (0 .. 255) {
2225 107 100       186 if (exists $singleoctet_ignorecase{$ord}) {
2226 27392         31511 push @{$singleoctet_ignorecase[$i]}, $ord;
  1737         1576  
2227             }
2228             else {
2229 1737         2580 $i++;
2230             }
2231             }
2232 25655         24927 @singleoctet = ();
2233 107         163 for my $range (@singleoctet_ignorecase) {
2234 107 100       252 if (ref $range) {
2235 11252 100       16794 if (scalar(@{$range}) == 1) {
  214 50       208  
2236 214         319 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  5         5  
2237             }
2238 5         84 elsif (scalar(@{$range}) == 2) {
2239 209         281 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
2240             }
2241             else {
2242 0         0 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  209         244  
  209         229  
2243             }
2244             }
2245             }
2246             }
2247              
2248 209         886 my $not_anchor = '';
2249 384         576 $not_anchor = '(?![\xA1-\xFE])';
2250              
2251 384         530 push @multipleoctet, join('', $not_anchor, '[', @singleoctet, ']' );
2252             }
2253 384 100       960 if (scalar(@multipleoctet) >= 2) {
2254 519         1076 return '(?:' . join('|', @multipleoctet) . ')';
2255             }
2256             else {
2257 102         656 return $multipleoctet[0];
2258             }
2259             }
2260              
2261             #
2262             # KSC5601 open character list for not qr
2263             #
2264             sub charlist_not_qr {
2265              
2266 417     239 0 1774 my $modifier = pop @_;
2267 239         444 my @char = @_;
2268              
2269 239         1927 my($singleoctet, $multipleoctet) = _charlist(@char, $modifier);
2270 239         639 my @singleoctet = @$singleoctet;
2271 239         483 my @multipleoctet = @$multipleoctet;
2272              
2273             # with /i modifier
2274 239 100       399 if ($modifier =~ m/i/oxms) {
2275 239         757 my %singleoctet_ignorecase = ();
2276 128         223 for (@singleoctet) {
2277 128   100     197 while (s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
2278 272         1031 for my $ord (hex($1) .. hex($2)) {
2279 80         304 my $char = CORE::chr($ord);
2280 1206         1519 my $uc = Eksc5601::uc($char);
2281 1206         1485 my $fc = Eksc5601::fc($char);
2282 1206 100       1652 if ($uc eq $fc) {
2283 1206         1724 $singleoctet_ignorecase{unpack 'C*', $char} = 1;
2284             }
2285             else {
2286 617 50       1339 if (CORE::length($fc) == 1) {
2287 589         831 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2288 589         1114 $singleoctet_ignorecase{unpack 'C*', $fc} = 1;
2289             }
2290             else {
2291 589         1364 $singleoctet_ignorecase{unpack 'C*', $uc} = 1;
2292 0         0 push @multipleoctet, join '', map {sprintf('\x%02X',$_)} unpack 'C*', $fc;
  0         0  
2293             }
2294             }
2295             }
2296             }
2297 0 100       0 if ($_ ne '') {
2298 272         459 $singleoctet_ignorecase{unpack 'C*', $_} = 1;
2299             }
2300             }
2301 192         435 my $i = 0;
2302 128         175 my @singleoctet_ignorecase = ();
2303 128         195 for my $ord (0 .. 255) {
2304 128 100       213 if (exists $singleoctet_ignorecase{$ord}) {
2305 32768         42150 push @{$singleoctet_ignorecase[$i]}, $ord;
  1737         1616  
2306             }
2307             else {
2308 1737         2935 $i++;
2309             }
2310             }
2311 31031         31700 @singleoctet = ();
2312 128         213 for my $range (@singleoctet_ignorecase) {
2313 128 100       289 if (ref $range) {
2314 11252 100       28395 if (scalar(@{$range}) == 1) {
  214 50       215  
2315 214         1436 push @singleoctet, sprintf('\x%02X', @{$range}[0]);
  5         7  
2316             }
2317 5         72 elsif (scalar(@{$range}) == 2) {
2318 209         293 push @singleoctet, sprintf('\x%02X\x%02X', @{$range}[0], @{$range}[-1]);
  0         0  
  0         0  
2319             }
2320             else {
2321 0         0 push @singleoctet, sprintf('\x%02X-\x%02X', @{$range}[0], @{$range}[-1]);
  209         238  
  209         295  
2322             }
2323             }
2324             }
2325             }
2326              
2327             # return character list
2328 209 100       997 if (scalar(@multipleoctet) >= 1) {
2329 239 100       682 if (scalar(@singleoctet) >= 1) {
2330              
2331             # any character other than multiple-octet and single octet character class
2332 114         277 return '(?!' . join('|', @multipleoctet) . ')(?:[^\xA1-\xFE' . join('', @singleoctet) . ']|[\xA1-\xFE][\x00-\xFF])';
2333             }
2334             else {
2335              
2336             # any character other than multiple-octet character class
2337 70         698 return '(?!' . join('|', @multipleoctet) . ")(?:$your_char)";
2338             }
2339             }
2340             else {
2341 44 50       283 if (scalar(@singleoctet) >= 1) {
2342              
2343             # any character other than single octet character class
2344 125         233 return '(?:[^\xA1-\xFE' . join('', @singleoctet) . ']|[\xA1-\xFE][\x00-\xFF])';
2345             }
2346             else {
2347              
2348             # any character
2349 125         764 return "(?:$your_char)";
2350             }
2351             }
2352             }
2353              
2354             #
2355             # open file in read mode
2356             #
2357             sub _open_r {
2358 0     662   0 my(undef,$file) = @_;
2359 331     331   7209 use Fcntl qw(O_RDONLY);
  331         2271  
  331         50896  
2360 662         1991 return CORE::sysopen($_[0], $file, &O_RDONLY);
2361             }
2362              
2363             #
2364             # open file in append mode
2365             #
2366             sub _open_a {
2367 662     331   27324 my(undef,$file) = @_;
2368 331     331   4284 use Fcntl qw(O_WRONLY O_APPEND O_CREAT);
  331         2223  
  331         1016849  
2369 331         1025 return CORE::sysopen($_[0], $file, &O_WRONLY|&O_APPEND|&O_CREAT);
2370             }
2371              
2372             #
2373             # safe system
2374             #
2375             sub _systemx {
2376              
2377             # P.707 29.2.33. exec
2378             # in Chapter 29: Functions
2379             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2380             #
2381             # Be aware that in older releases of Perl, exec (and system) did not flush
2382             # your output buffer, so you needed to enable command buffering by setting $|
2383             # on one or more filehandles to avoid lost output in the case of exec, or
2384             # misordererd output in the case of system. This situation was largely remedied
2385             # in the 5.6 release of Perl. (So, 5.005 release not yet.)
2386              
2387             # P.855 exec
2388             # in Chapter 27: Functions
2389             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2390             #
2391             # In very old release of Perl (before v5.6), exec (and system) did not flush
2392             # your output buffer, so you needed to enable command buffering by setting $|
2393             # on one or more filehandles to avoid lost output with exec or misordered
2394             # output with system.
2395              
2396 331     331   59363 $| = 1;
2397              
2398             # P.565 23.1.2. Cleaning Up Your Environment
2399             # in Chapter 23: Security
2400             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2401              
2402             # P.656 Cleaning Up Your Environment
2403             # in Chapter 20: Security
2404             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2405              
2406             # local $ENV{'PATH'} = '.';
2407 331         1382 local @ENV{qw(IFS CDPATH ENV BASH_ENV)}; # Make %ENV safer
2408              
2409             # P.707 29.2.33. exec
2410             # in Chapter 29: Functions
2411             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2412             #
2413             # As we mentioned earlier, exec treats a discrete list of arguments as an
2414             # indication that it should bypass shell processing. However, there is one
2415             # place where you might still get tripped up. The exec call (and system, too)
2416             # will not distinguish between a single scalar argument and an array containing
2417             # only one element.
2418             #
2419             # @args = ("echo surprise"); # just one element in list
2420             # exec @args # still subject to shell escapes
2421             # or die "exec: $!"; # because @args == 1
2422             #
2423             # To avoid this, you can use the PATHNAME syntax, explicitly duplicating the
2424             # first argument as the pathname, which forces the rest of the arguments to be
2425             # interpreted as a list, even if there is only one of them:
2426             #
2427             # exec { $args[0] } @args # safe even with one-argument list
2428             # or die "can't exec @args: $!";
2429              
2430             # P.855 exec
2431             # in Chapter 27: Functions
2432             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2433             #
2434             # As we mentioned earlier, exec treats a discrete list of arguments as a
2435             # directive to bypass shell processing. However, there is one place where
2436             # you might still get tripped up. The exec call (and system, too) cannot
2437             # distinguish between a single scalar argument and an array containing
2438             # only one element.
2439             #
2440             # @args = ("echo surprise"); # just one element in list
2441             # exec @args # still subject to shell escapes
2442             # || die "exec: $!"; # because @args == 1
2443             #
2444             # To avoid this, use the PATHNAME syntax, explicitly duplicating the first
2445             # argument as the pathname, which forces the rest of the arguments to be
2446             # interpreted as a list, even if there is only one of them:
2447             #
2448             # exec { $args[0] } @args # safe even with one-argument list
2449             # || die "can't exec @args: $!";
2450              
2451 331         2873 return CORE::system { $_[0] } @_; # safe even with one-argument list
  331         751  
2452             }
2453              
2454             #
2455             # KSC5601 order to character (with parameter)
2456             #
2457             sub Eksc5601::chr(;$) {
2458              
2459 331 0   0 0 28909787 my $c = @_ ? $_[0] : $_;
2460              
2461 0 0       0 if ($c == 0x00) {
2462 0         0 return "\x00";
2463             }
2464             else {
2465 0         0 my @chr = ();
2466 0         0 while ($c > 0) {
2467 0         0 unshift @chr, ($c % 0x100);
2468 0         0 $c = int($c / 0x100);
2469             }
2470 0         0 return pack 'C*', @chr;
2471             }
2472             }
2473              
2474             #
2475             # KSC5601 order to character (without parameter)
2476             #
2477             sub Eksc5601::chr_() {
2478              
2479 0     0 0 0 my $c = $_;
2480              
2481 0 0       0 if ($c == 0x00) {
2482 0         0 return "\x00";
2483             }
2484             else {
2485 0         0 my @chr = ();
2486 0         0 while ($c > 0) {
2487 0         0 unshift @chr, ($c % 0x100);
2488 0         0 $c = int($c / 0x100);
2489             }
2490 0         0 return pack 'C*', @chr;
2491             }
2492             }
2493              
2494             #
2495             # KSC5601 path globbing (with parameter)
2496             #
2497             sub Eksc5601::glob($) {
2498              
2499 0 0   0 0 0 if (wantarray) {
2500 0         0 my @glob = _DOS_like_glob(@_);
2501 0         0 for my $glob (@glob) {
2502 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2503             }
2504 0         0 return @glob;
2505             }
2506             else {
2507 0         0 my $glob = _DOS_like_glob(@_);
2508 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2509 0         0 return $glob;
2510             }
2511             }
2512              
2513             #
2514             # KSC5601 path globbing (without parameter)
2515             #
2516             sub Eksc5601::glob_() {
2517              
2518 0 0   0 0 0 if (wantarray) {
2519 0         0 my @glob = _DOS_like_glob();
2520 0         0 for my $glob (@glob) {
2521 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2522             }
2523 0         0 return @glob;
2524             }
2525             else {
2526 0         0 my $glob = _DOS_like_glob();
2527 0         0 $glob =~ s{ \A (?:\./)+ }{}oxms;
2528 0         0 return $glob;
2529             }
2530             }
2531              
2532             #
2533             # KSC5601 path globbing via File::DosGlob 1.10
2534             #
2535             # Often I confuse "_dosglob" and "_doglob".
2536             # So, I renamed "_dosglob" to "_DOS_like_glob".
2537             #
2538             my %iter;
2539             my %entries;
2540             sub _DOS_like_glob {
2541              
2542             # context (keyed by second cxix argument provided by core)
2543 0     0   0 my($expr,$cxix) = @_;
2544              
2545             # glob without args defaults to $_
2546 0 0       0 $expr = $_ if not defined $expr;
2547              
2548             # represents the current user's home directory
2549             #
2550             # 7.3. Expanding Tildes in Filenames
2551             # in Chapter 7. File Access
2552             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
2553             #
2554             # and File::HomeDir, File::HomeDir::Windows module
2555              
2556             # DOS-like system
2557 0 0       0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
2558 0         0 $expr =~ s{ \A ~ (?= [^/\\] ) }
  0         0  
2559             { my_home_MSWin32() }oxmse;
2560             }
2561              
2562             # UNIX-like system
2563 0 0 0     0 else {
  0         0  
2564             $expr =~ s{ \A ~ ( (?:[^\xA1-\xFE/]|[\xA1-\xFE][\x00-\xFF])* ) }
2565             { $1 ? (CORE::eval(q{(getpwnam($1))[7]})||my_home()) : my_home() }oxmse;
2566             }
2567 0 0       0  
2568 0 0       0 # assume global context if not provided one
2569             $cxix = '_G_' if not defined $cxix;
2570             $iter{$cxix} = 0 if not exists $iter{$cxix};
2571 0 0       0  
2572 0         0 # if we're just beginning, do it all first
2573             if ($iter{$cxix} == 0) {
2574             $entries{$cxix} = [ _do_glob(1, _parse_line($expr)) ];
2575             }
2576 0 0       0  
2577 0         0 # chuck it all out, quick or slow
2578 0         0 if (wantarray) {
  0         0  
2579             delete $iter{$cxix};
2580             return @{delete $entries{$cxix}};
2581 0 0       0 }
  0         0  
2582 0         0 else {
  0         0  
2583             if ($iter{$cxix} = scalar @{$entries{$cxix}}) {
2584             return shift @{$entries{$cxix}};
2585             }
2586 0         0 else {
2587 0         0 # return undef for EOL
2588 0         0 delete $iter{$cxix};
2589             delete $entries{$cxix};
2590             return undef;
2591             }
2592             }
2593             }
2594              
2595             #
2596             # KSC5601 path globbing subroutine
2597             #
2598 0     0   0 sub _do_glob {
2599 0         0  
2600 0         0 my($cond,@expr) = @_;
2601             my @glob = ();
2602             my $fix_drive_relative_paths = 0;
2603 0         0  
2604 0 0       0 OUTER:
2605 0 0       0 for my $expr (@expr) {
2606             next OUTER if not defined $expr;
2607 0         0 next OUTER if $expr eq '';
2608 0         0  
2609 0         0 my @matched = ();
2610 0         0 my @globdir = ();
2611 0         0 my $head = '.';
2612             my $pathsep = '/';
2613             my $tail;
2614 0 0       0  
2615 0         0 # if argument is within quotes strip em and do no globbing
2616 0 0       0 if ($expr =~ /\A " ((?:$q_char)*?) " \z/oxms) {
2617 0 0       0 $expr = $1;
2618 0         0 if ($cond eq 'd') {
2619             if (-d $expr) {
2620             push @glob, $expr;
2621             }
2622 0 0       0 }
2623 0         0 else {
2624             if (-e $expr) {
2625             push @glob, $expr;
2626 0         0 }
2627             }
2628             next OUTER;
2629             }
2630              
2631 0 0       0 # wildcards with a drive prefix such as h:*.pm must be changed
2632 0 0       0 # to h:./*.pm to expand correctly
2633 0         0 if ($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
2634             if ($expr =~ s# \A ((?:[A-Za-z]:)?) ([^\xA1-\xFE/\\]|[\xA1-\xFE][\x00-\xFF]) #$1./$2#oxms) {
2635             $fix_drive_relative_paths = 1;
2636             }
2637 0 0       0 }
2638 0 0       0  
2639 0         0 if (($head, $tail) = _parse_path($expr,$pathsep)) {
2640 0         0 if ($tail eq '') {
2641             push @glob, $expr;
2642 0 0       0 next OUTER;
2643 0 0       0 }
2644 0         0 if ($head =~ / \A (?:$q_char)*? [*?] /oxms) {
  0         0  
2645 0         0 if (@globdir = _do_glob('d', $head)) {
2646             push @glob, _do_glob($cond, map {"$_$pathsep$tail"} @globdir);
2647             next OUTER;
2648 0 0 0     0 }
2649 0         0 }
2650             if ($head eq '' or $head =~ /\A [A-Za-z]: \z/oxms) {
2651 0         0 $head .= $pathsep;
2652             }
2653             $expr = $tail;
2654             }
2655 0 0       0  
2656 0 0       0 # If file component has no wildcards, we can avoid opendir
2657 0         0 if ($expr !~ / \A (?:$q_char)*? [*?] /oxms) {
2658             if ($head eq '.') {
2659 0 0 0     0 $head = '';
2660 0         0 }
2661             if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
2662 0         0 $head .= $pathsep;
2663 0 0       0 }
2664 0 0       0 $head .= $expr;
2665 0         0 if ($cond eq 'd') {
2666             if (-d $head) {
2667             push @glob, $head;
2668             }
2669 0 0       0 }
2670 0         0 else {
2671             if (-e $head) {
2672             push @glob, $head;
2673 0         0 }
2674             }
2675 0 0       0 next OUTER;
2676 0         0 }
2677 0         0 opendir(*DIR, $head) or next OUTER;
2678             my @leaf = readdir DIR;
2679 0 0       0 closedir DIR;
2680 0         0  
2681             if ($head eq '.') {
2682 0 0 0     0 $head = '';
2683 0         0 }
2684             if ($head ne '' and ($head =~ / \G ($q_char) /oxmsg)[-1] ne $pathsep) {
2685             $head .= $pathsep;
2686 0         0 }
2687 0         0  
2688 0         0 my $pattern = '';
2689             while ($expr =~ / \G ($q_char) /oxgc) {
2690             my $char = $1;
2691              
2692             # 6.9. Matching Shell Globs as Regular Expressions
2693             # in Chapter 6. Pattern Matching
2694             # of ISBN 0-596-00313-7 Perl Cookbook, 2nd Edition.
2695 0 0       0 # (and so on)
    0          
    0          
2696 0         0  
2697             if ($char eq '*') {
2698             $pattern .= "(?:$your_char)*",
2699 0         0 }
2700             elsif ($char eq '?') {
2701             $pattern .= "(?:$your_char)?", # DOS style
2702             # $pattern .= "(?:$your_char)", # UNIX style
2703 0         0 }
2704             elsif ((my $fc = Eksc5601::fc($char)) ne $char) {
2705             $pattern .= $fc;
2706 0         0 }
2707             else {
2708             $pattern .= quotemeta $char;
2709 0     0   0 }
  0         0  
2710             }
2711             my $matchsub = sub { Eksc5601::fc($_[0]) =~ /\A $pattern \z/xms };
2712              
2713             # if ($@) {
2714             # print STDERR "$0: $@\n";
2715             # next OUTER;
2716             # }
2717 0         0  
2718 0 0 0     0 INNER:
2719 0         0 for my $leaf (@leaf) {
2720             if ($leaf eq '.' or $leaf eq '..') {
2721 0 0 0     0 next INNER;
2722 0         0 }
2723             if ($cond eq 'd' and not -d "$head$leaf") {
2724             next INNER;
2725 0 0       0 }
2726 0         0  
2727 0         0 if (&$matchsub($leaf)) {
2728             push @matched, "$head$leaf";
2729             next INNER;
2730             }
2731              
2732             # [DOS compatibility special case]
2733 0 0 0     0 # Failed, add a trailing dot and try again, but only...
      0        
2734              
2735             if (Eksc5601::index($leaf,'.') == -1 and # if name does not have a dot in it *and*
2736             CORE::length($leaf) <= 8 and # name is shorter than or equal to 8 chars *and*
2737 0 0       0 Eksc5601::index($pattern,'\\.') != -1 # pattern has a dot.
2738 0         0 ) {
2739 0         0 if (&$matchsub("$leaf.")) {
2740             push @matched, "$head$leaf";
2741             next INNER;
2742             }
2743 0 0       0 }
2744 0         0 }
2745             if (@matched) {
2746             push @glob, @matched;
2747 0 0       0 }
2748 0         0 }
2749 0         0 if ($fix_drive_relative_paths) {
2750             for my $glob (@glob) {
2751             $glob =~ s# \A ([A-Za-z]:) \./ #$1#oxms;
2752 0         0 }
2753             }
2754             return @glob;
2755             }
2756              
2757             #
2758             # KSC5601 parse line
2759             #
2760 0     0   0 sub _parse_line {
2761              
2762 0         0 my($line) = @_;
2763 0         0  
2764 0         0 $line .= ' ';
2765             my @piece = ();
2766             while ($line =~ /
2767             " ( (?>(?: [^\xA1-\xFE"] |[\xA1-\xFE][\x00-\xFF] )* ) ) " (?>\s+) |
2768             ( (?>(?: [^\xA1-\xFE"\s]|[\xA1-\xFE][\x00-\xFF] )* ) ) (?>\s+)
2769 0 0       0 /oxmsg
2770             ) {
2771 0         0 push @piece, defined($1) ? $1 : $2;
2772             }
2773             return @piece;
2774             }
2775              
2776             #
2777             # KSC5601 parse path
2778             #
2779 0     0   0 sub _parse_path {
2780              
2781 0         0 my($path,$pathsep) = @_;
2782 0         0  
2783 0         0 $path .= '/';
2784             my @subpath = ();
2785             while ($path =~ /
2786             ((?: [^\xA1-\xFE\/\\]|[\xA1-\xFE][\x00-\xFF] )+?) [\/\\]
2787 0         0 /oxmsg
2788             ) {
2789             push @subpath, $1;
2790 0         0 }
2791 0         0  
2792 0         0 my $tail = pop @subpath;
2793             my $head = join $pathsep, @subpath;
2794             return $head, $tail;
2795             }
2796              
2797             #
2798             # via File::HomeDir::Windows 1.00
2799             #
2800             sub my_home_MSWin32 {
2801              
2802             # A lot of unix people and unix-derived tools rely on
2803 0 0 0 0 0 0 # the ability to overload HOME. We will support it too
    0 0        
    0 0        
      0        
      0        
2804 0         0 # so that they can replace raw HOME calls with File::HomeDir.
2805             if (exists $ENV{'HOME'} and $ENV{'HOME'}) {
2806             return $ENV{'HOME'};
2807             }
2808              
2809 0         0 # Do we have a user profile?
2810             elsif (exists $ENV{'USERPROFILE'} and $ENV{'USERPROFILE'}) {
2811             return $ENV{'USERPROFILE'};
2812             }
2813              
2814 0         0 # Some Windows use something like $ENV{'HOME'}
2815             elsif (exists $ENV{'HOMEDRIVE'} and exists $ENV{'HOMEPATH'} and $ENV{'HOMEDRIVE'} and $ENV{'HOMEPATH'}) {
2816             return join '', $ENV{'HOMEDRIVE'}, $ENV{'HOMEPATH'};
2817 0         0 }
2818              
2819             return undef;
2820             }
2821              
2822             #
2823             # via File::HomeDir::Unix 1.00
2824 0     0 0 0 #
2825             sub my_home {
2826 0 0 0     0 my $home;
    0 0        
2827 0         0  
2828             if (exists $ENV{'HOME'} and defined $ENV{'HOME'}) {
2829             $home = $ENV{'HOME'};
2830             }
2831              
2832             # This is from the original code, but I'm guessing
2833 0         0 # it means "login directory" and exists on some Unixes.
2834             elsif (exists $ENV{'LOGDIR'} and $ENV{'LOGDIR'}) {
2835             $home = $ENV{'LOGDIR'};
2836             }
2837              
2838             ### More-desperate methods
2839              
2840 0         0 # Light desperation on any (Unixish) platform
2841             else {
2842             $home = CORE::eval q{ (getpwuid($<))[7] };
2843             }
2844              
2845 0 0 0     0 # On Unix in general, a non-existant home means "no home"
2846 0         0 # For example, "nobody"-like users might use /nonexistant
2847             if (defined $home and ! -d($home)) {
2848 0         0 $home = undef;
2849             }
2850             return $home;
2851             }
2852              
2853             #
2854             # ${^PREMATCH}, $PREMATCH, $` the string preceding what was matched
2855 0 0   0 0 0 #
2856 0 0 0     0 sub Eksc5601::PREMATCH {
2857 0         0 if (defined($&)) {
2858             if (defined($1) and (CORE::substr($&,-CORE::length($1),CORE::length($1)) eq $1)) {
2859             return CORE::substr($&,0,CORE::length($&)-CORE::length($1));
2860 0         0 }
2861             else {
2862             croak 'Use of "$`", $PREMATCH, and ${^PREMATCH} need to /( capture all )/ in regexp';
2863             }
2864 0         0 }
2865             else {
2866 0         0 return '';
2867             }
2868             return $`;
2869             }
2870              
2871             #
2872             # ${^MATCH}, $MATCH, $& the string that matched
2873 0 0   0 0 0 #
2874 0 0       0 sub Eksc5601::MATCH {
2875 0         0 if (defined($&)) {
2876             if (defined($1)) {
2877             return $1;
2878 0         0 }
2879             else {
2880             croak 'Use of "$&", $MATCH, and ${^MATCH} need to /( capture all )/ in regexp';
2881             }
2882 0         0 }
2883             else {
2884 0         0 return '';
2885             }
2886             return $&;
2887             }
2888              
2889             #
2890             # ${^POSTMATCH}, $POSTMATCH, $' the string following what was matched
2891 0     0 0 0 #
2892             sub Eksc5601::POSTMATCH {
2893             return $';
2894             }
2895              
2896             #
2897             # KSC5601 character to order (with parameter)
2898             #
2899 0 0   0 1 0 sub KSC5601::ord(;$) {
2900              
2901 0 0       0 local $_ = shift if @_;
2902 0         0  
2903 0         0 if (/\A ($q_char) /oxms) {
2904 0         0 my @ord = unpack 'C*', $1;
2905 0         0 my $ord = 0;
2906             while (my $o = shift @ord) {
2907 0         0 $ord = $ord * 0x100 + $o;
2908             }
2909             return $ord;
2910 0         0 }
2911             else {
2912             return CORE::ord $_;
2913             }
2914             }
2915              
2916             #
2917             # KSC5601 character to order (without parameter)
2918             #
2919 0 0   0 0 0 sub KSC5601::ord_() {
2920 0         0  
2921 0         0 if (/\A ($q_char) /oxms) {
2922 0         0 my @ord = unpack 'C*', $1;
2923 0         0 my $ord = 0;
2924             while (my $o = shift @ord) {
2925 0         0 $ord = $ord * 0x100 + $o;
2926             }
2927             return $ord;
2928 0         0 }
2929             else {
2930             return CORE::ord $_;
2931             }
2932             }
2933              
2934             #
2935             # KSC5601 reverse
2936             #
2937 0 0   0 0 0 sub KSC5601::reverse(@) {
2938 0         0  
2939             if (wantarray) {
2940             return CORE::reverse @_;
2941             }
2942             else {
2943              
2944             # One of us once cornered Larry in an elevator and asked him what
2945             # problem he was solving with this, but he looked as far off into
2946             # the distance as he could in an elevator and said, "It seemed like
2947 0         0 # a good idea at the time."
2948              
2949             return join '', CORE::reverse(join('',@_) =~ /\G ($q_char) /oxmsg);
2950             }
2951             }
2952              
2953             #
2954             # KSC5601 getc (with parameter, without parameter)
2955             #
2956 0     0 0 0 sub KSC5601::getc(;*@) {
2957 0 0       0  
2958 0 0 0     0 my($package) = caller;
2959             my $fh = @_ ? qualify_to_ref(shift,$package) : \*STDIN;
2960 0         0 croak 'Too many arguments for KSC5601::getc' if @_ and not wantarray;
  0         0  
2961 0         0  
2962 0         0 my @length = sort { $a <=> $b } keys %range_tr;
2963 0         0 my $getc = '';
2964 0 0       0 for my $length ($length[0] .. $length[-1]) {
2965 0 0       0 $getc .= CORE::getc($fh);
2966 0 0       0 if (exists $range_tr{CORE::length($getc)}) {
2967             if ($getc =~ /\A ${Eksc5601::dot_s} \z/oxms) {
2968             return wantarray ? ($getc,@_) : $getc;
2969             }
2970 0 0       0 }
2971             }
2972             return wantarray ? ($getc,@_) : $getc;
2973             }
2974              
2975             #
2976             # KSC5601 length by character
2977             #
2978 0 0   0 1 0 sub KSC5601::length(;$) {
2979              
2980 0         0 local $_ = shift if @_;
2981 0         0  
2982             local @_ = /\G ($q_char) /oxmsg;
2983             return scalar @_;
2984             }
2985              
2986             #
2987             # KSC5601 substr by character
2988             #
2989             BEGIN {
2990              
2991             # P.232 The lvalue Attribute
2992             # in Chapter 6: Subroutines
2993             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
2994              
2995             # P.336 The lvalue Attribute
2996             # in Chapter 7: Subroutines
2997             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
2998              
2999             # P.144 8.4 Lvalue subroutines
3000             # in Chapter 8: perlsub: Perl subroutines
3001 331 50 0 331 1 226677 # 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         0  
  0         0  
  0         0  
  0         0  
  0         0  
3002              
3003             CORE::eval sprintf(<<'END', ($] >= 5.014000) ? ':lvalue' : '');
3004             # vv----------------------*******
3005             sub KSC5601::substr($$;$$) %s {
3006              
3007             my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
3008              
3009             # If the substring is beyond either end of the string, substr() returns the undefined
3010             # value and produces a warning. When used as an lvalue, specifying a substring that
3011             # is entirely outside the string raises an exception.
3012             # http://perldoc.perl.org/functions/substr.html
3013              
3014             # A return with no argument returns the scalar value undef in scalar context,
3015             # an empty list () in list context, and (naturally) nothing at all in void
3016             # context.
3017              
3018             my $offset = $_[1];
3019             if (($offset > scalar(@char)) or ($offset < (-1 * scalar(@char)))) {
3020             return;
3021             }
3022              
3023             # substr($string,$offset,$length,$replacement)
3024             if (@_ == 4) {
3025             my(undef,undef,$length,$replacement) = @_;
3026             my $substr = join '', splice(@char, $offset, $length, $replacement);
3027             $_[0] = join '', @char;
3028              
3029             # return $substr; this doesn't work, don't say "return"
3030             $substr;
3031             }
3032              
3033             # substr($string,$offset,$length)
3034             elsif (@_ == 3) {
3035             my(undef,undef,$length) = @_;
3036             my $octet_offset = 0;
3037             my $octet_length = 0;
3038             if ($offset == 0) {
3039             $octet_offset = 0;
3040             }
3041             elsif ($offset > 0) {
3042             local $SIG{__WARN__} = sub {}; # avoid: Use of uninitialized value in join or string at here
3043             $octet_offset = CORE::length(join '', @char[0..$offset-1]);
3044             }
3045             else {
3046             local $SIG{__WARN__} = sub {}; # avoid: Use of uninitialized value in join or string at here
3047             $octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
3048             }
3049             if ($length == 0) {
3050             $octet_length = 0;
3051             }
3052             elsif ($length > 0) {
3053             local $SIG{__WARN__} = sub {}; # avoid: Use of uninitialized value in join or string at here
3054             $octet_length = CORE::length(join '', @char[$offset..$offset+$length-1]);
3055             }
3056             else {
3057             local $SIG{__WARN__} = sub {}; # avoid: Use of uninitialized value in join or string at here
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             # KSC5601 index by character
3083             #
3084 0     0 1 0 sub KSC5601::index($$;$) {
3085 0 0       0  
3086 0         0 my $index;
3087             if (@_ == 3) {
3088             $index = Eksc5601::index($_[0], $_[1], CORE::length(KSC5601::substr($_[0], 0, $_[2])));
3089 0         0 }
3090             else {
3091             $index = Eksc5601::index($_[0], $_[1]);
3092 0 0       0 }
3093 0         0  
3094             if ($index == -1) {
3095             return -1;
3096 0         0 }
3097             else {
3098             return KSC5601::length(CORE::substr $_[0], 0, $index);
3099             }
3100             }
3101              
3102             #
3103             # KSC5601 rindex by character
3104             #
3105 0     0 1 0 sub KSC5601::rindex($$;$) {
3106 0 0       0  
3107 0         0 my $rindex;
3108             if (@_ == 3) {
3109             $rindex = Eksc5601::rindex($_[0], $_[1], CORE::length(KSC5601::substr($_[0], 0, $_[2])));
3110 0         0 }
3111             else {
3112             $rindex = Eksc5601::rindex($_[0], $_[1]);
3113 0 0       0 }
3114 0         0  
3115             if ($rindex == -1) {
3116             return -1;
3117 0         0 }
3118             else {
3119             return KSC5601::length(CORE::substr $_[0], 0, $rindex);
3120             }
3121             }
3122              
3123 331     331   4600 # when 'm//', '/' means regexp match 'm//' and '?' means regexp match '??'
  331         3954  
  331         37629  
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 KSC5601::ord()
3128             my $function_ord = 'ord';
3129              
3130             # ord to ord or KSC5601::ord_
3131             my $function_ord_ = 'ord';
3132              
3133             # reverse to reverse or KSC5601::reverse
3134             my $function_reverse = 'reverse';
3135              
3136             # getc to getc or KSC5601::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 331     331   3704 $anchor = q{${Eksc5601::anchor}};
  331     0   3830  
  331         11991208  
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             [^\xA1-\xFE\\()] |
3155             \( (?{$nest++}) |
3156             \) (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3157             [\xA1-\xFE][\x00-\xFF] |
3158             \\ [^\xA1-\xFEc] |
3159             \\c[\x40-\x5F] |
3160             \\ [\xA1-\xFE][\x00-\xFF] |
3161             [\x00-\xFF]
3162             }xms;
3163              
3164             my $qq_brace = qr{(?{local $nest=0}) (?>(?:
3165             [^\xA1-\xFE\\{}] |
3166             \{ (?{$nest++}) |
3167             \} (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3168             [\xA1-\xFE][\x00-\xFF] |
3169             \\ [^\xA1-\xFEc] |
3170             \\c[\x40-\x5F] |
3171             \\ [\xA1-\xFE][\x00-\xFF] |
3172             [\x00-\xFF]
3173             }xms;
3174              
3175             my $qq_bracket = qr{(?{local $nest=0}) (?>(?:
3176             [^\xA1-\xFE\\\[\]] |
3177             \[ (?{$nest++}) |
3178             \] (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3179             [\xA1-\xFE][\x00-\xFF] |
3180             \\ [^\xA1-\xFEc] |
3181             \\c[\x40-\x5F] |
3182             \\ [\xA1-\xFE][\x00-\xFF] |
3183             [\x00-\xFF]
3184             }xms;
3185              
3186             my $qq_angle = qr{(?{local $nest=0}) (?>(?:
3187             [^\xA1-\xFE\\<>] |
3188             \< (?{$nest++}) |
3189             \> (?(?{$nest>0})(?{$nest--})|(?!)))*) (?(?{$nest!=0})(?!)) |
3190             [\xA1-\xFE][\x00-\xFF] |
3191             \\ [^\xA1-\xFEc] |
3192             \\c[\x40-\x5F] |
3193             \\ [\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             [^\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 | KSC5601::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             [^\xA1-\xFE()] |
3222             [\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             [^\xA1-\xFE\{\}] |
3230             [\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             [^\xA1-\xFE\[\]] |
3238             [\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             [^\xA1-\xFE<>] |
3246             [\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{$Eksc5601::matched};
3255             $s_matched = q{ Eksc5601::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 KSC5601 script
3267 0 50   331 0 0 #
3268             sub KSC5601::escape(;$) {
3269             local($_) = $_[0] if @_;
3270              
3271             # P.359 The Study Function
3272             # in Chapter 7: Perl
3273 331         1079 # 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 331         688 # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
3295 331         640  
3296 331         1304 my $e_script = '';
3297             while (not /\G \z/oxgc) { # member
3298             $e_script .= KSC5601::escape_token();
3299 132299         197537 }
3300              
3301             return $e_script;
3302             }
3303              
3304             #
3305             # escape KSC5601 token of script
3306             #
3307             sub KSC5601::escape_token {
3308              
3309 331     132299 0 4712 # \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 132299 100 100     153055 # 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 132299         5929324  
3330 22461 100       27142 if (/\G ( \n ) /oxgc) { # another member (and so on)
3331 22461         37714 my $heredoc = '';
3332             if (scalar(@heredoc_delimiter) >= 1) {
3333 191         261 $slash = 'm//';
3334 191         347  
3335             $heredoc = join '', @heredoc;
3336             @heredoc = ();
3337 191         324  
3338 191         337 # skip here document
3339             for my $heredoc_delimiter (@heredoc_delimiter) {
3340 199         1208 /\G .*? \n $heredoc_delimiter \n/xmsgc;
3341             }
3342 191         356 @heredoc_delimiter = ();
3343              
3344 191         270 $here_script = '';
3345             }
3346             return "\n" . $heredoc;
3347             }
3348 22461         70975  
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 31260         93279  
3364 2628         3954 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 2628         8198  
3384             elsif (/\G ( \( (?>\s*) (?: local \b | my \b | our \b | state \b )? (?>\s*) \$ $qq_scalar ) /oxgc) {
3385 145 50       392 my $e_string = e_string($1);
    50          
3386 145         5133  
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 145         283 else {
3400             $slash = 'div';
3401             return $e_string;
3402             }
3403             }
3404              
3405 145         598 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eksc5601::PREMATCH()
3406 4         8 elsif (/\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
3407             $slash = 'div';
3408             return q{Eksc5601::PREMATCH()};
3409             }
3410              
3411 4         13 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eksc5601::MATCH()
3412 28         56 elsif (/\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
3413             $slash = 'div';
3414             return q{Eksc5601::MATCH()};
3415             }
3416              
3417 28         74 # $', ${'} --> $', ${'}
3418 1         2 elsif (/\G ( \$' | \$\{'\} ) /oxmsgc) {
3419             $slash = 'div';
3420             return $1;
3421             }
3422              
3423 1         4 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eksc5601::POSTMATCH()
3424 3         6 elsif (/\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
3425             $slash = 'div';
3426             return q{Eksc5601::POSTMATCH()};
3427             }
3428              
3429             # scalar variable $scalar =~ tr///;
3430             # scalar variable $scalar =~ s///;
3431             # substr() =~ tr///;
3432 3         12 # substr() =~ s///;
3433             elsif (/\G ( \$ $qq_scalar | $qq_substr ) /oxgc) {
3434 2451 100       5204 my $scalar = e_string($1);
    100          
3435 2451         8982  
3436 9         18 if (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?: tr | y ) \b ) /oxgc) {
3437 9         17 $tr_variable = $scalar;
3438 9         15 $bind_operator = $1;
3439             $slash = 'm//';
3440             return '';
3441 9         121 }
3442 119         232 elsif (/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
3443 119         229 $sub_variable = $scalar;
3444 119         356 $bind_operator = $1;
3445             $slash = 'm//';
3446             return '';
3447 119         366 }
3448 2323         3213 else {
3449             $slash = 'div';
3450             return $scalar;
3451             }
3452             }
3453              
3454 2323         6145 # end of statement
3455             elsif (/\G ( [,;] ) /oxgc) {
3456             $slash = 'm//';
3457 8458         13519  
3458             # clear tr/// variable
3459             $tr_variable = '';
3460 8458         10035  
3461             # clear s/// variable
3462 8458         9123 $sub_variable = '';
3463              
3464 8458         8989 $bind_operator = '';
3465              
3466             return $1;
3467             }
3468              
3469 8458         29093 # bareword
3470             elsif (/\G ( \{ (?>\s*) (?: tr | index | rindex | reverse ) (?>\s*) \} ) /oxmsgc) {
3471             return $1;
3472             }
3473              
3474 0         0 # $0 --> $0
3475 2         6 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         3 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         210 elsif (/\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
3493             $slash = 'div';
3494             return e_capture($1);
3495 129         292 }
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         229 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         463 # $ @ # \ ' " / ? ( ) [ ] < >
3539 91         176 elsif (/\G ( \$[\$\@\#\\\'\"\/\?\(\)\[\]\<\>] ) /oxmsgc) {
3540             $slash = 'div';
3541             return $1;
3542             }
3543              
3544 91         356 # 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*) < ((?:[^\xA1-\xFE>\0\a\e\f\n\r\t]|[\xA1-\xFE][\x00-\xFF])+?) > (?>\s*) \) \b /oxgc) {
3554             return 'while ($_ = Eksc5601::glob("' . $1 . '"))';
3555             }
3556              
3557 0         0 # while (glob)
3558             elsif (/\G \b while (?>\s*) \( (?>\s*) glob (?>\s*) \) /oxgc) {
3559             return 'while ($_ = Eksc5601::glob_)';
3560             }
3561              
3562 0         0 # while (glob(WILDCARD))
3563             elsif (/\G \b while (?>\s*) \( (?>\s*) glob \b /oxgc) {
3564             return 'while ($_ = Eksc5601::glob';
3565             }
3566 0         0  
  425         972  
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         1595  
  19         37  
3570 19         63 # subroutines of package Eksc5601
  0         0  
3571 0         0 elsif (/\G \b (CORE:: | ->(>?\s*) (?: atan2 | [a-z]{2,})) \b /oxgc) { $slash = 'm//'; return $1; }
  13         17  
3572 13         37 elsif (/\G \b Char::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  0         0  
3573 0         0 elsif (/\G \b KSC5601::eval (?= (?>\s*) \{ ) /oxgc) { $slash = 'm//'; return 'eval'; }
  114         177  
3574 114         295 elsif (/\G \b Char::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval Char::escape'; }
  2         4  
3575 2         7 elsif (/\G \b KSC5601::eval \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'eval KSC5601::escape'; }
  2         4  
3576 2         6 elsif (/\G \b bytes::substr \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'substr'; }
  2         5  
3577 2         5 elsif (/\G \b chop \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eksc5601::chop'; }
  0         0  
3578 0         0 elsif (/\G \b bytes::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'index'; }
  2         4  
3579 2         5 elsif (/\G \b Char::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::index'; }
  2         3  
3580 2         5 elsif (/\G \b KSC5601::index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'KSC5601::index'; }
  2         4  
3581 2         6 elsif (/\G \b index \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eksc5601::index'; }
  0         0  
3582 0         0 elsif (/\G \b bytes::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'rindex'; }
  2         5  
3583 2         5 elsif (/\G \b Char::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Char::rindex'; }
  2         4  
3584 2         6 elsif (/\G \b KSC5601::rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'KSC5601::rindex'; }
  1         2  
3585 1         3 elsif (/\G \b rindex \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eksc5601::rindex'; }
  0         0  
3586 0         0 elsif (/\G \b lc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eksc5601::lc'; }
  0         0  
3587 0         0 elsif (/\G \b lcfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eksc5601::lcfirst'; }
  0         0  
3588 0         0 elsif (/\G \b uc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eksc5601::uc'; }
  3         5  
3589             elsif (/\G \b ucfirst (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eksc5601::ucfirst'; }
3590             elsif (/\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eksc5601::fc'; }
3591 3         8  
  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         8  
3614 2         8  
  2         5  
3615 2         6 elsif (/\G \b bytes::length (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'length'; }
  36         75  
3616 36         113 elsif (/\G \b bytes::chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'chr'; }
  2         7  
3617 2         8 elsif (/\G \b chr (?= (?>\s+)[A-Za-z_]|(?>\s*)['"`\$\@\&\*\(]) /oxgc) { $slash = 'm//'; return 'Eksc5601::chr'; }
  2         4  
3618 2         8 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 'Eksc5601::glob'; }
  0         0  
3621 0         0 elsif (/\G \b lc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eksc5601::lc_'; }
  0         0  
3622 0         0 elsif (/\G \b lcfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eksc5601::lcfirst_'; }
  0         0  
3623 0         0 elsif (/\G \b uc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eksc5601::uc_'; }
  0         0  
3624 0         0 elsif (/\G \b ucfirst \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eksc5601::ucfirst_'; }
  0         0  
3625             elsif (/\G \b fc \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eksc5601::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 'Eksc5601::chr_'; }
  2         4  
3631 2         8 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         7  
3633 4         14 elsif (/\G \b glob \b (?! (?>\s*) => ) /oxgc) { $slash = 'm//'; return 'Eksc5601::glob_'; }
  8         19  
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         32 # split
3637             elsif (/\G \b (split) \b (?! (?>\s*) => ) /oxgc) {
3638 186         362 $slash = 'm//';
3639 186         270  
3640 186         609 my $e = '';
3641             while (/\G ( (?>\s+) | \( | \#.* ) /oxgc) {
3642             $e .= $1;
3643             }
3644 183 100       651  
  186 100       10669  
    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 'Eksc5601::split' . $e; }
3647 3         14  
3648             # split scalar value
3649             elsif (/\G ( [\$\@\&\*] $qq_scalar ) /oxgc) { return 'Eksc5601::split' . $e . e_string($1); }
3650 1         6  
3651 0         0 # split literal space
3652 0         0 elsif (/\G \b qq (\#) [ ] (\#) /oxgc) { return 'Eksc5601::split' . $e . qq {qq$1 $2}; }
3653 0         0 elsif (/\G \b qq ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Eksc5601::split' . $e . qq{$1qq$2 $3}; }
3654 0         0 elsif (/\G \b qq ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Eksc5601::split' . $e . qq{$1qq$2 $3}; }
3655 0         0 elsif (/\G \b qq ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Eksc5601::split' . $e . qq{$1qq$2 $3}; }
3656 0         0 elsif (/\G \b qq ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Eksc5601::split' . $e . qq{$1qq$2 $3}; }
3657 0         0 elsif (/\G \b qq ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Eksc5601::split' . $e . qq{$1qq$2 $3}; }
3658 0         0 elsif (/\G \b q (\#) [ ] (\#) /oxgc) { return 'Eksc5601::split' . $e . qq {q$1 $2}; }
3659 0         0 elsif (/\G \b q ((?>\s*)) (\() [ ] (\)) /oxgc) { return 'Eksc5601::split' . $e . qq {$1q$2 $3}; }
3660 0         0 elsif (/\G \b q ((?>\s*)) (\{) [ ] (\}) /oxgc) { return 'Eksc5601::split' . $e . qq {$1q$2 $3}; }
3661 0         0 elsif (/\G \b q ((?>\s*)) (\[) [ ] (\]) /oxgc) { return 'Eksc5601::split' . $e . qq {$1q$2 $3}; }
3662 0         0 elsif (/\G \b q ((?>\s*)) (\<) [ ] (\>) /oxgc) { return 'Eksc5601::split' . $e . qq {$1q$2 $3}; }
3663 13         59 elsif (/\G \b q ((?>\s*)) (\S) [ ] (\2) /oxgc) { return 'Eksc5601::split' . $e . qq {$1q$2 $3}; }
3664             elsif (/\G ' [ ] ' /oxgc) { return 'Eksc5601::split' . $e . qq {' '}; }
3665             elsif (/\G " [ ] " /oxgc) { return 'Eksc5601::split' . $e . qq {" "}; }
3666              
3667 2 0       12 # 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         619  
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       119 else {
  36 50       4868  
    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         43 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         131 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         690  
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       166 else {
  48 50       5937  
    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         48 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         176 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 83         201 elsif (/\G (\/) /oxgc) {
3763 83 50       243 my $regexp = '';
  476 50       2123  
    100          
    50          
3764 0         0 while (not /\G \z/oxgc) {
3765 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
3766 83         318 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; } # splitqr// --> split qr//
3767             elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_split($e.q{ qr}, '/','/',$regexp,$1); } # / / --> qr / /
3768 393         834 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       33  
3785 11         310 # $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         22 else {
3791 11 50       34 my $e = '';
  11 50       907  
    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 4209 100       9293  
3856 4209         7696 # if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { return e_qq($ope,$1,$3,$2); } # qq# #
3857 40         49 if (/\G (\#) /oxgc) { # qq# #
3858 40 100       85 my $qq_string = '';
  1948 50       5324  
    100          
    50          
3859 80         172 while (not /\G \z/oxgc) {
3860 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
3861 40         79 elsif (/\G (\\\#) /oxgc) { $qq_string .= $1; }
3862             elsif (/\G (\#) /oxgc) { return e_qq($ope,'#','#',$qq_string); }
3863 1828         3267 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 4169         5459 else {
3869 4169 50       9424 my $e = '';
  4169 50       15105  
    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 4111         5295 elsif (/\G (\{) /oxgc) { # qq { }
3892 4111         5679 my $qq_string = '';
3893 4111 100       8039 local $nest = 1;
  172751 50       531795  
    100          
    100          
    50          
3894 708         1359 while (not /\G \z/oxgc) {
3895 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
  1384         1945  
3896             elsif (/\G (\\\}) /oxgc) { $qq_string .= $1; }
3897 1384 100       2307 elsif (/\G (\{) /oxgc) { $qq_string .= $1; $nest++; }
  5495         8669  
3898 4111         8477 elsif (/\G (\}) /oxgc) {
3899             if (--$nest == 0) { return $e . e_qq($ope,'{','}',$qq_string); }
3900 1384         2610 else { $qq_string .= $1; }
3901             }
3902 165164         320856 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         278 elsif (/\G (\<) /oxgc) { # qq < >
3926 38         67 my $qq_string = '';
3927 38 100       154 local $nest = 1;
  1418 50       5196  
    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         113  
3932 38         103 elsif (/\G (\>) /oxgc) {
3933             if (--$nest == 0) { return $e . e_qq($ope,'<','>',$qq_string); }
3934 0         0 else { $qq_string .= $1; }
3935             }
3936 1358         2804 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         31 elsif (/\G (\S) /oxgc) { # qq * *
3943 20         27 my $delimiter = $1;
3944 20 50       34 my $qq_string = '';
  840 50       2267  
    100          
    50          
3945 0         0 while (not /\G \z/oxgc) {
3946 0         0 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
3947 20         38 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         1500 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       130 elsif (/\G \b (qr) \b /oxgc) {
3960 60         469 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       141 my $e = '';
  60 50       3818  
    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         44 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         130 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       91 elsif (/\G \b (qw) \b /oxgc) {
3982 34         103 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       102 my $e = '';
  34 50       220  
    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         118  
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       5 elsif (/\G \b (qx) \b /oxgc) {
4012 2         34 my $ope = $1;
4013             if (/\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
4014             return e_qq($ope,$1,$3,$2);
4015 0         0 }
4016 2         3 else {
4017 2 50       6 my $e = '';
  2 50       124  
    50          
    0          
    0          
    0          
    0          
4018 0         0 while (not /\G \z/oxgc) {
4019 0         0 if (/\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
4020 2         7 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       1569 # (and so on)
4039 550         1561  
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         960 else {
4052 550 50       1717 my $e = '';
  550 50       3110  
    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         1180 elsif (/\G (\{) /oxgc) { # q { }
4076 544         955 my $q_string = '';
4077 544 50       1615 local $nest = 1;
  8129 50       34605  
    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         204  
4081             elsif (/\G (\\\{) /oxgc) { $q_string .= $1; }
4082 114 100       218 elsif (/\G (\{) /oxgc) { $q_string .= $1; $nest++; }
  658         1467  
4083 544         1670 elsif (/\G (\}) /oxgc) {
4084             if (--$nest == 0) { return $e . e_q($ope,'{','}',$q_string); }
4085 114         247 else { $q_string .= $1; }
4086             }
4087 7357         15024 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         11 elsif (/\G (\<) /oxgc) { # q < >
4112 5         10 my $q_string = '';
4113 5 50       25 local $nest = 1;
  82 50       410  
    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         13  
4119 5         16 elsif (/\G (\>) /oxgc) {
4120             if (--$nest == 0) { return $e . e_q($ope,'<','>',$q_string); }
4121 0         0 else { $q_string .= $1; }
4122             }
4123 77         154 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         3 my $delimiter = $1;
4131 1 50       3 my $q_string = '';
  14 50       70  
    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         25 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       1215 elsif (/\G \b (m) \b /oxgc) {
4147 305         2452 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         488 else {
4152 305 50       838 my $e = '';
  305 50       19955  
    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         153 elsif (/\G (\<) ((?:$qq_angle)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr ($ope,$1, $3, $2,$4); } # m < >
4159 25         79 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         898 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       420  
4178 156         4190 # $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         7 }
4182 155         326 else {
4183 155 50       514 my $e = '';
  155 50       27976  
    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         107 # $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         14 # $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         819 }
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]* [^\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         555 # 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]* [^\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         45 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     31 }
      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         16 # 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]* [^\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]* [^\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         9 # ''
4318 1850         3696 elsif (/\G (?
4319 1850 100       4645 my $q_string = '';
  11196 100       36830  
    100          
    50          
4320 4         12 while (not /\G \z/oxgc) {
4321 48         89 if (/\G (\\\\) /oxgc) { $q_string .= $1; }
4322 1850         4080 elsif (/\G (\\\') /oxgc) { $q_string .= $1; }
4323             elsif (/\G \' /oxgc) { return e_q('', "'","'",$q_string); }
4324 9294         18741 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 2673         5437 elsif (/\G (\") /oxgc) {
4331 2673 100       6364 my $qq_string = '';
  51285 100       147713  
    100          
    50          
4332 109         250 while (not /\G \z/oxgc) {
4333 12         24 if (/\G (\\\\) /oxgc) { $qq_string .= $1; }
4334 2673         6135 elsif (/\G (\\\") /oxgc) { $qq_string .= $1; }
4335             elsif (/\G \" /oxgc) { return e_qq('', '"','"',$qq_string); }
4336 48491         93441 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         2 elsif (/\G (\`) /oxgc) {
4343 1 50       3 my $qx_string = '';
  19 50       74  
    100          
    50          
4344 0         0 while (not /\G \z/oxgc) {
4345 0         0 if (/\G (\\\\) /oxgc) { $qx_string .= $1; }
4346 1         3 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         2345 elsif (($slash eq 'm//') and /\G (\/) /oxgc) {
4355 1070 100       4010 my $regexp = '';
  10084 50       32678  
    100          
    50          
4356 1         3 while (not /\G \z/oxgc) {
4357 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
4358 1070         2559 elsif (/\G (\\\/) /oxgc) { $regexp .= $1; }
4359             elsif (/\G \/ ([cgimosxpadlunbB]*) /oxgc) { return e_qr('', '/','/',$regexp,$1); }
4360 9013         17740 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         60 elsif (($slash eq 'm//') and /\G (\?) /oxgc) {
4367 30 50       75 my $regexp = '';
  122 50       494  
    100          
    50          
4368 0         0 while (not /\G \z/oxgc) {
4369 0         0 if (/\G (\\\\) /oxgc) { $regexp .= $1; }
4370 30         74 elsif (/\G (\\\?) /oxgc) { $regexp .= $1; }
4371             elsif (/\G \? ([cgimosxpadlunbB]*) /oxgc) { return e_qr('m','?','?',$regexp,$1); }
4372 92         213 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         13 elsif (/\G ( <<~ [\t ]* '([a-zA-Z_0-9]*)' ) /oxgc) {
4385 6         11 $slash = 'm//';
4386             my $here_quote = $1;
4387             my $delimiter = $2;
4388 6 50       10  
4389 6         14 # get here document
4390 6         31 if ($here_script eq '') {
4391             $here_script = CORE::substr $_, pos $_;
4392 6 50       29 $here_script =~ s/.*?\n//oxm;
4393 6         76 }
4394 6         14 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4395 6         8 my $heredoc = $1;
4396 6         59 my $indent = $2;
4397 6         18 $heredoc =~ s{^$indent}{}msg; # no /ox
4398             push @heredoc, $heredoc . qq{\n$delimiter\n};
4399             push @heredoc_delimiter, qq{\\s*$delimiter};
4400 6         14 }
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         26  
4417 3         8 elsif (/\G ( <<~ \\([a-zA-Z_0-9]+) ) /oxgc) {
4418 3         7 $slash = 'm//';
4419             my $here_quote = $1;
4420             my $delimiter = $2;
4421 3 50       8  
4422 3         9 # get here document
4423 3         13 if ($here_script eq '') {
4424             $here_script = CORE::substr $_, pos $_;
4425 3 50       17 $here_script =~ s/.*?\n//oxm;
4426 3         45 }
4427 3         14 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4428 3         6 my $heredoc = $1;
4429 3         37 my $indent = $2;
4430 3         14 $heredoc =~ s{^$indent}{}msg; # no /ox
4431             push @heredoc, $heredoc . qq{\n$delimiter\n};
4432             push @heredoc_delimiter, qq{\\s*$delimiter};
4433 3         9 }
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         14 elsif (/\G ( <<~ [\t ]* "([a-zA-Z_0-9]*)" ) /oxgc) {
4442 6         10 $slash = 'm//';
4443             my $here_quote = $1;
4444             my $delimiter = $2;
4445 6 50       11  
4446 6         12 # get here document
4447 6         26 if ($here_script eq '') {
4448             $here_script = CORE::substr $_, pos $_;
4449 6 50       30 $here_script =~ s/.*?\n//oxm;
4450 6         80 }
4451 6         14 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4452 6         7 my $heredoc = $1;
4453 6         45 my $indent = $2;
4454 6         16 $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         14 }
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         23 # <<~HEREDOC
4465 3         6 elsif (/\G ( <<~ ([a-zA-Z_0-9]+) ) /oxgc) {
4466 3         6 $slash = 'm//';
4467             my $here_quote = $1;
4468             my $delimiter = $2;
4469 3 50       7  
4470 3         7 # get here document
4471 3         12 if ($here_script eq '') {
4472             $here_script = CORE::substr $_, pos $_;
4473 3 50       23 $here_script =~ s/.*?\n//oxm;
4474 3         38 }
4475 3         13 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4476 3         6 my $heredoc = $1;
4477 3         36 my $indent = $2;
4478 3         12 $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         14 # <<~`HEREDOC`
4489 6         20 elsif (/\G ( <<~ [\t ]* `([a-zA-Z_0-9]*)` ) /oxgc) {
4490 6         12 $slash = 'm//';
4491             my $here_quote = $1;
4492             my $delimiter = $2;
4493 6 50       17  
4494 6         15 # get here document
4495 6         15 if ($here_script eq '') {
4496             $here_script = CORE::substr $_, pos $_;
4497 6 50       27 $here_script =~ s/.*?\n//oxm;
4498 6         65 }
4499 6         15 if ($here_script =~ s/\A (.*?) \n ([\t ]*) $delimiter \n //xms) {
4500 6         8 my $heredoc = $1;
4501 6         45 my $indent = $2;
4502 6         15 $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         12 }
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         158 elsif (/\G ( << '([a-zA-Z_0-9]*)' ) /oxgc) {
4514 80         156 $slash = 'm//';
4515             my $here_quote = $1;
4516             my $delimiter = $2;
4517 80 100       131  
4518 80         153 # get here document
4519 77         383 if ($here_script eq '') {
4520             $here_script = CORE::substr $_, pos $_;
4521 77 50       435 $here_script =~ s/.*?\n//oxm;
4522 80         627 }
4523 80         258 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4524             push @heredoc, $1 . qq{\n$delimiter\n};
4525             push @heredoc_delimiter, $delimiter;
4526 80         161 }
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         298  
4543 2         5 elsif (/\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
4544 2         5 $slash = 'm//';
4545             my $here_quote = $1;
4546             my $delimiter = $2;
4547 2 100       3  
4548 2         5 # get here document
4549 1         6 if ($here_script eq '') {
4550             $here_script = CORE::substr $_, pos $_;
4551 1 50       5 $here_script =~ s/.*?\n//oxm;
4552 2         32 }
4553 2         8 if ($here_script =~ s/\A (.*?) \n $delimiter \n //xms) {
4554             push @heredoc, $1 . qq{\n$delimiter\n};
4555             push @heredoc_delimiter, $delimiter;
4556 2         5 }
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         93 elsif (/\G ( << "([a-zA-Z_0-9]*)" ) /oxgc) {
4565 39         103 $slash = 'm//';
4566             my $here_quote = $1;
4567             my $delimiter = $2;
4568 39 100       92  
4569 39         103 # get here document
4570 38         255 if ($here_script eq '') {
4571             $here_script = CORE::substr $_, pos $_;
4572 38 50       203 $here_script =~ s/.*?\n//oxm;
4573 39         521 }
4574 39         127 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         93 }
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         154 # <
4585 54         119 elsif (/\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
4586 54         115 $slash = 'm//';
4587             my $here_quote = $1;
4588             my $delimiter = $2;
4589 54 100       100  
4590 54         132 # get here document
4591 51         304 if ($here_script eq '') {
4592             $here_script = CORE::substr $_, pos $_;
4593 51 50       357 $here_script =~ s/.*?\n//oxm;
4594 54         749 }
4595 54         182 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         132 }
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         223 # <<`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         68 #
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 < ((?:[^\xA1-\xFE>\0\a\e\f\n\r\t]|[\xA1-\xFE][\x00-\xFF])+?) > /oxgc) {
4641             return 'Eksc5601::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         2514 # 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 [\)\}\]]
  9462         18397  
4669              
4670             ) /oxgc) { $slash = 'div'; return $1; }
4671              
4672             # yada-yada or triple-dot operator
4673             elsif (/\G (
4674 9462         44947 \.\.\.
  7         14  
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         24 [,;\(\{\[]
  16318         31442  
4731              
4732             )) /oxgc) { $slash = 'm//'; return $1; }
4733 16318         71319  
  26301         50118  
4734             # other any character
4735             elsif (/\G ($q_char) /oxgc) { $slash = 'div'; return $1; }
4736              
4737 26301         115791 # system error
4738             else {
4739             die __FILE__, ": Oops, this shouldn't happen!\n";
4740             }
4741             }
4742              
4743 0     2638 0 0 # escape KSC5601 string
4744 2638         6533 sub e_string {
4745             my($string) = @_;
4746 2638         3549 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 2638         3577 # (and so on)
4753              
4754             my @char = $string =~ / \G (?>[^\xA1-\xFE\\]|\\$q_char|$q_char) /oxmsg;
4755 2638 100 66     23757  
4756 2638 50       11186 # without { ... }
4757 2588         5702 if (not (grep(/\A \{ \z/xms, @char) and grep(/\A \} \z/xms, @char))) {
4758             if ($string !~ /<
4759             return $string;
4760             }
4761             }
4762 2588         6274  
4763 50 50       143 E_STRING_LOOP:
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    50          
    100          
    50          
    50          
    50          
    50          
    50          
    100          
    100          
    50          
    50          
4764             while ($string !~ /\G \z/oxgc) {
4765             if (0) {
4766             }
4767 461         7989  
4768 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> @{[Eksc5601::PREMATCH()]}
4769 0         0 elsif ($string =~ /\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
4770             $e_string .= q{Eksc5601::PREMATCH()};
4771             $slash = 'div';
4772             }
4773              
4774 0         0 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> @{[Eksc5601::MATCH()]}
4775 0         0 elsif ($string =~ /\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
4776             $e_string .= q{Eksc5601::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} --> @{[Eksc5601::POSTMATCH()]}
4787 0         0 elsif ($string =~ /\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
4788             $e_string .= q{Eksc5601::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         10 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         14 # $ @ % & * $ #
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              
4868 0         0 # qq//
4869 0 0       0 elsif ($string =~ /\G \b (qq) \b /oxgc) {
4870 0         0 my $ope = $1;
4871             if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qq# #
4872             $e_string .= e_qq($ope,$1,$3,$2);
4873 0         0 }
4874 0         0 else {
4875 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
4876 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4877 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
4878 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq ( )
  0         0  
4879 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq { }
  0         0  
4880 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq [ ]
  0         0  
4881             elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq < >
4882 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qq * *
4883             }
4884             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4885             }
4886             }
4887              
4888 0         0 # qx//
4889 0 0       0 elsif ($string =~ /\G \b (qx) \b /oxgc) {
4890 0         0 my $ope = $1;
4891             if ($string =~ /\G (\#) ((?:$qq_char)*?) (\#) /oxgc) { # qx# #
4892             $e_string .= e_qq($ope,$1,$3,$2);
4893 0         0 }
4894 0         0 else {
4895 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
    0          
4896 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4897 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
4898 0         0 elsif ($string =~ /\G (\() ((?:$qq_paren)*?) (\)) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ( )
  0         0  
4899 0         0 elsif ($string =~ /\G (\{) ((?:$qq_brace)*?) (\}) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx { }
  0         0  
4900 0         0 elsif ($string =~ /\G (\[) ((?:$qq_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx [ ]
  0         0  
4901 0         0 elsif ($string =~ /\G (\<) ((?:$qq_angle)*?) (\>) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx < >
  0         0  
4902             elsif ($string =~ /\G (\') ((?:$qq_char)*?) (\') /oxgc) { $e_string .= $e . e_q ($ope,$1,$3,$2); next E_STRING_LOOP; } # qx ' '
4903 0         0 elsif ($string =~ /\G (\S) ((?:$qq_char)*?) (\1) /oxgc) { $e_string .= $e . e_qq($ope,$1,$3,$2); next E_STRING_LOOP; } # qx * *
4904             }
4905             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4906             }
4907             }
4908              
4909 0         0 # q//
4910 0 0       0 elsif ($string =~ /\G \b (q) \b /oxgc) {
4911 0         0 my $ope = $1;
4912             if ($string =~ /\G (\#) ((?:\\\#|\\\\|$q_char)*?) (\#) /oxgc) { # q# #
4913             $e_string .= e_q($ope,$1,$3,$2);
4914 0         0 }
4915 0         0 else {
4916 0 0       0 my $e = '';
  0 0       0  
    0          
    0          
    0          
    0          
4917 0         0 while ($string !~ /\G \z/oxgc) {
  0         0  
4918 0         0 if ($string =~ /\G ((?>\s+)|\#.*) /oxgc) { $e .= $1; }
  0         0  
4919 0         0 elsif ($string =~ /\G (\() ((?:\\\\|\\\)|\\\(|$q_paren)*?) (\)) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q ( )
  0         0  
4920 0         0 elsif ($string =~ /\G (\{) ((?:\\\\|\\\}|\\\{|$q_brace)*?) (\}) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q { }
  0         0  
4921 0         0 elsif ($string =~ /\G (\[) ((?:\\\\|\\\]|\\\[|$q_bracket)*?) (\]) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q [ ]
  0         0  
4922             elsif ($string =~ /\G (\<) ((?:\\\\|\\\>|\\\<|$q_angle)*?) (\>) /oxgc) { $e_string .= $e . e_q($ope,$1,$3,$2); next E_STRING_LOOP; } # q < >
4923 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 * *
4924             }
4925             die __FILE__, ": Can't find string terminator anywhere before EOF\n";
4926             }
4927             }
4928 0         0  
4929             # ''
4930             elsif ($string =~ /\G (?
4931 12         30  
4932             # ""
4933             elsif ($string =~ /\G (\") ((?:$qq_char)*?) (\") /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
4934 6         18  
4935             # ``
4936             elsif ($string =~ /\G (\`) ((?:$qq_char)*?) (\`) /oxgc) { $e_string .= e_qq('',$1,$3,$2); }
4937 0         0  
4938             # other any character
4939             elsif ($string =~ /\G ($q_char) /oxgc) { $e_string .= $1; }
4940              
4941 440         1036 # system error
4942             else {
4943             die __FILE__, ": Oops, this shouldn't happen!\n";
4944             }
4945 0         0 }
4946              
4947             return $e_string;
4948             }
4949              
4950             #
4951             # character class
4952 50     3071 0 170 #
4953             sub character_class {
4954 3071 100       5522 my($char,$modifier) = @_;
4955 3071 100       4870  
4956 115         239 if ($char eq '.') {
4957             if ($modifier =~ /s/) {
4958             return '${Eksc5601::dot_s}';
4959 23         60 }
4960             else {
4961             return '${Eksc5601::dot}';
4962             }
4963 92         186 }
4964             else {
4965             return Eksc5601::classic_character_class($char);
4966             }
4967             }
4968              
4969             #
4970             # escape capture ($1, $2, $3, ...)
4971             #
4972 2956     547 0 5590 sub e_capture {
4973 547         2349  
4974             return join '', '${Eksc5601::capture(', $_[0], ')}';
4975             return join '', '${', $_[0], '}';
4976             }
4977              
4978             #
4979             # escape transliteration (tr/// or y///)
4980 0     11 0 0 #
4981 11         57 sub e_tr {
4982 11   100     20 my($variable,$charclass,$e,$charclass2,$modifier) = @_;
4983             my $e_tr = '';
4984 11         31 $modifier ||= '';
4985              
4986             $slash = 'div';
4987 11         15  
4988             # quote character class 1
4989             $charclass = q_tr($charclass);
4990 11         27  
4991             # quote character class 2
4992             $charclass2 = q_tr($charclass2);
4993 11 50       23  
4994 11 0       32 # /b /B modifier
4995 0         0 if ($modifier =~ tr/bB//d) {
4996             if ($variable eq '') {
4997             $e_tr = qq{tr$charclass$e$charclass2$modifier};
4998 0         0 }
4999             else {
5000             $e_tr = qq{$variable${bind_operator}tr$charclass$e$charclass2$modifier};
5001             }
5002 0 100       0 }
5003 11         31 else {
5004             if ($variable eq '') {
5005             $e_tr = qq{Eksc5601::tr(\$_,' =~ ',$charclass,$e$charclass2,'$modifier')};
5006 2         7 }
5007             else {
5008             $e_tr = qq{Eksc5601::tr($variable,'$bind_operator',$charclass,$e$charclass2,'$modifier')};
5009             }
5010             }
5011 9         30  
5012 11         24 # clear tr/// variable
5013             $tr_variable = '';
5014 11         15 $bind_operator = '';
5015              
5016             return $e_tr;
5017             }
5018              
5019             #
5020             # quote for escape transliteration (tr/// or y///)
5021 11     22 0 68 #
5022             sub q_tr {
5023             my($charclass) = @_;
5024 22 50       32  
    0          
    0          
    0          
    0          
    0          
5025 22         48 # quote character class
5026             if ($charclass !~ /'/oxms) {
5027             return e_q('', "'", "'", $charclass); # --> q' '
5028 22         32 }
5029             elsif ($charclass !~ /\//oxms) {
5030             return e_q('q', '/', '/', $charclass); # --> q/ /
5031 0         0 }
5032             elsif ($charclass !~ /\#/oxms) {
5033             return e_q('q', '#', '#', $charclass); # --> q# #
5034 0         0 }
5035             elsif ($charclass !~ /[\<\>]/oxms) {
5036             return e_q('q', '<', '>', $charclass); # --> q< >
5037 0         0 }
5038             elsif ($charclass !~ /[\(\)]/oxms) {
5039             return e_q('q', '(', ')', $charclass); # --> q( )
5040 0         0 }
5041             elsif ($charclass !~ /[\{\}]/oxms) {
5042             return e_q('q', '{', '}', $charclass); # --> q{ }
5043 0         0 }
5044 0 0       0 else {
5045 0         0 for my $char (qw( ! " $ % & * + . : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5046             if ($charclass !~ /\Q$char\E/xms) {
5047             return e_q('q', $char, $char, $charclass);
5048             }
5049             }
5050 0         0 }
5051              
5052             return e_q('q', '{', '}', $charclass);
5053             }
5054              
5055             #
5056             # escape q string (q//, '')
5057 0     2434 0 0 #
5058             sub e_q {
5059 2434         5669 my($ope,$delimiter,$end_delimiter,$string) = @_;
5060              
5061 2434         3339 $slash = 'div';
5062              
5063             return join '', $ope, $delimiter, $string, $end_delimiter;
5064             }
5065              
5066             #
5067             # escape qq string (qq//, "", qx//, ``)
5068 2434     7018 0 12085 #
5069             sub e_qq {
5070 7018         15713 my($ope,$delimiter,$end_delimiter,$string) = @_;
5071              
5072 7018         9067 $slash = 'div';
5073 7018         8054  
5074             my $left_e = 0;
5075             my $right_e = 0;
5076 7018         7645  
5077             # split regexp
5078             my @char = $string =~ /\G((?>
5079             [^\xA1-\xFE\\\$]|[\xA1-\xFE][\x00-\xFF] |
5080             \\x\{ (?>[0-9A-Fa-f]+) \} |
5081             \\o\{ (?>[0-7]+) \} |
5082             \\N\{ (?>[^\xA1-\xFE0-9\}][^\xA1-\xFE\}]*) \} |
5083             \\ $q_char |
5084             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5085             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5086             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5087             \$ (?>\s* [0-9]+) |
5088             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5089             \$ \$ (?![\w\{]) |
5090             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5091             $q_char
5092 7018         251524 ))/oxmsg;
5093              
5094             for (my $i=0; $i <= $#char; $i++) {
5095 7018 50 66     22385  
    50 33        
    100          
    100          
    50          
5096 218174         658239 # "\L\u" --> "\u\L"
5097             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
5098             @char[$i,$i+1] = @char[$i+1,$i];
5099             }
5100              
5101 0         0 # "\U\l" --> "\l\U"
5102             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5103             @char[$i,$i+1] = @char[$i+1,$i];
5104             }
5105              
5106 0         0 # octal escape sequence
5107             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5108             $char[$i] = Eksc5601::octchr($1);
5109             }
5110              
5111 1         5 # hexadecimal escape sequence
5112             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5113             $char[$i] = Eksc5601::hexchr($1);
5114             }
5115              
5116 1         5 # \N{CHARNAME} --> N{CHARNAME}
5117             elsif ($char[$i] =~ /\A \\ ( N\{ ([^\xA1-\xFE0-9\}][^\xA1-\xFE\}]*) \} ) \z/oxms) {
5118             $char[$i] = $1;
5119 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          
5120              
5121             if (0) {
5122             }
5123              
5124             # \F
5125             #
5126             # P.69 Table 2-6. Translation escapes
5127             # in Chapter 2: Bits and Pieces
5128             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5129             # (and so on)
5130 218174         1658671  
5131 0 50       0 # \u \l \U \L \F \Q \E
5132 602         1231 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
5133             if ($right_e < $left_e) {
5134             $char[$i] = '\\' . $char[$i];
5135             }
5136             }
5137             elsif ($char[$i] eq '\u') {
5138              
5139             # "STRING @{[ LIST EXPR ]} MORE STRING"
5140              
5141             # P.257 Other Tricks You Can Do with Hard References
5142             # in Chapter 8: References
5143             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
5144              
5145             # P.353 Other Tricks You Can Do with Hard References
5146             # in Chapter 8: References
5147             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
5148              
5149 0         0 # (and so on)
5150 0         0  
5151             $char[$i] = '@{[Eksc5601::ucfirst qq<';
5152             $left_e++;
5153 0         0 }
5154 0         0 elsif ($char[$i] eq '\l') {
5155             $char[$i] = '@{[Eksc5601::lcfirst qq<';
5156             $left_e++;
5157 0         0 }
5158 0         0 elsif ($char[$i] eq '\U') {
5159             $char[$i] = '@{[Eksc5601::uc qq<';
5160             $left_e++;
5161 0         0 }
5162 6         6 elsif ($char[$i] eq '\L') {
5163             $char[$i] = '@{[Eksc5601::lc qq<';
5164             $left_e++;
5165 6         10 }
5166 9         11 elsif ($char[$i] eq '\F') {
5167             $char[$i] = '@{[Eksc5601::fc qq<';
5168             $left_e++;
5169 9         18 }
5170 0         0 elsif ($char[$i] eq '\Q') {
5171             $char[$i] = '@{[CORE::quotemeta qq<';
5172             $left_e++;
5173 0 50       0 }
5174 12         28 elsif ($char[$i] eq '\E') {
5175 12         19 if ($right_e < $left_e) {
5176             $char[$i] = '>]}';
5177             $right_e++;
5178 12         20 }
5179             else {
5180             $char[$i] = '';
5181             }
5182 0         0 }
5183 0 0       0 elsif ($char[$i] eq '\Q') {
5184 0         0 while (1) {
5185             if (++$i > $#char) {
5186 0 0       0 last;
5187 0         0 }
5188             if ($char[$i] eq '\E') {
5189             last;
5190             }
5191             }
5192             }
5193             elsif ($char[$i] eq '\E') {
5194             }
5195              
5196             # $0 --> $0
5197             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
5198             }
5199             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
5200             }
5201              
5202             # $$ --> $$
5203             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
5204             }
5205              
5206             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
5207 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
5208             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
5209             $char[$i] = e_capture($1);
5210 415         915 }
5211             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
5212             $char[$i] = e_capture($1);
5213             }
5214              
5215 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
5216             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
5217             $char[$i] = e_capture($1.'->'.$2);
5218             }
5219              
5220 0         0 # $$foo{ ... } --> $ $foo->{ ... }
5221             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
5222             $char[$i] = e_capture($1.'->'.$2);
5223             }
5224              
5225 0         0 # $$foo
5226             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
5227             $char[$i] = e_capture($1);
5228             }
5229              
5230 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eksc5601::PREMATCH()
5231             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
5232             $char[$i] = '@{[Eksc5601::PREMATCH()]}';
5233             }
5234              
5235 44         118 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eksc5601::MATCH()
5236             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
5237             $char[$i] = '@{[Eksc5601::MATCH()]}';
5238             }
5239              
5240 45         162 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eksc5601::POSTMATCH()
5241             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
5242             $char[$i] = '@{[Eksc5601::POSTMATCH()]}';
5243             }
5244              
5245             # ${ foo } --> ${ foo }
5246             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
5247             }
5248              
5249 33         88 # ${ ... }
5250             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
5251             $char[$i] = e_capture($1);
5252             }
5253             }
5254 0 100       0  
5255 7018         12825 # return string
5256             if ($left_e > $right_e) {
5257 3         18 return join '', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter;
5258             }
5259             return join '', $ope, $delimiter, @char, $end_delimiter;
5260             }
5261              
5262             #
5263             # escape qw string (qw//)
5264 7015     34 0 57092 #
5265             sub e_qw {
5266 34         238 my($ope,$delimiter,$end_delimiter,$string) = @_;
5267              
5268             $slash = 'div';
5269 34         71  
  34         325  
5270 621 50       970 # choice again delimiter
    0          
    0          
    0          
    0          
5271 34         165 my %octet = map {$_ => 1} ($string =~ /\G ([\x00-\xFF]) /oxmsg);
5272             if (not $octet{$end_delimiter}) {
5273             return join '', $ope, $delimiter, $string, $end_delimiter;
5274 34         242 }
5275             elsif (not $octet{')'}) {
5276             return join '', $ope, '(', $string, ')';
5277 0         0 }
5278             elsif (not $octet{'}'}) {
5279             return join '', $ope, '{', $string, '}';
5280 0         0 }
5281             elsif (not $octet{']'}) {
5282             return join '', $ope, '[', $string, ']';
5283 0         0 }
5284             elsif (not $octet{'>'}) {
5285             return join '', $ope, '<', $string, '>';
5286 0         0 }
5287 0 0       0 else {
5288 0         0 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5289             if (not $octet{$char}) {
5290             return join '', $ope, $char, $string, $char;
5291             }
5292             }
5293             }
5294 0         0  
5295 0         0 # qw/AAA BBB C'CC/ --> ('AAA', 'BBB', 'C\'CC')
5296 0         0 my @string = CORE::split(/\s+/, $string);
5297 0         0 for my $string (@string) {
5298 0 0       0 my @octet = $string =~ /\G ([\x00-\xFF]) /oxmsg;
5299 0         0 for my $octet (@octet) {
5300             if ($octet =~ /\A (['\\]) \z/oxms) {
5301             $octet = '\\' . $1;
5302 0         0 }
5303             }
5304 0         0 $string = join '', @octet;
  0         0  
5305             }
5306             return join '', '(', (join ', ', map { "'$_'" } @string), ')';
5307             }
5308              
5309             #
5310             # escape here document (<<"HEREDOC", <
5311 0     108 0 0 #
5312             sub e_heredoc {
5313 108         303 my($string) = @_;
5314              
5315 108         192 $slash = 'm//';
5316              
5317 108         458 my $metachar = qr/[\@\\|]/oxms; # '|' is for <<`HEREDOC`
5318 108         587  
5319             my $left_e = 0;
5320             my $right_e = 0;
5321 108         172  
5322             # split regexp
5323             my @char = $string =~ /\G((?>
5324             [^\xA1-\xFE\\\$]|[\xA1-\xFE][\x00-\xFF] |
5325             \\x\{ (?>[0-9A-Fa-f]+) \} |
5326             \\o\{ (?>[0-7]+) \} |
5327             \\N\{ (?>[^\xA1-\xFE0-9\}][^\xA1-\xFE\}]*) \} |
5328             \\ $q_char |
5329             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5330             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5331             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5332             \$ (?>\s* [0-9]+) |
5333             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5334             \$ \$ (?![\w\{]) |
5335             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5336             $q_char
5337 108         10435 ))/oxmsg;
5338              
5339             for (my $i=0; $i <= $#char; $i++) {
5340 108 50 66     490  
    50 33        
    100          
    100          
    50          
5341 3333         10215 # "\L\u" --> "\u\L"
5342             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
5343             @char[$i,$i+1] = @char[$i+1,$i];
5344             }
5345              
5346 0         0 # "\U\l" --> "\l\U"
5347             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5348             @char[$i,$i+1] = @char[$i+1,$i];
5349             }
5350              
5351 0         0 # octal escape sequence
5352             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5353             $char[$i] = Eksc5601::octchr($1);
5354             }
5355              
5356 1         3 # hexadecimal escape sequence
5357             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5358             $char[$i] = Eksc5601::hexchr($1);
5359             }
5360              
5361 1         4 # \N{CHARNAME} --> N{CHARNAME}
5362             elsif ($char[$i] =~ /\A \\ ( N\{ ([^\xA1-\xFE0-9\}][^\xA1-\xFE\}]*) \} ) \z/oxms) {
5363             $char[$i] = $1;
5364 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          
5365              
5366             if (0) {
5367             }
5368 3333         27106  
5369 0 50       0 # \u \l \U \L \F \Q \E
5370 71         128 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
5371             if ($right_e < $left_e) {
5372             $char[$i] = '\\' . $char[$i];
5373             }
5374 0         0 }
5375 0         0 elsif ($char[$i] eq '\u') {
5376             $char[$i] = '@{[Eksc5601::ucfirst qq<';
5377             $left_e++;
5378 0         0 }
5379 0         0 elsif ($char[$i] eq '\l') {
5380             $char[$i] = '@{[Eksc5601::lcfirst qq<';
5381             $left_e++;
5382 0         0 }
5383 0         0 elsif ($char[$i] eq '\U') {
5384             $char[$i] = '@{[Eksc5601::uc qq<';
5385             $left_e++;
5386 0         0 }
5387 6         9 elsif ($char[$i] eq '\L') {
5388             $char[$i] = '@{[Eksc5601::lc qq<';
5389             $left_e++;
5390 6         10 }
5391 0         0 elsif ($char[$i] eq '\F') {
5392             $char[$i] = '@{[Eksc5601::fc qq<';
5393             $left_e++;
5394 0         0 }
5395 0         0 elsif ($char[$i] eq '\Q') {
5396             $char[$i] = '@{[CORE::quotemeta qq<';
5397             $left_e++;
5398 0 50       0 }
5399 3         5 elsif ($char[$i] eq '\E') {
5400 3         6 if ($right_e < $left_e) {
5401             $char[$i] = '>]}';
5402             $right_e++;
5403 3         5 }
5404             else {
5405             $char[$i] = '';
5406             }
5407 0         0 }
5408 0 0       0 elsif ($char[$i] eq '\Q') {
5409 0         0 while (1) {
5410             if (++$i > $#char) {
5411 0 0       0 last;
5412 0         0 }
5413             if ($char[$i] eq '\E') {
5414             last;
5415             }
5416             }
5417             }
5418             elsif ($char[$i] eq '\E') {
5419             }
5420              
5421             # $0 --> $0
5422             elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
5423             }
5424             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
5425             }
5426              
5427             # $$ --> $$
5428             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
5429             }
5430              
5431             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
5432 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
5433             elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
5434             $char[$i] = e_capture($1);
5435 0         0 }
5436             elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
5437             $char[$i] = e_capture($1);
5438             }
5439              
5440 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
5441             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:$qq_bracket)*? \] ) \z/oxms) {
5442             $char[$i] = e_capture($1.'->'.$2);
5443             }
5444              
5445 0         0 # $$foo{ ... } --> $ $foo->{ ... }
5446             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:$qq_brace)*? \} ) \z/oxms) {
5447             $char[$i] = e_capture($1.'->'.$2);
5448             }
5449              
5450 0         0 # $$foo
5451             elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
5452             $char[$i] = e_capture($1);
5453             }
5454              
5455 0         0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eksc5601::PREMATCH()
5456             elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
5457             $char[$i] = '@{[Eksc5601::PREMATCH()]}';
5458             }
5459              
5460 8         64 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eksc5601::MATCH()
5461             elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
5462             $char[$i] = '@{[Eksc5601::MATCH()]}';
5463             }
5464              
5465 8         45 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eksc5601::POSTMATCH()
5466             elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
5467             $char[$i] = '@{[Eksc5601::POSTMATCH()]}';
5468             }
5469              
5470             # ${ foo } --> ${ foo }
5471             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
5472             }
5473              
5474 6         40 # ${ ... }
5475             elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
5476             $char[$i] = e_capture($1);
5477             }
5478             }
5479 0 100       0  
5480 108         231 # return string
5481             if ($left_e > $right_e) {
5482 3         21 return join '', @char, '>]}' x ($left_e - $right_e);
5483             }
5484             return join '', @char;
5485             }
5486              
5487             #
5488             # escape regexp (m//, qr//)
5489 105     1426 0 778 #
5490 1426   100     5918 sub e_qr {
5491             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
5492 1426         5274 $modifier ||= '';
5493 1426 50       2608  
5494 1426         3541 $modifier =~ tr/p//d;
5495 0         0 if ($modifier =~ /([adlu])/oxms) {
5496 0 0       0 my $line = 0;
5497 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
5498 0         0 if ($filename ne __FILE__) {
5499             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
5500             last;
5501 0         0 }
5502             }
5503             die qq{Unsupported modifier "$1" used at line $line.\n};
5504 0         0 }
5505              
5506             $slash = 'div';
5507 1426 100       2360  
    100          
5508 1426         4484 # literal null string pattern
5509 8         11 if ($string eq '') {
5510 8         8 $modifier =~ tr/bB//d;
5511             $modifier =~ tr/i//d;
5512             return join '', $ope, $delimiter, $end_delimiter, $modifier;
5513             }
5514              
5515             # /b /B modifier
5516             elsif ($modifier =~ tr/bB//d) {
5517 8 50       38  
5518 60         165 # choice again delimiter
5519 0         0 if ($delimiter =~ / [\@:] /oxms) {
  0         0  
5520 0 0       0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
    0          
    0          
    0          
5521 0         0 my %octet = map {$_ => 1} @char;
5522 0         0 if (not $octet{')'}) {
5523             $delimiter = '(';
5524             $end_delimiter = ')';
5525 0         0 }
5526 0         0 elsif (not $octet{'}'}) {
5527             $delimiter = '{';
5528             $end_delimiter = '}';
5529 0         0 }
5530 0         0 elsif (not $octet{']'}) {
5531             $delimiter = '[';
5532             $end_delimiter = ']';
5533 0         0 }
5534 0         0 elsif (not $octet{'>'}) {
5535             $delimiter = '<';
5536             $end_delimiter = '>';
5537 0         0 }
5538 0 0       0 else {
5539 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5540 0         0 if (not $octet{$char}) {
5541 0         0 $delimiter = $char;
5542             $end_delimiter = $char;
5543             last;
5544             }
5545             }
5546             }
5547 0 100 100     0 }
5548 60         330  
5549             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
5550             return join '', $ope, $delimiter, $string, $matched, $end_delimiter, $modifier;
5551 18         117 }
5552             else {
5553             return join '', $ope, $delimiter, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
5554             }
5555 42 100       269 }
5556 1358         3141  
5557             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
5558             my $metachar = qr/[\@\\|[\]{^]/oxms;
5559 1358         5010  
5560             # split regexp
5561             my @char = $string =~ /\G((?>
5562             [^\xA1-\xFE\\\$\@\[\(]|[\xA1-\xFE][\x00-\xFF] |
5563             \\x (?>[0-9A-Fa-f]{1,2}) |
5564             \\ (?>[0-7]{2,3}) |
5565             \\c [\x40-\x5F] |
5566             \\x\{ (?>[0-9A-Fa-f]+) \} |
5567             \\o\{ (?>[0-7]+) \} |
5568             \\[bBNpP]\{ (?>[^\xA1-\xFE0-9\}][^\xA1-\xFE\}]*) \} |
5569             \\ $q_char |
5570             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
5571             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
5572             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
5573             [\$\@] $qq_variable |
5574             \$ (?>\s* [0-9]+) |
5575             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
5576             \$ \$ (?![\w\{]) |
5577             \$ (?>\s*) \$ (?>\s*) $qq_variable |
5578             \[\^ |
5579             \[\: (?>[a-z]+) :\] |
5580             \[\:\^ (?>[a-z]+) :\] |
5581             \(\? |
5582             $q_char
5583             ))/oxmsg;
5584 1358 50       109612  
5585 1358         5681 # choice again delimiter
  0         0  
5586 0 0       0 if ($delimiter =~ / [\@:] /oxms) {
    0          
    0          
    0          
5587 0         0 my %octet = map {$_ => 1} @char;
5588 0         0 if (not $octet{')'}) {
5589             $delimiter = '(';
5590             $end_delimiter = ')';
5591 0         0 }
5592 0         0 elsif (not $octet{'}'}) {
5593             $delimiter = '{';
5594             $end_delimiter = '}';
5595 0         0 }
5596 0         0 elsif (not $octet{']'}) {
5597             $delimiter = '[';
5598             $end_delimiter = ']';
5599 0         0 }
5600 0         0 elsif (not $octet{'>'}) {
5601             $delimiter = '<';
5602             $end_delimiter = '>';
5603 0         0 }
5604 0 0       0 else {
5605 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5606 0         0 if (not $octet{$char}) {
5607 0         0 $delimiter = $char;
5608             $end_delimiter = $char;
5609             last;
5610             }
5611             }
5612             }
5613 0         0 }
5614 1358         1988  
5615 1358         1827 my $left_e = 0;
5616             my $right_e = 0;
5617             for (my $i=0; $i <= $#char; $i++) {
5618 1358 50 66     3447  
    50 66        
    100          
    100          
    100          
    100          
5619 3269         17672 # "\L\u" --> "\u\L"
5620             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
5621             @char[$i,$i+1] = @char[$i+1,$i];
5622             }
5623              
5624 0         0 # "\U\l" --> "\l\U"
5625             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
5626             @char[$i,$i+1] = @char[$i+1,$i];
5627             }
5628              
5629 0         0 # octal escape sequence
5630             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
5631             $char[$i] = Eksc5601::octchr($1);
5632             }
5633              
5634 1         3 # hexadecimal escape sequence
5635             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
5636             $char[$i] = Eksc5601::hexchr($1);
5637             }
5638              
5639             # \b{...} --> b\{...}
5640             # \B{...} --> B\{...}
5641             # \N{CHARNAME} --> N\{CHARNAME}
5642             # \p{PROPERTY} --> p\{PROPERTY}
5643 1         4 # \P{PROPERTY} --> P\{PROPERTY}
5644             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\xA1-\xFE0-9\}][^\xA1-\xFE\}]*) \} ) \z/oxms) {
5645             $char[$i] = $1 . '\\' . $2;
5646             }
5647              
5648 6         20 # \p, \P, \X --> p, P, X
5649             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
5650             $char[$i] = $1;
5651 4 100 100     10 }
    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          
5652              
5653             if (0) {
5654             }
5655 3269         9820  
5656 0 50 33     0 # join separated multiple-octet
    50 33        
    50 33        
      33        
      66        
      33        
5657 6         169 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
5658             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)) {
5659             $char[$i] .= join '', splice @char, $i+1, 3;
5660 0         0 }
5661             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)) {
5662             $char[$i] .= join '', splice @char, $i+1, 2;
5663 0         0 }
5664             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)) {
5665             $char[$i] .= join '', splice @char, $i+1, 1;
5666             }
5667             }
5668              
5669 0         0 # open character class [...]
5670             elsif ($char[$i] eq '[') {
5671             my $left = $i;
5672              
5673             # [] make die "Unmatched [] in regexp ...\n"
5674 586 100       801 # (and so on)
5675 586         1383  
5676             if ($char[$i+1] eq ']') {
5677             $i++;
5678 3         6 }
5679 586 50       721  
5680 2583         3659 while (1) {
5681             if (++$i > $#char) {
5682 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
5683 2583         3858 }
5684             if ($char[$i] eq ']') {
5685             my $right = $i;
5686 586 100       745  
5687 586         2896 # [...]
  90         192  
5688             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
5689             splice @char, $left, $right-$left+1, sprintf(q{@{[Eksc5601::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
5690 270         431 }
5691             else {
5692             splice @char, $left, $right-$left+1, Eksc5601::charlist_qr(@char[$left+1..$right-1], $modifier);
5693 496         1853 }
5694 586         1077  
5695             $i = $left;
5696             last;
5697             }
5698             }
5699             }
5700              
5701 586         1982 # open character class [^...]
5702             elsif ($char[$i] eq '[^') {
5703             my $left = $i;
5704              
5705             # [^] make die "Unmatched [] in regexp ...\n"
5706 328 100       426 # (and so on)
5707 328         787  
5708             if ($char[$i+1] eq ']') {
5709             $i++;
5710 5         11 }
5711 328 50       405  
5712 1447         2093 while (1) {
5713             if (++$i > $#char) {
5714 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
5715 1447         2056 }
5716             if ($char[$i] eq ']') {
5717             my $right = $i;
5718 328 100       517  
5719 328         1699 # [^...]
  90         198  
5720             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
5721             splice @char, $left, $right-$left+1, sprintf(q{@{[Eksc5601::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
5722 270         443 }
5723             else {
5724             splice @char, $left, $right-$left+1, Eksc5601::charlist_not_qr(@char[$left+1..$right-1], $modifier);
5725 238         958 }
5726 328         616  
5727             $i = $left;
5728             last;
5729             }
5730             }
5731             }
5732              
5733 328         882 # rewrite character class or escape character
5734             elsif (my $char = character_class($char[$i],$modifier)) {
5735             $char[$i] = $char;
5736             }
5737              
5738 215 50       514 # /i modifier
5739 54         112 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eksc5601::uc($char[$i]) ne Eksc5601::fc($char[$i]))) {
5740             if (CORE::length(Eksc5601::fc($char[$i])) == 1) {
5741             $char[$i] = '[' . Eksc5601::uc($char[$i]) . Eksc5601::fc($char[$i]) . ']';
5742 54         120 }
5743             else {
5744             $char[$i] = '(?:' . Eksc5601::uc($char[$i]) . '|' . Eksc5601::fc($char[$i]) . ')';
5745             }
5746             }
5747              
5748 0 50       0 # \u \l \U \L \F \Q \E
5749 1         8 elsif ($char[$i] =~ /\A [<>] \z/oxms) {
5750             if ($right_e < $left_e) {
5751             $char[$i] = '\\' . $char[$i];
5752             }
5753 0         0 }
5754 0         0 elsif ($char[$i] eq '\u') {
5755             $char[$i] = '@{[Eksc5601::ucfirst qq<';
5756             $left_e++;
5757 0         0 }
5758 0         0 elsif ($char[$i] eq '\l') {
5759             $char[$i] = '@{[Eksc5601::lcfirst qq<';
5760             $left_e++;
5761 0         0 }
5762 1         2 elsif ($char[$i] eq '\U') {
5763             $char[$i] = '@{[Eksc5601::uc qq<';
5764             $left_e++;
5765 1         3 }
5766 1         3 elsif ($char[$i] eq '\L') {
5767             $char[$i] = '@{[Eksc5601::lc qq<';
5768             $left_e++;
5769 1         3 }
5770 9         16 elsif ($char[$i] eq '\F') {
5771             $char[$i] = '@{[Eksc5601::fc qq<';
5772             $left_e++;
5773 9         20 }
5774 20         32 elsif ($char[$i] eq '\Q') {
5775             $char[$i] = '@{[CORE::quotemeta qq<';
5776             $left_e++;
5777 20 50       43 }
5778 31         66 elsif ($char[$i] eq '\E') {
5779 31         41 if ($right_e < $left_e) {
5780             $char[$i] = '>]}';
5781             $right_e++;
5782 31         77 }
5783             else {
5784             $char[$i] = '';
5785             }
5786 0         0 }
5787 0 0       0 elsif ($char[$i] eq '\Q') {
5788 0         0 while (1) {
5789             if (++$i > $#char) {
5790 0 0       0 last;
5791 0         0 }
5792             if ($char[$i] eq '\E') {
5793             last;
5794             }
5795             }
5796             }
5797             elsif ($char[$i] eq '\E') {
5798             }
5799              
5800 0 0       0 # $0 --> $0
5801 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
5802             if ($ignorecase) {
5803             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
5804             }
5805 0 0       0 }
5806 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
5807             if ($ignorecase) {
5808             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
5809             }
5810             }
5811              
5812             # $$ --> $$
5813             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
5814             }
5815              
5816             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
5817 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
5818 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
5819 0         0 $char[$i] = e_capture($1);
5820             if ($ignorecase) {
5821             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
5822             }
5823 0         0 }
5824 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
5825 0         0 $char[$i] = e_capture($1);
5826             if ($ignorecase) {
5827             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
5828             }
5829             }
5830              
5831 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
5832 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) {
5833 0         0 $char[$i] = e_capture($1.'->'.$2);
5834             if ($ignorecase) {
5835             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
5836             }
5837             }
5838              
5839 0         0 # $$foo{ ... } --> $ $foo->{ ... }
5840 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) {
5841 0         0 $char[$i] = e_capture($1.'->'.$2);
5842             if ($ignorecase) {
5843             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
5844             }
5845             }
5846              
5847 0         0 # $$foo
5848 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
5849 0         0 $char[$i] = e_capture($1);
5850             if ($ignorecase) {
5851             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
5852             }
5853             }
5854              
5855 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eksc5601::PREMATCH()
5856 8         22 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
5857             if ($ignorecase) {
5858             $char[$i] = '@{[Eksc5601::ignorecase(Eksc5601::PREMATCH())]}';
5859 0         0 }
5860             else {
5861             $char[$i] = '@{[Eksc5601::PREMATCH()]}';
5862             }
5863             }
5864              
5865 8 50       25 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eksc5601::MATCH()
5866 8         23 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
5867             if ($ignorecase) {
5868             $char[$i] = '@{[Eksc5601::ignorecase(Eksc5601::MATCH())]}';
5869 0         0 }
5870             else {
5871             $char[$i] = '@{[Eksc5601::MATCH()]}';
5872             }
5873             }
5874              
5875 8 50       21 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eksc5601::POSTMATCH()
5876 6         17 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
5877             if ($ignorecase) {
5878             $char[$i] = '@{[Eksc5601::ignorecase(Eksc5601::POSTMATCH())]}';
5879 0         0 }
5880             else {
5881             $char[$i] = '@{[Eksc5601::POSTMATCH()]}';
5882             }
5883             }
5884              
5885 6 0       17 # ${ foo }
5886 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) {
5887             if ($ignorecase) {
5888             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
5889             }
5890             }
5891              
5892 0         0 # ${ ... }
5893 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
5894 0         0 $char[$i] = e_capture($1);
5895             if ($ignorecase) {
5896             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
5897             }
5898             }
5899              
5900 0         0 # $scalar or @array
5901 29 100       78 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
5902 29         92 $char[$i] = e_string($char[$i]);
5903             if ($ignorecase) {
5904             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
5905             }
5906             }
5907              
5908 4 100 66     15 # quote character before ? + * {
    50          
5909             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
5910             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
5911 188         1533 }
5912 0 0       0 elsif (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
5913 0         0 my $char = $char[$i-1];
5914             if ($char[$i] eq '{') {
5915             die __FILE__, qq{: "MULTIBYTE{n}" should be "(MULTIBYTE){n}" in m?? (and shift \$1,\$2,\$3,...) ($char){n}\n};
5916 0         0 }
5917             else {
5918             die __FILE__, qq{: "MULTIBYTE$char[$i]" should be "(MULTIBYTE)$char[$i]" in m?? (and shift \$1,\$2,\$3,...) ($char)$char[$i]\n};
5919             }
5920 0         0 }
5921             else {
5922             $char[$i-1] = '(?:' . $char[$i-1] . ')';
5923             }
5924             }
5925             }
5926 187         772  
5927 1358 50       2506 # make regexp string
5928 1358 0 0     3367 $modifier =~ tr/i//d;
5929 0         0 if ($left_e > $right_e) {
5930             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
5931             return join '', $ope, $delimiter, $anchor, @char, '>]}' x ($left_e - $right_e), $matched, $end_delimiter, $modifier;
5932 0         0 }
5933             else {
5934             return join '', $ope, $delimiter, $anchor, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
5935 0 100 100     0 }
5936 1358         7147 }
5937             if (($ope =~ /\A m? \z/oxms) and ($delimiter eq '?')) {
5938             return join '', $ope, $delimiter, $anchor, @char, $matched, $end_delimiter, $modifier;
5939 42         344 }
5940             else {
5941             return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
5942             }
5943             }
5944              
5945             #
5946             # double quote stuff
5947 1316     540 0 11197 #
5948             sub qq_stuff {
5949             my($delimiter,$end_delimiter,$stuff) = @_;
5950 540 100       808  
5951 540         1068 # scalar variable or array variable
5952             if ($stuff =~ /\A [\$\@] /oxms) {
5953             return $stuff;
5954             }
5955 300         1006  
  240         552  
5956 280         711 # quote by delimiter
5957 240 50       592 my %octet = map {$_ => 1} ($stuff =~ /\G ([\x00-\xFF]) /oxmsg);
5958 240 50       418 for my $char (qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
5959 240 50       335 next if $char eq $delimiter;
5960 240         412 next if $char eq $end_delimiter;
5961             if (not $octet{$char}) {
5962             return join '', 'qq', $char, $stuff, $char;
5963 240         901 }
5964             }
5965             return join '', 'qq', '<', $stuff, '>';
5966             }
5967              
5968             #
5969             # escape regexp (m'', qr'', and m''b, qr''b)
5970 0     39 0 0 #
5971 39   100     163 sub e_qr_q {
5972             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
5973 39         140 $modifier ||= '';
5974 39 50       70  
5975 39         94 $modifier =~ tr/p//d;
5976 0         0 if ($modifier =~ /([adlu])/oxms) {
5977 0 0       0 my $line = 0;
5978 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
5979 0         0 if ($filename ne __FILE__) {
5980             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
5981             last;
5982 0         0 }
5983             }
5984             die qq{Unsupported modifier "$1" used at line $line.\n};
5985 0         0 }
5986              
5987             $slash = 'div';
5988 39 100       57  
    100          
5989 39         102 # literal null string pattern
5990 8         10 if ($string eq '') {
5991 8         9 $modifier =~ tr/bB//d;
5992             $modifier =~ tr/i//d;
5993             return join '', $ope, $delimiter, $end_delimiter, $modifier;
5994             }
5995              
5996 8         39 # with /b /B modifier
5997             elsif ($modifier =~ tr/bB//d) {
5998             return e_qr_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
5999             }
6000              
6001 17         45 # without /b /B modifier
6002             else {
6003             return e_qr_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
6004             }
6005             }
6006              
6007             #
6008             # escape regexp (m'', qr'')
6009 14     14 0 46 #
6010             sub e_qr_qt {
6011 14 100       50 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6012              
6013             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6014 14         42  
6015             # split regexp
6016             my @char = $string =~ /\G((?>
6017             [^\xA1-\xFE\\\[\$\@\/] |
6018             [\xA1-\xFE][\x00-\xFF] |
6019             \[\^ |
6020             \[\: (?>[a-z]+) \:\] |
6021             \[\:\^ (?>[a-z]+) \:\] |
6022             [\$\@\/] |
6023             \\ (?:$q_char) |
6024             (?:$q_char)
6025             ))/oxmsg;
6026 14         507  
6027 14 50 100     62 # unescape character
    50 100        
    50 66        
    50          
    100          
    50          
6028             for (my $i=0; $i <= $#char; $i++) {
6029             if (0) {
6030             }
6031 27         146  
6032 0         0 # open character class [...]
6033 0 0       0 elsif ($char[$i] eq '[') {
6034 0         0 my $left = $i;
6035             if ($char[$i+1] eq ']') {
6036 0         0 $i++;
6037 0 0       0 }
6038 0         0 while (1) {
6039             if (++$i > $#char) {
6040 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6041 0         0 }
6042             if ($char[$i] eq ']') {
6043             my $right = $i;
6044 0         0  
6045             # [...]
6046 0         0 splice @char, $left, $right-$left+1, Eksc5601::charlist_qr(@char[$left+1..$right-1], $modifier);
6047 0         0  
6048             $i = $left;
6049             last;
6050             }
6051             }
6052             }
6053              
6054 0         0 # open character class [^...]
6055 0 0       0 elsif ($char[$i] eq '[^') {
6056 0         0 my $left = $i;
6057             if ($char[$i+1] eq ']') {
6058 0         0 $i++;
6059 0 0       0 }
6060 0         0 while (1) {
6061             if (++$i > $#char) {
6062 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6063 0         0 }
6064             if ($char[$i] eq ']') {
6065             my $right = $i;
6066 0         0  
6067             # [^...]
6068 0         0 splice @char, $left, $right-$left+1, Eksc5601::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6069 0         0  
6070             $i = $left;
6071             last;
6072             }
6073             }
6074             }
6075              
6076 0         0 # escape $ @ / and \
6077             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6078             $char[$i] = '\\' . $char[$i];
6079             }
6080              
6081 0         0 # rewrite character class or escape character
6082             elsif (my $char = character_class($char[$i],$modifier)) {
6083             $char[$i] = $char;
6084             }
6085              
6086 0 50       0 # /i modifier
6087 4         9 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eksc5601::uc($char[$i]) ne Eksc5601::fc($char[$i]))) {
6088             if (CORE::length(Eksc5601::fc($char[$i])) == 1) {
6089             $char[$i] = '[' . Eksc5601::uc($char[$i]) . Eksc5601::fc($char[$i]) . ']';
6090 4         10 }
6091             else {
6092             $char[$i] = '(?:' . Eksc5601::uc($char[$i]) . '|' . Eksc5601::fc($char[$i]) . ')';
6093             }
6094             }
6095              
6096 0 0       0 # quote character before ? + * {
6097             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6098             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
6099 0         0 }
6100             else {
6101             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6102             }
6103             }
6104 0         0 }
6105 14         30  
6106             $delimiter = '/';
6107 14         21 $end_delimiter = '/';
6108 14         24  
6109             $modifier =~ tr/i//d;
6110             return join '', $ope, $delimiter, $anchor, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6111             }
6112              
6113             #
6114             # escape regexp (m''b, qr''b)
6115 14     17 0 142 #
6116             sub e_qr_qb {
6117             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6118 17         43  
6119             # split regexp
6120             my @char = $string =~ /\G ((?>[^\\]|\\\\|[\x00-\xFF])) /oxmsg;
6121 17         73  
6122 17 50       67 # unescape character
    50          
6123             for (my $i=0; $i <= $#char; $i++) {
6124             if (0) {
6125             }
6126 51         162  
6127             # remain \\
6128             elsif ($char[$i] eq '\\\\') {
6129             }
6130              
6131 0         0 # escape $ @ / and \
6132             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6133             $char[$i] = '\\' . $char[$i];
6134             }
6135 0         0 }
6136 17         28  
6137 17         26 $delimiter = '/';
6138             $end_delimiter = '/';
6139             return join '', $ope, $delimiter, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6140             }
6141              
6142             #
6143             # escape regexp (s/here//)
6144 17     122 0 101 #
6145 122   100     404 sub e_s1 {
6146             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6147 122         511 $modifier ||= '';
6148 122 50       184  
6149 122         428 $modifier =~ tr/p//d;
6150 0         0 if ($modifier =~ /([adlu])/oxms) {
6151 0 0       0 my $line = 0;
6152 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6153 0         0 if ($filename ne __FILE__) {
6154             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6155             last;
6156 0         0 }
6157             }
6158             die qq{Unsupported modifier "$1" used at line $line.\n};
6159 0         0 }
6160              
6161             $slash = 'div';
6162 122 100       276  
    100          
6163 122         504 # literal null string pattern
6164 8         9 if ($string eq '') {
6165 8         8 $modifier =~ tr/bB//d;
6166             $modifier =~ tr/i//d;
6167             return join '', $ope, $delimiter, $end_delimiter, $modifier;
6168             }
6169              
6170             # /b /B modifier
6171             elsif ($modifier =~ tr/bB//d) {
6172 8 50       48  
6173 8         20 # choice again delimiter
6174 0         0 if ($delimiter =~ / [\@:] /oxms) {
  0         0  
6175 0 0       0 my @char = $string =~ /\G ([\x00-\xFF]) /oxmsg;
    0          
    0          
    0          
6176 0         0 my %octet = map {$_ => 1} @char;
6177 0         0 if (not $octet{')'}) {
6178             $delimiter = '(';
6179             $end_delimiter = ')';
6180 0         0 }
6181 0         0 elsif (not $octet{'}'}) {
6182             $delimiter = '{';
6183             $end_delimiter = '}';
6184 0         0 }
6185 0         0 elsif (not $octet{']'}) {
6186             $delimiter = '[';
6187             $end_delimiter = ']';
6188 0         0 }
6189 0         0 elsif (not $octet{'>'}) {
6190             $delimiter = '<';
6191             $end_delimiter = '>';
6192 0         0 }
6193 0 0       0 else {
6194 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6195 0         0 if (not $octet{$char}) {
6196 0         0 $delimiter = $char;
6197             $end_delimiter = $char;
6198             last;
6199             }
6200             }
6201             }
6202 0         0 }
6203 8         11  
6204 8         10 my $prematch = '';
6205             $prematch = q{(\G[\x00-\xFF]*?)};
6206             return join '', $ope, $delimiter, $prematch, '(?:', $string, ')', $matched, $end_delimiter, $modifier;
6207 8 100       81 }
6208 106         335  
6209             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6210             my $metachar = qr/[\@\\|[\]{^]/oxms;
6211 106         496  
6212             # split regexp
6213             my @char = $string =~ /\G((?>
6214             [^\xA1-\xFE\\\$\@\[\(]|[\xA1-\xFE][\x00-\xFF] |
6215             \\ (?>[1-9][0-9]*) |
6216             \\g (?>\s*) (?>[1-9][0-9]*) |
6217             \\g (?>\s*) \{ (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
6218             \\g (?>\s*) \{ (?>\s*) - (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
6219             \\x (?>[0-9A-Fa-f]{1,2}) |
6220             \\ (?>[0-7]{2,3}) |
6221             \\c [\x40-\x5F] |
6222             \\x\{ (?>[0-9A-Fa-f]+) \} |
6223             \\o\{ (?>[0-7]+) \} |
6224             \\[bBNpP]\{ (?>[^\xA1-\xFE0-9\}][^\xA1-\xFE\}]*) \} |
6225             \\ $q_char |
6226             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
6227             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
6228             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
6229             [\$\@] $qq_variable |
6230             \$ (?>\s* [0-9]+) |
6231             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
6232             \$ \$ (?![\w\{]) |
6233             \$ (?>\s*) \$ (?>\s*) $qq_variable |
6234             \[\^ |
6235             \[\: (?>[a-z]+) :\] |
6236             \[\:\^ (?>[a-z]+) :\] |
6237             \(\? |
6238             $q_char
6239             ))/oxmsg;
6240 106 50       37145  
6241 106         1052 # choice again delimiter
  0         0  
6242 0 0       0 if ($delimiter =~ / [\@:] /oxms) {
    0          
    0          
    0          
6243 0         0 my %octet = map {$_ => 1} @char;
6244 0         0 if (not $octet{')'}) {
6245             $delimiter = '(';
6246             $end_delimiter = ')';
6247 0         0 }
6248 0         0 elsif (not $octet{'}'}) {
6249             $delimiter = '{';
6250             $end_delimiter = '}';
6251 0         0 }
6252 0         0 elsif (not $octet{']'}) {
6253             $delimiter = '[';
6254             $end_delimiter = ']';
6255 0         0 }
6256 0         0 elsif (not $octet{'>'}) {
6257             $delimiter = '<';
6258             $end_delimiter = '>';
6259 0         0 }
6260 0 0       0 else {
6261 0         0 for my $char (qw( ! " $ % & * + - . / = ? ^ ` | ~ ), "\x00".."\x1F", "\x7F", "\xFF") {
6262 0         0 if (not $octet{$char}) {
6263 0         0 $delimiter = $char;
6264             $end_delimiter = $char;
6265             last;
6266             }
6267             }
6268             }
6269             }
6270 0         0  
  106         241  
6271             # count '('
6272 436         1089 my $parens = grep { $_ eq '(' } @char;
6273 106         181  
6274 106         180 my $left_e = 0;
6275             my $right_e = 0;
6276             for (my $i=0; $i <= $#char; $i++) {
6277 106 50 33     322  
    50 33        
    100          
    100          
    50          
    50          
6278 357         2083 # "\L\u" --> "\u\L"
6279             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
6280             @char[$i,$i+1] = @char[$i+1,$i];
6281             }
6282              
6283 0         0 # "\U\l" --> "\l\U"
6284             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
6285             @char[$i,$i+1] = @char[$i+1,$i];
6286             }
6287              
6288 0         0 # octal escape sequence
6289             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
6290             $char[$i] = Eksc5601::octchr($1);
6291             }
6292              
6293 1         3 # hexadecimal escape sequence
6294             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
6295             $char[$i] = Eksc5601::hexchr($1);
6296             }
6297              
6298             # \b{...} --> b\{...}
6299             # \B{...} --> B\{...}
6300             # \N{CHARNAME} --> N\{CHARNAME}
6301             # \p{PROPERTY} --> p\{PROPERTY}
6302 1         3 # \P{PROPERTY} --> P\{PROPERTY}
6303             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\xA1-\xFE0-9\}][^\xA1-\xFE\}]*) \} ) \z/oxms) {
6304             $char[$i] = $1 . '\\' . $2;
6305             }
6306              
6307 0         0 # \p, \P, \X --> p, P, X
6308             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
6309             $char[$i] = $1;
6310 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          
6311              
6312             if (0) {
6313             }
6314 357         1298  
6315 0 0 0     0 # join separated multiple-octet
    0 0        
    0 0        
      0        
      0        
      0        
6316 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
6317             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)) {
6318             $char[$i] .= join '', splice @char, $i+1, 3;
6319 0         0 }
6320             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)) {
6321             $char[$i] .= join '', splice @char, $i+1, 2;
6322 0         0 }
6323             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)) {
6324             $char[$i] .= join '', splice @char, $i+1, 1;
6325             }
6326             }
6327              
6328 0         0 # open character class [...]
6329 20 50       29 elsif ($char[$i] eq '[') {
6330 20         60 my $left = $i;
6331             if ($char[$i+1] eq ']') {
6332 0         0 $i++;
6333 20 50       30 }
6334 79         163 while (1) {
6335             if (++$i > $#char) {
6336 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
6337 79         205 }
6338             if ($char[$i] eq ']') {
6339             my $right = $i;
6340 20 50       34  
6341 20         127 # [...]
  0         0  
6342             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6343             splice @char, $left, $right-$left+1, sprintf(q{@{[Eksc5601::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
6344 0         0 }
6345             else {
6346             splice @char, $left, $right-$left+1, Eksc5601::charlist_qr(@char[$left+1..$right-1], $modifier);
6347 20         93 }
6348 20         47  
6349             $i = $left;
6350             last;
6351             }
6352             }
6353             }
6354              
6355 20         63 # open character class [^...]
6356 0 0       0 elsif ($char[$i] eq '[^') {
6357 0         0 my $left = $i;
6358             if ($char[$i+1] eq ']') {
6359 0         0 $i++;
6360 0 0       0 }
6361 0         0 while (1) {
6362             if (++$i > $#char) {
6363 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6364 0         0 }
6365             if ($char[$i] eq ']') {
6366             my $right = $i;
6367 0 0       0  
6368 0         0 # [^...]
  0         0  
6369             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
6370             splice @char, $left, $right-$left+1, sprintf(q{@{[Eksc5601::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
6371 0         0 }
6372             else {
6373             splice @char, $left, $right-$left+1, Eksc5601::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6374 0         0 }
6375 0         0  
6376             $i = $left;
6377             last;
6378             }
6379             }
6380             }
6381              
6382 0         0 # rewrite character class or escape character
6383             elsif (my $char = character_class($char[$i],$modifier)) {
6384             $char[$i] = $char;
6385             }
6386              
6387 11 50       23 # /i modifier
6388 5         11 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eksc5601::uc($char[$i]) ne Eksc5601::fc($char[$i]))) {
6389             if (CORE::length(Eksc5601::fc($char[$i])) == 1) {
6390             $char[$i] = '[' . Eksc5601::uc($char[$i]) . Eksc5601::fc($char[$i]) . ']';
6391 5         10 }
6392             else {
6393             $char[$i] = '(?:' . Eksc5601::uc($char[$i]) . '|' . Eksc5601::fc($char[$i]) . ')';
6394             }
6395             }
6396              
6397 0 50       0 # \u \l \U \L \F \Q \E
6398 8         25 elsif ($char[$i] =~ /\A [<>] \z/oxms) {
6399             if ($right_e < $left_e) {
6400             $char[$i] = '\\' . $char[$i];
6401             }
6402 0         0 }
6403 0         0 elsif ($char[$i] eq '\u') {
6404             $char[$i] = '@{[Eksc5601::ucfirst qq<';
6405             $left_e++;
6406 0         0 }
6407 0         0 elsif ($char[$i] eq '\l') {
6408             $char[$i] = '@{[Eksc5601::lcfirst qq<';
6409             $left_e++;
6410 0         0 }
6411 0         0 elsif ($char[$i] eq '\U') {
6412             $char[$i] = '@{[Eksc5601::uc qq<';
6413             $left_e++;
6414 0         0 }
6415 0         0 elsif ($char[$i] eq '\L') {
6416             $char[$i] = '@{[Eksc5601::lc qq<';
6417             $left_e++;
6418 0         0 }
6419 0         0 elsif ($char[$i] eq '\F') {
6420             $char[$i] = '@{[Eksc5601::fc qq<';
6421             $left_e++;
6422 0         0 }
6423 5         7 elsif ($char[$i] eq '\Q') {
6424             $char[$i] = '@{[CORE::quotemeta qq<';
6425             $left_e++;
6426 5 50       10 }
6427 5         10 elsif ($char[$i] eq '\E') {
6428 5         5 if ($right_e < $left_e) {
6429             $char[$i] = '>]}';
6430             $right_e++;
6431 5         11 }
6432             else {
6433             $char[$i] = '';
6434             }
6435 0         0 }
6436 0 0       0 elsif ($char[$i] eq '\Q') {
6437 0         0 while (1) {
6438             if (++$i > $#char) {
6439 0 0       0 last;
6440 0         0 }
6441             if ($char[$i] eq '\E') {
6442             last;
6443             }
6444             }
6445             }
6446             elsif ($char[$i] eq '\E') {
6447             }
6448              
6449             # \0 --> \0
6450             elsif ($char[$i] =~ /\A \\ (?>\s*) 0 \z/oxms) {
6451             }
6452              
6453             # \g{N}, \g{-N}
6454              
6455             # P.108 Using Simple Patterns
6456             # in Chapter 7: In the World of Regular Expressions
6457             # of ISBN 978-0-596-52010-6 Learning Perl, Fifth Edition
6458              
6459             # P.221 Capturing
6460             # in Chapter 5: Pattern Matching
6461             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
6462              
6463             # \g{-1}, \g{-2}, \g{-3} --> \g{-1}, \g{-2}, \g{-3}
6464             elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) - (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6465             }
6466              
6467 0 0       0 # \g{1}, \g{2}, \g{3} --> \g{2}, \g{3}, \g{4} (only when multibyte anchoring is enable)
6468 0         0 elsif ($char[$i] =~ /\A \\g (?>\s*) \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6469             if ($1 <= $parens) {
6470             $char[$i] = '\\g{' . ($1 + 1) . '}';
6471             }
6472             }
6473              
6474 0 0       0 # \g1, \g2, \g3 --> \g2, \g3, \g4 (only when multibyte anchoring is enable)
6475 0         0 elsif ($char[$i] =~ /\A \\g (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
6476             if ($1 <= $parens) {
6477             $char[$i] = '\\g' . ($1 + 1);
6478             }
6479             }
6480              
6481 0 0       0 # \1, \2, \3 --> \2, \3, \4 (only when multibyte anchoring is enable)
6482 0         0 elsif ($char[$i] =~ /\A \\ (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
6483             if ($1 <= $parens) {
6484             $char[$i] = '\\' . ($1 + 1);
6485             }
6486             }
6487              
6488 0 0       0 # $0 --> $0
6489 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
6490             if ($ignorecase) {
6491             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
6492             }
6493 0 0       0 }
6494 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
6495             if ($ignorecase) {
6496             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
6497             }
6498             }
6499              
6500             # $$ --> $$
6501             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
6502             }
6503              
6504             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
6505 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
6506 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
6507 0         0 $char[$i] = e_capture($1);
6508             if ($ignorecase) {
6509             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
6510             }
6511 0         0 }
6512 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
6513 0         0 $char[$i] = e_capture($1);
6514             if ($ignorecase) {
6515             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
6516             }
6517             }
6518              
6519 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
6520 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) {
6521 0         0 $char[$i] = e_capture($1.'->'.$2);
6522             if ($ignorecase) {
6523             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
6524             }
6525             }
6526              
6527 0         0 # $$foo{ ... } --> $ $foo->{ ... }
6528 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) {
6529 0         0 $char[$i] = e_capture($1.'->'.$2);
6530             if ($ignorecase) {
6531             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
6532             }
6533             }
6534              
6535 0         0 # $$foo
6536 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
6537 0         0 $char[$i] = e_capture($1);
6538             if ($ignorecase) {
6539             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
6540             }
6541             }
6542              
6543 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eksc5601::PREMATCH()
6544 4         17 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
6545             if ($ignorecase) {
6546             $char[$i] = '@{[Eksc5601::ignorecase(Eksc5601::PREMATCH())]}';
6547 0         0 }
6548             else {
6549             $char[$i] = '@{[Eksc5601::PREMATCH()]}';
6550             }
6551             }
6552              
6553 4 50       15 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eksc5601::MATCH()
6554 4         16 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
6555             if ($ignorecase) {
6556             $char[$i] = '@{[Eksc5601::ignorecase(Eksc5601::MATCH())]}';
6557 0         0 }
6558             else {
6559             $char[$i] = '@{[Eksc5601::MATCH()]}';
6560             }
6561             }
6562              
6563 4 50       24 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eksc5601::POSTMATCH()
6564 3         11 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
6565             if ($ignorecase) {
6566             $char[$i] = '@{[Eksc5601::ignorecase(Eksc5601::POSTMATCH())]}';
6567 0         0 }
6568             else {
6569             $char[$i] = '@{[Eksc5601::POSTMATCH()]}';
6570             }
6571             }
6572              
6573 3 0       10 # ${ foo }
6574 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) {
6575             if ($ignorecase) {
6576             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
6577             }
6578             }
6579              
6580 0         0 # ${ ... }
6581 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
6582 0         0 $char[$i] = e_capture($1);
6583             if ($ignorecase) {
6584             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
6585             }
6586             }
6587              
6588 0         0 # $scalar or @array
6589 9 50       29 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
6590 9         40 $char[$i] = e_string($char[$i]);
6591             if ($ignorecase) {
6592             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
6593             }
6594             }
6595              
6596 0 50       0 # quote character before ? + * {
6597             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6598             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
6599 23         116 }
6600             else {
6601             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6602             }
6603             }
6604             }
6605 23         117  
6606 106         238 # make regexp string
6607 106         308 my $prematch = '';
6608 106 50       186 $prematch = "($anchor)";
6609 106         283 $modifier =~ tr/i//d;
6610             if ($left_e > $right_e) {
6611 0         0 return join '', $ope, $delimiter, $prematch, '(?:', @char, '>]}' x ($left_e - $right_e), ')', $matched, $end_delimiter, $modifier;
6612             }
6613             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6614             }
6615              
6616             #
6617             # escape regexp (s'here'' or s'here''b)
6618 106     34 0 1829 #
6619 34   100     76 sub e_s1_q {
6620             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6621 34         132 $modifier ||= '';
6622 34 50       49  
6623 34         81 $modifier =~ tr/p//d;
6624 0         0 if ($modifier =~ /([adlu])/oxms) {
6625 0 0       0 my $line = 0;
6626 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6627 0         0 if ($filename ne __FILE__) {
6628             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6629             last;
6630 0         0 }
6631             }
6632             die qq{Unsupported modifier "$1" used at line $line.\n};
6633 0         0 }
6634              
6635             $slash = 'div';
6636 34 100       63  
    100          
6637 34         84 # literal null string pattern
6638 8         10 if ($string eq '') {
6639 8         11 $modifier =~ tr/bB//d;
6640             $modifier =~ tr/i//d;
6641             return join '', $ope, $delimiter, $end_delimiter, $modifier;
6642             }
6643              
6644 8         134 # with /b /B modifier
6645             elsif ($modifier =~ tr/bB//d) {
6646             return e_s1_qb($ope,$delimiter,$end_delimiter,$string,$modifier);
6647             }
6648              
6649 8         19 # without /b /B modifier
6650             else {
6651             return e_s1_qt($ope,$delimiter,$end_delimiter,$string,$modifier);
6652             }
6653             }
6654              
6655             #
6656             # escape regexp (s'here'')
6657 18     18 0 57 #
6658             sub e_s1_qt {
6659 18 100       49 my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6660              
6661             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
6662 18         42  
6663             # split regexp
6664             my @char = $string =~ /\G((?>
6665             [^\xA1-\xFE\\\[\$\@\/] |
6666             [\xA1-\xFE][\x00-\xFF] |
6667             \[\^ |
6668             \[\: (?>[a-z]+) \:\] |
6669             \[\:\^ (?>[a-z]+) \:\] |
6670             [\$\@\/] |
6671             \\ (?:$q_char) |
6672             (?:$q_char)
6673             ))/oxmsg;
6674 18         408  
6675 18 50 100     68 # unescape character
    50 100        
    50 66        
    100          
    100          
    50          
6676             for (my $i=0; $i <= $#char; $i++) {
6677             if (0) {
6678             }
6679 36         183  
6680 0         0 # open character class [...]
6681 0 0       0 elsif ($char[$i] eq '[') {
6682 0         0 my $left = $i;
6683             if ($char[$i+1] eq ']') {
6684 0         0 $i++;
6685 0 0       0 }
6686 0         0 while (1) {
6687             if (++$i > $#char) {
6688 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6689 0         0 }
6690             if ($char[$i] eq ']') {
6691             my $right = $i;
6692 0         0  
6693             # [...]
6694 0         0 splice @char, $left, $right-$left+1, Eksc5601::charlist_qr(@char[$left+1..$right-1], $modifier);
6695 0         0  
6696             $i = $left;
6697             last;
6698             }
6699             }
6700             }
6701              
6702 0         0 # open character class [^...]
6703 0 0       0 elsif ($char[$i] eq '[^') {
6704 0         0 my $left = $i;
6705             if ($char[$i+1] eq ']') {
6706 0         0 $i++;
6707 0 0       0 }
6708 0         0 while (1) {
6709             if (++$i > $#char) {
6710 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
6711 0         0 }
6712             if ($char[$i] eq ']') {
6713             my $right = $i;
6714 0         0  
6715             # [^...]
6716 0         0 splice @char, $left, $right-$left+1, Eksc5601::charlist_not_qr(@char[$left+1..$right-1], $modifier);
6717 0         0  
6718             $i = $left;
6719             last;
6720             }
6721             }
6722             }
6723              
6724 0         0 # escape $ @ / and \
6725             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6726             $char[$i] = '\\' . $char[$i];
6727             }
6728              
6729 0         0 # rewrite character class or escape character
6730             elsif (my $char = character_class($char[$i],$modifier)) {
6731             $char[$i] = $char;
6732             }
6733              
6734 6 50       12 # /i modifier
6735 2         4 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eksc5601::uc($char[$i]) ne Eksc5601::fc($char[$i]))) {
6736             if (CORE::length(Eksc5601::fc($char[$i])) == 1) {
6737             $char[$i] = '[' . Eksc5601::uc($char[$i]) . Eksc5601::fc($char[$i]) . ']';
6738 2         21 }
6739             else {
6740             $char[$i] = '(?:' . Eksc5601::uc($char[$i]) . '|' . Eksc5601::fc($char[$i]) . ')';
6741             }
6742             }
6743              
6744 0 0       0 # quote character before ? + * {
6745             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
6746             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
6747 0         0 }
6748             else {
6749             $char[$i-1] = '(?:' . $char[$i-1] . ')';
6750             }
6751             }
6752 0         0 }
6753 18         38  
6754 18         26 $modifier =~ tr/i//d;
6755 18         23 $delimiter = '/';
6756 18         25 $end_delimiter = '/';
6757 18         44 my $prematch = '';
6758             $prematch = "($anchor)";
6759             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6760             }
6761              
6762             #
6763             # escape regexp (s'here''b)
6764 18     8 0 139 #
6765             sub e_s1_qb {
6766             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
6767 8         28  
6768             # split regexp
6769             my @char = $string =~ /\G (?>[^\\]|\\\\|[\x00-\xFF]) /oxmsg;
6770 8         38  
6771 8 50       24 # unescape character
    50          
6772             for (my $i=0; $i <= $#char; $i++) {
6773             if (0) {
6774             }
6775 24         77  
6776             # remain \\
6777             elsif ($char[$i] eq '\\\\') {
6778             }
6779              
6780 0         0 # escape $ @ / and \
6781             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6782             $char[$i] = '\\' . $char[$i];
6783             }
6784 0         0 }
6785 8         13  
6786 8         10 $delimiter = '/';
6787 8         10 $end_delimiter = '/';
6788 8         10 my $prematch = '';
6789             $prematch = q{(\G[\x00-\xFF]*?)};
6790             return join '', $ope, $delimiter, $prematch, '(?:', @char, ')', $matched, $end_delimiter, $modifier;
6791             }
6792              
6793             #
6794             # escape regexp (s''here')
6795 8     29 0 78 #
6796             sub e_s2_q {
6797 29         62 my($ope,$delimiter,$end_delimiter,$string) = @_;
6798              
6799 29         42 $slash = 'div';
6800 29         224  
6801 29 100       118 my @char = $string =~ / \G (?>[^\xA1-\xFE\\]|\\\\|$q_char) /oxmsg;
    100          
6802             for (my $i=0; $i <= $#char; $i++) {
6803             if (0) {
6804             }
6805 9         33  
6806             # not escape \\
6807             elsif ($char[$i] =~ /\A \\\\ \z/oxms) {
6808             }
6809              
6810 0         0 # escape $ @ / and \
6811             elsif ($char[$i] =~ /\A [\$\@\/\\] \z/oxms) {
6812             $char[$i] = '\\' . $char[$i];
6813             }
6814 5         14 }
6815              
6816             return join '', $ope, $delimiter, @char, $end_delimiter;
6817             }
6818              
6819             #
6820             # escape regexp (s/here/and here/modifier)
6821 29     156 0 134 #
6822 156   100     1229 sub e_sub {
6823             my($variable,$delimiter1,$pattern,$end_delimiter1,$delimiter2,$replacement,$end_delimiter2,$modifier) = @_;
6824 156         653 $modifier ||= '';
6825 156 50       355  
6826 156         455 $modifier =~ tr/p//d;
6827 0         0 if ($modifier =~ /([adlu])/oxms) {
6828 0 0       0 my $line = 0;
6829 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
6830 0         0 if ($filename ne __FILE__) {
6831             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
6832             last;
6833 0         0 }
6834             }
6835             die qq{Unsupported modifier "$1" used at line $line.\n};
6836 0 100       0 }
6837 156         729  
6838 37         48 if ($variable eq '') {
6839             $variable = '$_';
6840             $bind_operator = ' =~ ';
6841 37         53 }
6842              
6843             $slash = 'div';
6844              
6845             # P.128 Start of match (or end of previous match): \G
6846             # P.130 Advanced Use of \G with Perl
6847             # in Chapter 3: Overview of Regular Expression Features and Flavors
6848             # P.312 Iterative Matching: Scalar Context, with /g
6849             # in Chapter 7: Perl
6850             # of ISBN 0-596-00289-0 Mastering Regular Expressions, Second edition
6851              
6852             # P.181 Where You Left Off: The \G Assertion
6853             # in Chapter 5: Pattern Matching
6854             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
6855              
6856             # P.220 Where You Left Off: The \G Assertion
6857             # in Chapter 5: Pattern Matching
6858 156         270 # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
6859 156         255  
6860             my $e_modifier = $modifier =~ tr/e//d;
6861 156         237 my $r_modifier = $modifier =~ tr/r//d;
6862 156 50       239  
6863 156         400 my $my = '';
6864 0         0 if ($variable =~ s/\A \( (?>\s*) ( (?>(?: local \b | my \b | our \b | state \b )?) .+ ) \) \z/$1/oxms) {
6865 0         0 $my = $variable;
6866             $variable =~ s/ (?: local \b | my \b | our \b | state \b ) (?>\s*) //oxms;
6867             $variable =~ s/ = .+ \z//oxms;
6868 0         0 }
6869 156         407  
6870             (my $variable_basename = $variable) =~ s/ [\[\{].* \z//oxms;
6871             $variable_basename =~ s/ \s+ \z//oxms;
6872 156         292  
6873 156 100       247 # quote replacement string
6874 156         401 my $e_replacement = '';
6875 17         33 if ($e_modifier >= 1) {
6876             $e_replacement = e_qq('', '', '', $replacement);
6877             $e_modifier--;
6878 17 100       34 }
6879 139         374 else {
6880             if ($delimiter2 eq "'") {
6881             $e_replacement = e_s2_q('qq', '/', '/', $replacement);
6882 29         141 }
6883             else {
6884             $e_replacement = e_qq ('qq', $delimiter2, $end_delimiter2, $replacement);
6885             }
6886 110         338 }
6887              
6888             my $sub = '';
6889 156 100       303  
6890 156 100       413 # with /r
    50          
6891             if ($r_modifier) {
6892             if (0) {
6893             }
6894 8         19  
6895 0 50       0 # s///gr with multibyte anchoring
6896             elsif ($modifier =~ /g/oxms) {
6897             $sub = sprintf(
6898             # 1 2 3 4 5
6899             q,
6900              
6901             $variable, # 1
6902             ($delimiter1 eq "'") ? # 2
6903             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
6904             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
6905             $s_matched, # 3
6906             $e_replacement, # 4
6907             '$Eksc5601::re_r=CORE::eval $Eksc5601::re_r; ' x $e_modifier, # 5
6908             );
6909             }
6910              
6911 4 0       14 # s///gr without multibyte anchoring
6912             elsif ($modifier =~ /g/oxms) {
6913             $sub = sprintf(
6914             # 1 2 3 4 5
6915             q,
6916              
6917             $variable, # 1
6918             ($delimiter1 eq "'") ? # 2
6919             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
6920             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
6921             $s_matched, # 3
6922             $e_replacement, # 4
6923             '$Eksc5601::re_r=CORE::eval $Eksc5601::re_r; ' x $e_modifier, # 5
6924             );
6925             }
6926              
6927             # s///r
6928 0         0 else {
6929 4         6  
6930             my $prematch = q{$`};
6931 4 50       5 $prematch = q{${1}};
6932              
6933             $sub = sprintf(
6934             # 1 2 3 4 5 6 7
6935             q<(%s =~ %s) ? CORE::eval{%s local $^W=0; local $Eksc5601::re_r=%s; %s"%s$Eksc5601::re_r$'" } : %s>,
6936              
6937             $variable, # 1
6938             ($delimiter1 eq "'") ? # 2
6939             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
6940             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
6941             $s_matched, # 3
6942             $e_replacement, # 4
6943             '$Eksc5601::re_r=CORE::eval $Eksc5601::re_r; ' x $e_modifier, # 5
6944             $prematch, # 6
6945             $variable, # 7
6946             );
6947             }
6948 4 50       12  
6949 8         20 # $var !~ s///r doesn't make sense
6950             if ($bind_operator =~ / !~ /oxms) {
6951             $sub = q{die("$0: Using !~ with s///r doesn't make sense"), } . $sub;
6952             }
6953             }
6954              
6955 0 100       0 # without /r
    50          
6956             else {
6957             if (0) {
6958             }
6959 148         539  
6960 0 100       0 # s///g with multibyte anchoring
    100          
6961             elsif ($modifier =~ /g/oxms) {
6962             $sub = sprintf(
6963             # 1 2 3 4 5 6 7 8 9 10
6964             q,
6965              
6966             $variable, # 1
6967             ($delimiter1 eq "'") ? # 2
6968             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
6969             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
6970             $s_matched, # 3
6971             $e_replacement, # 4
6972             '$Eksc5601::re_r=CORE::eval $Eksc5601::re_r; ' x $e_modifier, # 5
6973             $variable, # 6
6974             $variable, # 7
6975             $variable, # 8
6976             $variable, # 9
6977              
6978             # Binary "!~" is just like "=~" except the return value is negated in the logical sense.
6979             # It returns false if the match succeeds, and true if it fails.
6980             # (and so on)
6981              
6982             ($bind_operator =~ / !~ /oxms) ? '!' : '', # 10
6983             );
6984             }
6985              
6986 29 0       175 # s///g without multibyte anchoring
    0          
6987             elsif ($modifier =~ /g/oxms) {
6988             $sub = sprintf(
6989             # 1 2 3 4 5 6 7 8
6990             q,
6991              
6992             $variable, # 1
6993             ($delimiter1 eq "'") ? # 2
6994             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
6995             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
6996             $s_matched, # 3
6997             $e_replacement, # 4
6998             '$Eksc5601::re_r=CORE::eval $Eksc5601::re_r; ' x $e_modifier, # 5
6999             $variable, # 6
7000             $variable, # 7
7001             ($bind_operator =~ / !~ /oxms) ? '!' : '', # 8
7002             );
7003             }
7004              
7005             # s///
7006 0         0 else {
7007 119         225  
7008             my $prematch = q{$`};
7009 119 100       202 $prematch = q{${1}};
    100          
7010              
7011             $sub = sprintf(
7012              
7013             ($bind_operator =~ / =~ /oxms) ?
7014              
7015             # 1 2 3 4 5 6 7 8
7016             q<(%s%s%s) ? CORE::eval{%s local $^W=0; local $Eksc5601::re_r=%s; %s%s="%s$Eksc5601::re_r$'"; 1 } : undef> :
7017              
7018             # 1 2 3 4 5 6 7 8
7019             q<(%s%s%s) ? 1 : CORE::eval{%s local $^W=0; local $Eksc5601::re_r=%s; %s%s="%s$Eksc5601::re_r$'"; undef }>,
7020              
7021             $variable, # 1
7022             $bind_operator, # 2
7023             ($delimiter1 eq "'") ? # 3
7024             e_s1_q('m', $delimiter1, $end_delimiter1, $pattern, $modifier) : # :
7025             e_s1 ('m', $delimiter1, $end_delimiter1, $pattern, $modifier), # :
7026             $s_matched, # 4
7027             $e_replacement, # 5
7028             '$Eksc5601::re_r=CORE::eval $Eksc5601::re_r; ' x $e_modifier, # 6
7029             $variable, # 7
7030             $prematch, # 8
7031             );
7032             }
7033             }
7034 119 50       826  
7035 156         486 # (my $foo = $bar) =~ s/// --> (my $foo = $bar, CORE::eval { ... })[1]
7036             if ($my ne '') {
7037             $sub = "($my, $sub)[1]";
7038             }
7039 0         0  
7040 156         394 # clear s/// variable
7041             $sub_variable = '';
7042 156         223 $bind_operator = '';
7043              
7044             return $sub;
7045             }
7046              
7047             #
7048             # escape regexp of split qr//
7049 156     143 0 1588 #
7050 143   100     611 sub e_split {
7051             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7052 143         597 $modifier ||= '';
7053 143 50       234  
7054 143         404 $modifier =~ tr/p//d;
7055 0         0 if ($modifier =~ /([adlu])/oxms) {
7056 0 0       0 my $line = 0;
7057 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7058 0         0 if ($filename ne __FILE__) {
7059             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7060             last;
7061 0         0 }
7062             }
7063             die qq{Unsupported modifier "$1" used at line $line.\n};
7064 0         0 }
7065              
7066             $slash = 'div';
7067 143 100       249  
7068 143         307 # /b /B modifier
7069             if ($modifier =~ tr/bB//d) {
7070             return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
7071 18 100       86 }
7072 125         302  
7073             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7074             my $metachar = qr/[\@\\|[\]{^]/oxms;
7075 125         445  
7076             # split regexp
7077             my @char = $string =~ /\G((?>
7078             [^\xA1-\xFE\\\$\@\[\(]|[\xA1-\xFE][\x00-\xFF] |
7079             \\x (?>[0-9A-Fa-f]{1,2}) |
7080             \\ (?>[0-7]{2,3}) |
7081             \\c [\x40-\x5F] |
7082             \\x\{ (?>[0-9A-Fa-f]+) \} |
7083             \\o\{ (?>[0-7]+) \} |
7084             \\[bBNpP]\{ (?>[^\xA1-\xFE0-9\}][^\xA1-\xFE\}]*) \} |
7085             \\ $q_char |
7086             \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
7087             \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
7088             \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
7089             [\$\@] $qq_variable |
7090             \$ (?>\s* [0-9]+) |
7091             \$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
7092             \$ \$ (?![\w\{]) |
7093             \$ (?>\s*) \$ (?>\s*) $qq_variable |
7094             \[\^ |
7095             \[\: (?>[a-z]+) :\] |
7096             \[\:\^ (?>[a-z]+) :\] |
7097             \(\? |
7098             $q_char
7099 125         15185 ))/oxmsg;
7100 125         494  
7101 125         175 my $left_e = 0;
7102             my $right_e = 0;
7103             for (my $i=0; $i <= $#char; $i++) {
7104 125 50 33     473  
    50 33        
    100          
    100          
    50          
    50          
7105 314         1674 # "\L\u" --> "\u\L"
7106             if (($char[$i] eq '\L') and ($char[$i+1] eq '\u')) {
7107             @char[$i,$i+1] = @char[$i+1,$i];
7108             }
7109              
7110 0         0 # "\U\l" --> "\l\U"
7111             elsif (($char[$i] eq '\U') and ($char[$i+1] eq '\l')) {
7112             @char[$i,$i+1] = @char[$i+1,$i];
7113             }
7114              
7115 0         0 # octal escape sequence
7116             elsif ($char[$i] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
7117             $char[$i] = Eksc5601::octchr($1);
7118             }
7119              
7120 1         12 # hexadecimal escape sequence
7121             elsif ($char[$i] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
7122             $char[$i] = Eksc5601::hexchr($1);
7123             }
7124              
7125             # \b{...} --> b\{...}
7126             # \B{...} --> B\{...}
7127             # \N{CHARNAME} --> N\{CHARNAME}
7128             # \p{PROPERTY} --> p\{PROPERTY}
7129 1         16 # \P{PROPERTY} --> P\{PROPERTY}
7130             elsif ($char[$i] =~ /\A \\ ([bBNpP]) ( \{ ([^\xA1-\xFE0-9\}][^\xA1-\xFE\}]*) \} ) \z/oxms) {
7131             $char[$i] = $1 . '\\' . $2;
7132             }
7133              
7134 0         0 # \p, \P, \X --> p, P, X
7135             elsif ($char[$i] =~ /\A \\ ( [pPX] ) \z/oxms) {
7136             $char[$i] = $1;
7137 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          
7138              
7139             if (0) {
7140             }
7141 314         1188  
7142 0 0 0     0 # join separated multiple-octet
    0 0        
    0 0        
      0        
      0        
      0        
7143 0         0 elsif ($char[$i] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
7144             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)) {
7145             $char[$i] .= join '', splice @char, $i+1, 3;
7146 0         0 }
7147             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)) {
7148             $char[$i] .= join '', splice @char, $i+1, 2;
7149 0         0 }
7150             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)) {
7151             $char[$i] .= join '', splice @char, $i+1, 1;
7152             }
7153             }
7154              
7155 0         0 # open character class [...]
7156 3 50       4 elsif ($char[$i] eq '[') {
7157 3         10 my $left = $i;
7158             if ($char[$i+1] eq ']') {
7159 0         0 $i++;
7160 3 50       3 }
7161 7         11 while (1) {
7162             if (++$i > $#char) {
7163 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
7164 7         13 }
7165             if ($char[$i] eq ']') {
7166             my $right = $i;
7167 3 50       5  
7168 3         15 # [...]
  0         0  
7169             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7170             splice @char, $left, $right-$left+1, sprintf(q{@{[Eksc5601::charlist_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
7171 0         0 }
7172             else {
7173             splice @char, $left, $right-$left+1, Eksc5601::charlist_qr(@char[$left+1..$right-1], $modifier);
7174 3         10 }
7175 3         6  
7176             $i = $left;
7177             last;
7178             }
7179             }
7180             }
7181              
7182 3         7 # open character class [^...]
7183 1 50       3 elsif ($char[$i] eq '[^') {
7184 1         4 my $left = $i;
7185             if ($char[$i+1] eq ']') {
7186 0         0 $i++;
7187 1 50       2 }
7188 2         4 while (1) {
7189             if (++$i > $#char) {
7190 0 100       0 die __FILE__, ": Unmatched [] in regexp\n";
7191 2         6 }
7192             if ($char[$i] eq ']') {
7193             my $right = $i;
7194 1 50       1  
7195 1         8 # [^...]
  0         0  
7196             if (grep(/\A [\$\@]/oxms,@char[$left+1..$right-1]) >= 1) {
7197             splice @char, $left, $right-$left+1, sprintf(q{@{[Eksc5601::charlist_not_qr(%s,'%s')]}}, join(',', map {qq_stuff($delimiter,$end_delimiter,$_)} @char[$left+1..$right-1]), $modifier);
7198 0         0 }
7199             else {
7200             splice @char, $left, $right-$left+1, Eksc5601::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7201 1         6 }
7202 1         7  
7203             $i = $left;
7204             last;
7205             }
7206             }
7207             }
7208              
7209 1         5 # rewrite character class or escape character
7210             elsif (my $char = character_class($char[$i],$modifier)) {
7211             $char[$i] = $char;
7212             }
7213              
7214             # P.794 29.2.161. split
7215             # in Chapter 29: Functions
7216             # of ISBN 0-596-00027-8 Programming Perl Third Edition.
7217              
7218             # P.951 split
7219             # in Chapter 27: Functions
7220             # of ISBN 978-0-596-00492-7 Programming Perl 4th Edition.
7221              
7222             # said "The //m modifier is assumed when you split on the pattern /^/",
7223             # but perl5.008 is not so. Therefore, this software adds //m.
7224             # (and so on)
7225              
7226 5         28 # split(m/^/) --> split(m/^/m)
7227             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
7228             $modifier .= 'm';
7229             }
7230              
7231 11 50       35 # /i modifier
7232 6         16 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eksc5601::uc($char[$i]) ne Eksc5601::fc($char[$i]))) {
7233             if (CORE::length(Eksc5601::fc($char[$i])) == 1) {
7234             $char[$i] = '[' . Eksc5601::uc($char[$i]) . Eksc5601::fc($char[$i]) . ']';
7235 6         15 }
7236             else {
7237             $char[$i] = '(?:' . Eksc5601::uc($char[$i]) . '|' . Eksc5601::fc($char[$i]) . ')';
7238             }
7239             }
7240              
7241 0 50       0 # \u \l \U \L \F \Q \E
7242 2         7 elsif ($char[$i] =~ /\A ([<>]) \z/oxms) {
7243             if ($right_e < $left_e) {
7244             $char[$i] = '\\' . $char[$i];
7245             }
7246 0         0 }
7247 0         0 elsif ($char[$i] eq '\u') {
7248             $char[$i] = '@{[Eksc5601::ucfirst qq<';
7249             $left_e++;
7250 0         0 }
7251 0         0 elsif ($char[$i] eq '\l') {
7252             $char[$i] = '@{[Eksc5601::lcfirst qq<';
7253             $left_e++;
7254 0         0 }
7255 0         0 elsif ($char[$i] eq '\U') {
7256             $char[$i] = '@{[Eksc5601::uc qq<';
7257             $left_e++;
7258 0         0 }
7259 0         0 elsif ($char[$i] eq '\L') {
7260             $char[$i] = '@{[Eksc5601::lc qq<';
7261             $left_e++;
7262 0         0 }
7263 0         0 elsif ($char[$i] eq '\F') {
7264             $char[$i] = '@{[Eksc5601::fc qq<';
7265             $left_e++;
7266 0         0 }
7267 0         0 elsif ($char[$i] eq '\Q') {
7268             $char[$i] = '@{[CORE::quotemeta qq<';
7269             $left_e++;
7270 0 0       0 }
7271 0         0 elsif ($char[$i] eq '\E') {
7272 0         0 if ($right_e < $left_e) {
7273             $char[$i] = '>]}';
7274             $right_e++;
7275 0         0 }
7276             else {
7277             $char[$i] = '';
7278             }
7279 0         0 }
7280 0 0       0 elsif ($char[$i] eq '\Q') {
7281 0         0 while (1) {
7282             if (++$i > $#char) {
7283 0 0       0 last;
7284 0         0 }
7285             if ($char[$i] eq '\E') {
7286             last;
7287             }
7288             }
7289             }
7290             elsif ($char[$i] eq '\E') {
7291             }
7292              
7293 0 0       0 # $0 --> $0
7294 0         0 elsif ($char[$i] =~ /\A \$ 0 \z/oxms) {
7295             if ($ignorecase) {
7296             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
7297             }
7298 0 0       0 }
7299 0         0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
7300             if ($ignorecase) {
7301             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
7302             }
7303             }
7304              
7305             # $$ --> $$
7306             elsif ($char[$i] =~ /\A \$\$ \z/oxms) {
7307             }
7308              
7309             # $1, $2, $3 --> $2, $3, $4 after s/// with multibyte anchoring
7310 0         0 # $1, $2, $3 --> $1, $2, $3 otherwise
7311 0 0       0 elsif ($char[$i] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
7312 0         0 $char[$i] = e_capture($1);
7313             if ($ignorecase) {
7314             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
7315             }
7316 0         0 }
7317 0 0       0 elsif ($char[$i] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
7318 0         0 $char[$i] = e_capture($1);
7319             if ($ignorecase) {
7320             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
7321             }
7322             }
7323              
7324 0         0 # $$foo[ ... ] --> $ $foo->[ ... ]
7325 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) {
7326 0         0 $char[$i] = e_capture($1.'->'.$2);
7327             if ($ignorecase) {
7328             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
7329             }
7330             }
7331              
7332 0         0 # $$foo{ ... } --> $ $foo->{ ... }
7333 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) {
7334 0         0 $char[$i] = e_capture($1.'->'.$2);
7335             if ($ignorecase) {
7336             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
7337             }
7338             }
7339              
7340 0         0 # $$foo
7341 0 0       0 elsif ($char[$i] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
7342 0         0 $char[$i] = e_capture($1);
7343             if ($ignorecase) {
7344             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
7345             }
7346             }
7347              
7348 0 50       0 # $`, ${`}, $PREMATCH, ${PREMATCH}, ${^PREMATCH} --> Eksc5601::PREMATCH()
7349 12         33 elsif ($char[$i] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
7350             if ($ignorecase) {
7351             $char[$i] = '@{[Eksc5601::ignorecase(Eksc5601::PREMATCH())]}';
7352 0         0 }
7353             else {
7354             $char[$i] = '@{[Eksc5601::PREMATCH()]}';
7355             }
7356             }
7357              
7358 12 50       52 # $&, ${&}, $MATCH, ${MATCH}, ${^MATCH} --> Eksc5601::MATCH()
7359 12         34 elsif ($char[$i] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
7360             if ($ignorecase) {
7361             $char[$i] = '@{[Eksc5601::ignorecase(Eksc5601::MATCH())]}';
7362 0         0 }
7363             else {
7364             $char[$i] = '@{[Eksc5601::MATCH()]}';
7365             }
7366             }
7367              
7368 12 50       57 # $POSTMATCH, ${POSTMATCH}, ${^POSTMATCH} --> Eksc5601::POSTMATCH()
7369 9         24 elsif ($char[$i] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
7370             if ($ignorecase) {
7371             $char[$i] = '@{[Eksc5601::ignorecase(Eksc5601::POSTMATCH())]}';
7372 0         0 }
7373             else {
7374             $char[$i] = '@{[Eksc5601::POSTMATCH()]}';
7375             }
7376             }
7377              
7378 9 0       37 # ${ foo }
7379 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) {
7380             if ($ignorecase) {
7381             $char[$i] = '@{[Eksc5601::ignorecase(' . $1 . ')]}';
7382             }
7383             }
7384              
7385 0         0 # ${ ... }
7386 0 0       0 elsif ($char[$i] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
7387 0         0 $char[$i] = e_capture($1);
7388             if ($ignorecase) {
7389             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
7390             }
7391             }
7392              
7393 0         0 # $scalar or @array
7394 3 50       9 elsif ($char[$i] =~ /\A [\$\@].+ /oxms) {
7395 3         14 $char[$i] = e_string($char[$i]);
7396             if ($ignorecase) {
7397             $char[$i] = '@{[Eksc5601::ignorecase(' . $char[$i] . ')]}';
7398             }
7399             }
7400              
7401 0 100       0 # quote character before ? + * {
7402             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7403             if ($char[$i-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
7404 7         41 }
7405             else {
7406             $char[$i-1] = '(?:' . $char[$i-1] . ')';
7407             }
7408             }
7409             }
7410 4         22  
7411 125 50       245 # make regexp string
7412 125         351 $modifier =~ tr/i//d;
7413             if ($left_e > $right_e) {
7414 0         0 return join '', 'Eksc5601::split', $ope, $delimiter, @char, '>]}' x ($left_e - $right_e), $end_delimiter, $modifier;
7415             }
7416             return join '', 'Eksc5601::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
7417             }
7418              
7419             #
7420             # escape regexp of split qr''
7421 125     24 0 1260 #
7422 24   100     93 sub e_split_q {
7423             my($ope,$delimiter,$end_delimiter,$string,$modifier) = @_;
7424 24         64 $modifier ||= '';
7425 24 50       42  
7426 24         51 $modifier =~ tr/p//d;
7427 0         0 if ($modifier =~ /([adlu])/oxms) {
7428 0 0       0 my $line = 0;
7429 0         0 for (my $i=0; my($package,$filename,$use_line,$subroutine) = caller($i); $i++) {
7430 0         0 if ($filename ne __FILE__) {
7431             $line = $use_line + (CORE::substr($_,0,pos($_)) =~ tr/\n//) + 1;
7432             last;
7433 0         0 }
7434             }
7435             die qq{Unsupported modifier "$1" used at line $line.\n};
7436 0         0 }
7437              
7438             $slash = 'div';
7439 24 100       30  
7440 24         48 # /b /B modifier
7441             if ($modifier =~ tr/bB//d) {
7442             return join '', 'split', $ope, $delimiter, $string, $end_delimiter, $modifier;
7443 12 100       67 }
7444              
7445             my $ignorecase = ($modifier =~ /i/oxms) ? 1 : 0;
7446 12         26  
7447             # split regexp
7448             my @char = $string =~ /\G((?>
7449             [^\xA1-\xFE\\\[] |
7450             [\xA1-\xFE][\x00-\xFF] |
7451             \[\^ |
7452             \[\: (?>[a-z]+) \:\] |
7453             \[\:\^ (?>[a-z]+) \:\] |
7454             \\ (?:$q_char) |
7455             (?:$q_char)
7456             ))/oxmsg;
7457 12         151  
7458 12 50 33     36 # unescape character
    50 100        
    50 66        
    50 33        
    100          
    50          
7459             for (my $i=0; $i <= $#char; $i++) {
7460             if (0) {
7461             }
7462 12         43  
7463 0         0 # open character class [...]
7464 0 0       0 elsif ($char[$i] eq '[') {
7465 0         0 my $left = $i;
7466             if ($char[$i+1] eq ']') {
7467 0         0 $i++;
7468 0 0       0 }
7469 0         0 while (1) {
7470             if (++$i > $#char) {
7471 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
7472 0         0 }
7473             if ($char[$i] eq ']') {
7474             my $right = $i;
7475 0         0  
7476             # [...]
7477 0         0 splice @char, $left, $right-$left+1, Eksc5601::charlist_qr(@char[$left+1..$right-1], $modifier);
7478 0         0  
7479             $i = $left;
7480             last;
7481             }
7482             }
7483             }
7484              
7485 0         0 # open character class [^...]
7486 0 0       0 elsif ($char[$i] eq '[^') {
7487 0         0 my $left = $i;
7488             if ($char[$i+1] eq ']') {
7489 0         0 $i++;
7490 0 0       0 }
7491 0         0 while (1) {
7492             if (++$i > $#char) {
7493 0 0       0 die __FILE__, ": Unmatched [] in regexp\n";
7494 0         0 }
7495             if ($char[$i] eq ']') {
7496             my $right = $i;
7497 0         0  
7498             # [^...]
7499 0         0 splice @char, $left, $right-$left+1, Eksc5601::charlist_not_qr(@char[$left+1..$right-1], $modifier);
7500 0         0  
7501             $i = $left;
7502             last;
7503             }
7504             }
7505             }
7506              
7507 0         0 # rewrite character class or escape character
7508             elsif (my $char = character_class($char[$i],$modifier)) {
7509             $char[$i] = $char;
7510             }
7511              
7512 0         0 # split(m/^/) --> split(m/^/m)
7513             elsif (($char[$i] eq '^') and ($modifier !~ /m/oxms)) {
7514             $modifier .= 'm';
7515             }
7516              
7517 0 50       0 # /i modifier
7518 4         9 elsif ($ignorecase and ($char[$i] =~ /\A [\x00-\xFF] \z/oxms) and (Eksc5601::uc($char[$i]) ne Eksc5601::fc($char[$i]))) {
7519             if (CORE::length(Eksc5601::fc($char[$i])) == 1) {
7520             $char[$i] = '[' . Eksc5601::uc($char[$i]) . Eksc5601::fc($char[$i]) . ']';
7521 4         11 }
7522             else {
7523             $char[$i] = '(?:' . Eksc5601::uc($char[$i]) . '|' . Eksc5601::fc($char[$i]) . ')';
7524             }
7525             }
7526              
7527 0 0       0 # quote character before ? + * {
7528             elsif (($i >= 1) and ($char[$i] =~ /\A [\?\+\*\{] \z/oxms)) {
7529             if ($char[$i-1] =~ /\A [\x00-\xFF] \z/oxms) {
7530 0         0 }
7531             else {
7532             $char[$i-1] = '(?:' . $char[$i-1] . ')';
7533             }
7534             }
7535 0         0 }
7536 12         21  
7537             $modifier =~ tr/i//d;
7538             return join '', 'Eksc5601::split', $ope, $delimiter, @char, $end_delimiter, $modifier;
7539             }
7540              
7541             #
7542             # instead of Carp::carp
7543 12     0 0 81 #
7544 0           sub carp {
7545             my($package,$filename,$line) = caller(1);
7546             print STDERR "@_ at $filename line $line.\n";
7547             }
7548              
7549             #
7550             # instead of Carp::croak
7551 0     0 0   #
7552 0           sub croak {
7553 0           my($package,$filename,$line) = caller(1);
7554             print STDERR "@_ at $filename line $line.\n";
7555             die "\n";
7556             }
7557              
7558             #
7559             # instead of Carp::cluck
7560 0     0 0   #
7561 0           sub cluck {
7562 0           my $i = 0;
7563 0           my @cluck = ();
7564 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
7565             push @cluck, "[$i] $filename($line) $package::$subroutine\n";
7566 0           $i++;
7567 0           }
7568 0           print STDERR CORE::reverse @cluck;
7569             print STDERR "\n";
7570             print STDERR @_;
7571             }
7572              
7573             #
7574             # instead of Carp::confess
7575 0     0 0   #
7576 0           sub confess {
7577 0           my $i = 0;
7578 0           my @confess = ();
7579 0           while (my($package,$filename,$line,$subroutine) = caller($i)) {
7580             push @confess, "[$i] $filename($line) $package::$subroutine\n";
7581 0           $i++;
7582 0           }
7583 0           print STDERR CORE::reverse @confess;
7584 0           print STDERR "\n";
7585             print STDERR @_;
7586             die "\n";
7587             }
7588              
7589             1;
7590              
7591             __END__