BEGIN {
$INC
{
'warnings.pm'
} =
''
if
$] < 5.006 }
use
warnings;
use
5.00503;
$VERSION
=
'1.22'
;
$VERSION
=
$VERSION
;
BEGIN {
if
($^X =~ / jperl /oxmsi) {
die
__FILE__,
": needs perl(not jperl) 5.00503 or later. (\$^X==$^X)\n"
;
}
if
(CORE::
ord
(
'A'
) == 193) {
die
__FILE__,
": is not US-ASCII script (may be EBCDIC or EBCDIK script).\n"
;
}
if
(CORE::
ord
(
'A'
) != 0x41) {
die
__FILE__,
": is not US-ASCII script (must be US-ASCII script).\n"
;
}
}
BEGIN {
CORE::
eval
q{
no warnings qw(redefine);
*utf8::upgrade = sub { CORE::length $_[0] }
;
*utf8::downgrade
=
sub
{ 1 };
*utf8::encode
=
sub
{ };
*utf8::decode
=
sub
{ 1 };
*utf8::is_utf8
=
sub
{ };
*utf8::valid
=
sub
{ 1 };
};
if
($@) {
*utf8::upgrade
=
sub
{ CORE::
length
$_
[0] };
*utf8::downgrade
=
sub
{ 1 };
*utf8::encode
=
sub
{ };
*utf8::decode
=
sub
{ 1 };
*utf8::is_utf8
=
sub
{ };
*utf8::valid
=
sub
{ 1 };
}
}
BEGIN {
sub
gensym () {
if
($] < 5.006) {
return
\
do
{
local
*_
};
}
else
{
return
undef
;
}
}
sub
qualify ($$) {
my
(
$name
) =
@_
;
if
(
ref
$name
) {
return
$name
;
}
elsif
(Ecyrillic::
index
(
$name
,
'::'
) >= 0) {
return
$name
;
}
elsif
(Ecyrillic::
index
(
$name
,
"'"
) >= 0) {
return
$name
;
}
elsif
(
$name
=~ /\A \^ [ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]+ \z/x) {
$name
=~ s{\A \^ ([ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_]) }{
'qq(\c'
.$1.
')'
}xee;
return
'main::'
.
$name
;
}
elsif
(
$name
=~ /\A (?: ARGV | ARGVOUT | ENV | INC | SIG | STDERR | STDIN | STDOUT ) \z/x) {
return
'main::'
.
$name
;
}
elsif
(
$name
=~ /\A [^ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz] \z/x) {
return
'main::'
.
$name
;
}
elsif
(
defined
$_
[1]) {
return
$_
[1] .
'::'
.
$name
;
}
else
{
return
(
caller
)[0] .
'::'
.
$name
;
}
}
sub
qualify_to_ref ($;$) {
if
(
defined
$_
[1]) {
no
strict
qw(refs)
;
return
\*{ qualify
$_
[0],
$_
[1] };
}
else
{
no
strict
qw(refs)
;
return
\*{ qualify
$_
[0], (
caller
)[0] };
}
}
}
sub
LOCK_SH() {1}
sub
LOCK_EX() {2}
sub
LOCK_UN() {8}
sub
LOCK_NB() {4}
sub
carp;
sub
croak;
sub
cluck;
sub
confess;
my
$your_char
=
q{[\x00-\xFF]}
;
use
vars
qw($qq_char)
;
$qq_char
=
qr/\\c[\x40-\x5F]|\\?(?:$your_char)/
oxms;
use
vars
qw($q_char)
;
$q_char
=
qr/$your_char/
oxms;
my
%range_tr
= ();
my
%lc
= ();
@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)
} =
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)
;
my
%uc
= ();
@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)
} =
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)
;
my
%fc
= ();
@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)
} =
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)
;
if
(0) {
}
elsif
(__PACKAGE__ =~ / \b Ecyrillic \z/oxms) {
%range_tr
= (
1
=> [ [0x00..0xFF],
],
);
%lc
= (
%lc
,
"\xA1"
=>
"\xF1"
,
"\xA2"
=>
"\xF2"
,
"\xA3"
=>
"\xF3"
,
"\xA4"
=>
"\xF4"
,
"\xA5"
=>
"\xF5"
,
"\xA6"
=>
"\xF6"
,
"\xA7"
=>
"\xF7"
,
"\xA8"
=>
"\xF8"
,
"\xA9"
=>
"\xF9"
,
"\xAA"
=>
"\xFA"
,
"\xAB"
=>
"\xFB"
,
"\xAC"
=>
"\xFC"
,
"\xAE"
=>
"\xFE"
,
"\xAF"
=>
"\xFF"
,
"\xB0"
=>
"\xD0"
,
"\xB1"
=>
"\xD1"
,
"\xB2"
=>
"\xD2"
,
"\xB3"
=>
"\xD3"
,
"\xB4"
=>
"\xD4"
,
"\xB5"
=>
"\xD5"
,
"\xB6"
=>
"\xD6"
,
"\xB7"
=>
"\xD7"
,
"\xB8"
=>
"\xD8"
,
"\xB9"
=>
"\xD9"
,
"\xBA"
=>
"\xDA"
,
"\xBB"
=>
"\xDB"
,
"\xBC"
=>
"\xDC"
,
"\xBD"
=>
"\xDD"
,
"\xBE"
=>
"\xDE"
,
"\xBF"
=>
"\xDF"
,
"\xC0"
=>
"\xE0"
,
"\xC1"
=>
"\xE1"
,
"\xC2"
=>
"\xE2"
,
"\xC3"
=>
"\xE3"
,
"\xC4"
=>
"\xE4"
,
"\xC5"
=>
"\xE5"
,
"\xC6"
=>
"\xE6"
,
"\xC7"
=>
"\xE7"
,
"\xC8"
=>
"\xE8"
,
"\xC9"
=>
"\xE9"
,
"\xCA"
=>
"\xEA"
,
"\xCB"
=>
"\xEB"
,
"\xCC"
=>
"\xEC"
,
"\xCD"
=>
"\xED"
,
"\xCE"
=>
"\xEE"
,
"\xCF"
=>
"\xEF"
,
);
%uc
= (
%uc
,
"\xD0"
=>
"\xB0"
,
"\xD1"
=>
"\xB1"
,
"\xD2"
=>
"\xB2"
,
"\xD3"
=>
"\xB3"
,
"\xD4"
=>
"\xB4"
,
"\xD5"
=>
"\xB5"
,
"\xD6"
=>
"\xB6"
,
"\xD7"
=>
"\xB7"
,
"\xD8"
=>
"\xB8"
,
"\xD9"
=>
"\xB9"
,
"\xDA"
=>
"\xBA"
,
"\xDB"
=>
"\xBB"
,
"\xDC"
=>
"\xBC"
,
"\xDD"
=>
"\xBD"
,
"\xDE"
=>
"\xBE"
,
"\xDF"
=>
"\xBF"
,
"\xE0"
=>
"\xC0"
,
"\xE1"
=>
"\xC1"
,
"\xE2"
=>
"\xC2"
,
"\xE3"
=>
"\xC3"
,
"\xE4"
=>
"\xC4"
,
"\xE5"
=>
"\xC5"
,
"\xE6"
=>
"\xC6"
,
"\xE7"
=>
"\xC7"
,
"\xE8"
=>
"\xC8"
,
"\xE9"
=>
"\xC9"
,
"\xEA"
=>
"\xCA"
,
"\xEB"
=>
"\xCB"
,
"\xEC"
=>
"\xCC"
,
"\xED"
=>
"\xCD"
,
"\xEE"
=>
"\xCE"
,
"\xEF"
=>
"\xCF"
,
"\xF1"
=>
"\xA1"
,
"\xF2"
=>
"\xA2"
,
"\xF3"
=>
"\xA3"
,
"\xF4"
=>
"\xA4"
,
"\xF5"
=>
"\xA5"
,
"\xF6"
=>
"\xA6"
,
"\xF7"
=>
"\xA7"
,
"\xF8"
=>
"\xA8"
,
"\xF9"
=>
"\xA9"
,
"\xFA"
=>
"\xAA"
,
"\xFB"
=>
"\xAB"
,
"\xFC"
=>
"\xAC"
,
"\xFE"
=>
"\xAE"
,
"\xFF"
=>
"\xAF"
,
);
%fc
= (
%fc
,
"\xA1"
=>
"\xF1"
,
"\xA2"
=>
"\xF2"
,
"\xA3"
=>
"\xF3"
,
"\xA4"
=>
"\xF4"
,
"\xA5"
=>
"\xF5"
,
"\xA6"
=>
"\xF6"
,
"\xA7"
=>
"\xF7"
,
"\xA8"
=>
"\xF8"
,
"\xA9"
=>
"\xF9"
,
"\xAA"
=>
"\xFA"
,
"\xAB"
=>
"\xFB"
,
"\xAC"
=>
"\xFC"
,
"\xAE"
=>
"\xFE"
,
"\xAF"
=>
"\xFF"
,
"\xB0"
=>
"\xD0"
,
"\xB1"
=>
"\xD1"
,
"\xB2"
=>
"\xD2"
,
"\xB3"
=>
"\xD3"
,
"\xB4"
=>
"\xD4"
,
"\xB5"
=>
"\xD5"
,
"\xB6"
=>
"\xD6"
,
"\xB7"
=>
"\xD7"
,
"\xB8"
=>
"\xD8"
,
"\xB9"
=>
"\xD9"
,
"\xBA"
=>
"\xDA"
,
"\xBB"
=>
"\xDB"
,
"\xBC"
=>
"\xDC"
,
"\xBD"
=>
"\xDD"
,
"\xBE"
=>
"\xDE"
,
"\xBF"
=>
"\xDF"
,
"\xC0"
=>
"\xE0"
,
"\xC1"
=>
"\xE1"
,
"\xC2"
=>
"\xE2"
,
"\xC3"
=>
"\xE3"
,
"\xC4"
=>
"\xE4"
,
"\xC5"
=>
"\xE5"
,
"\xC6"
=>
"\xE6"
,
"\xC7"
=>
"\xE7"
,
"\xC8"
=>
"\xE8"
,
"\xC9"
=>
"\xE9"
,
"\xCA"
=>
"\xEA"
,
"\xCB"
=>
"\xEB"
,
"\xCC"
=>
"\xEC"
,
"\xCD"
=>
"\xED"
,
"\xCE"
=>
"\xEE"
,
"\xCF"
=>
"\xEF"
,
);
}
else
{
croak
"Don't know my package name '@{[__PACKAGE__]}'"
;
}
sub
import
{
if
($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
my
@argv
= ();
for
(
@ARGV
) {
if
(/\A (?:
$q_char
)*? [ ] /oxms) {
if
(
my
@glob
= Ecyrillic::
glob
(
qq{"$_"}
)) {
push
@argv
,
@glob
;
}
else
{
push
@argv
,
$_
;
}
}
elsif
(/\A (?:
$q_char
)*? [*?] /oxms) {
if
(
my
@glob
= Ecyrillic::
glob
(
$_
)) {
push
@argv
,
@glob
;
}
else
{
push
@argv
,
$_
;
}
}
else
{
push
@argv
,
$_
;
}
}
@ARGV
=
@argv
;
}
*Char::ord
= \
&Cyrillic::ord
;
*Char::ord_
= \
&Cyrillic::ord_
;
*Char::reverse
= \
&Cyrillic::reverse
;
*Char::getc
= \
&Cyrillic::getc
;
*Char::length
= \
&Cyrillic::length
;
*Char::substr
= \
&Cyrillic::substr
;
*Char::index
= \
&Cyrillic::index
;
*Char::rindex
= \
&Cyrillic::rindex
;
*Char::eval
= \
&Cyrillic::eval
;
*Char::escape
= \
&Cyrillic::escape
;
*Char::escape_token
= \
&Cyrillic::escape_token
;
*Char::escape_script
= \
&Cyrillic::escape_script
;
}
sub
unimport {}
sub
Ecyrillic::
split
(;$$$);
sub
Ecyrillic::
tr
($$$$;$);
sub
Ecyrillic::
chop
(@);
sub
Ecyrillic::
index
($$;$);
sub
Ecyrillic::
rindex
($$;$);
sub
Ecyrillic::
lcfirst
(@);
sub
Ecyrillic::lcfirst_();
sub
Ecyrillic::
lc
(@);
sub
Ecyrillic::lc_();
sub
Ecyrillic::
ucfirst
(@);
sub
Ecyrillic::ucfirst_();
sub
Ecyrillic::
uc
(@);
sub
Ecyrillic::uc_();
sub
Ecyrillic::fc(@);
sub
Ecyrillic::fc_();
sub
Ecyrillic::ignorecase;
sub
Ecyrillic::classic_character_class;
sub
Ecyrillic::capture;
sub
Ecyrillic::
chr
(;$);
sub
Ecyrillic::chr_();
sub
Ecyrillic::
glob
($);
sub
Ecyrillic::glob_();
sub
Cyrillic::
ord
(;$);
sub
Cyrillic::ord_();
sub
Cyrillic::
reverse
(@);
sub
Cyrillic::
getc
(;*@);
sub
Cyrillic::
length
(;$);
sub
Cyrillic::
substr
($$;$$);
sub
Cyrillic::
index
($$;$);
sub
Cyrillic::
rindex
($$;$);
sub
Cyrillic::escape(;$);
$re_a
$re_t
$re_n
$re_r
)
;
$dot
$dot_s
$eD
$eS
$eW
$eH
$eV
$eR
$eN
$not_alnum
$not_alpha
$not_ascii
$not_blank
$not_cntrl
$not_digit
$not_graph
$not_lower
$not_lower_i
$not_print
$not_punct
$not_space
$not_upper
$not_upper_i
$not_word
$not_xdigit
$eb
$eB
)
;
${Ecyrillic::dot} =
qr{(?>[^\x0A])}
;
${Ecyrillic::dot_s} =
qr{(?>[\x00-\xFF])}
;
${Ecyrillic::eD} =
qr{(?>[^0-9])}
;
${Ecyrillic::eS} =
qr{(?>[^\s])}
;
${Ecyrillic::eW} =
qr{(?>[^0-9A-Z_a-z])}
;
${Ecyrillic::eH} =
qr{(?>[^\x09\x20])}
;
${Ecyrillic::eV} =
qr{(?>[^\x0A\x0B\x0C\x0D])}
;
${Ecyrillic::eR} =
qr{(?>\x0D\x0A|[\x0A\x0D])}
;
${Ecyrillic::eN} =
qr{(?>[^\x0A])}
;
${Ecyrillic::not_alnum} =
qr{(?>[^\x30-\x39\x41-\x5A\x61-\x7A])}
;
${Ecyrillic::not_alpha} =
qr{(?>[^\x41-\x5A\x61-\x7A])}
;
${Ecyrillic::not_ascii} =
qr{(?>[^\x00-\x7F])}
;
${Ecyrillic::not_blank} =
qr{(?>[^\x09\x20])}
;
${Ecyrillic::not_cntrl} =
qr{(?>[^\x00-\x1F\x7F])}
;
${Ecyrillic::not_digit} =
qr{(?>[^\x30-\x39])}
;
${Ecyrillic::not_graph} =
qr{(?>[^\x21-\x7F])}
;
${Ecyrillic::not_lower} =
qr{(?>[^\x61-\x7A])}
;
${Ecyrillic::not_lower_i} =
qr{(?>[^\x41-\x5A\x61-\x7A])}
;
${Ecyrillic::not_print} =
qr{(?>[^\x20-\x7F])}
;
${Ecyrillic::not_punct} =
qr{(?>[^\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E])}
;
${Ecyrillic::not_space} =
qr{(?>[^\s\x0B])}
;
${Ecyrillic::not_upper} =
qr{(?>[^\x41-\x5A])}
;
${Ecyrillic::not_upper_i} =
qr{(?>[^\x41-\x5A\x61-\x7A])}
;
${Ecyrillic::not_word} =
qr{(?>[^\x30-\x39\x41-\x5A\x5F\x61-\x7A])}
;
${Ecyrillic::not_xdigit} =
qr{(?>[^\x30-\x39\x41-\x46\x61-\x66])}
;
${Ecyrillic::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))}
;
${Ecyrillic::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]))}
;
${Ecyrillic::dot} = ${Ecyrillic::dot};
${Ecyrillic::dot_s} = ${Ecyrillic::dot_s};
${Ecyrillic::eD} = ${Ecyrillic::eD};
${Ecyrillic::eS} = ${Ecyrillic::eS};
${Ecyrillic::eW} = ${Ecyrillic::eW};
${Ecyrillic::eH} = ${Ecyrillic::eH};
${Ecyrillic::eV} = ${Ecyrillic::eV};
${Ecyrillic::eR} = ${Ecyrillic::eR};
${Ecyrillic::eN} = ${Ecyrillic::eN};
${Ecyrillic::not_alnum} = ${Ecyrillic::not_alnum};
${Ecyrillic::not_alpha} = ${Ecyrillic::not_alpha};
${Ecyrillic::not_ascii} = ${Ecyrillic::not_ascii};
${Ecyrillic::not_blank} = ${Ecyrillic::not_blank};
${Ecyrillic::not_cntrl} = ${Ecyrillic::not_cntrl};
${Ecyrillic::not_digit} = ${Ecyrillic::not_digit};
${Ecyrillic::not_graph} = ${Ecyrillic::not_graph};
${Ecyrillic::not_lower} = ${Ecyrillic::not_lower};
${Ecyrillic::not_lower_i} = ${Ecyrillic::not_lower_i};
${Ecyrillic::not_print} = ${Ecyrillic::not_print};
${Ecyrillic::not_punct} = ${Ecyrillic::not_punct};
${Ecyrillic::not_space} = ${Ecyrillic::not_space};
${Ecyrillic::not_upper} = ${Ecyrillic::not_upper};
${Ecyrillic::not_upper_i} = ${Ecyrillic::not_upper_i};
${Ecyrillic::not_word} = ${Ecyrillic::not_word};
${Ecyrillic::not_xdigit} = ${Ecyrillic::not_xdigit};
${Ecyrillic::eb} = ${Ecyrillic::eb};
${Ecyrillic::eB} = ${Ecyrillic::eB};
sub
Ecyrillic::
split
(;$$$) {
my
$pattern
=
$_
[0];
my
$string
=
$_
[1];
my
$limit
=
$_
[2];
if
(not
defined
$pattern
) {
$pattern
=
' '
;
}
if
(not
defined
$string
) {
if
(
defined
$_
) {
$string
=
$_
;
}
else
{
$string
=
''
;
}
}
my
@split
= ();
if
(
$string
eq
''
) {
if
(
wantarray
) {
return
@split
;
}
else
{
carp
"Use of implicit split to \@_ is deprecated"
if
$^W;
@_
=
@split
;
return
scalar
@_
;
}
}
elsif
(
$pattern
eq
' '
) {
if
(not
defined
$limit
) {
return
CORE::
split
(
' '
,
$string
);
}
else
{
return
CORE::
split
(
' '
,
$string
,
$limit
);
}
}
if
((not
defined
$limit
) or (
$limit
<= 0)) {
if
(
''
=~ / \A
$pattern
\z /xms) {
my
$last_subexpression_offsets
= _last_subexpression_offsets(
$pattern
);
my
$limit
=
scalar
(() =
$string
=~ /(
$pattern
)/oxmsg);
eval
q{ no warnings }
;
while
((--
$limit
> 0) and (
$string
=~ s/\A((?:
$q_char
)+?)
$pattern
//m)) {
local
$@;
eval
q{ no warnings }
;
for
(
my
$digit
=1;
$digit
<= (
$last_subexpression_offsets
+ 1);
$digit
++) {
push
@split
, CORE::
eval
(
'$'
.
$digit
);
}
}
}
else
{
my
$last_subexpression_offsets
= _last_subexpression_offsets(
$pattern
);
eval
q{ no warnings }
;
while
(
$string
=~ s/\A((?:
$q_char
)*?)
$pattern
//m) {
local
$@;
eval
q{ no warnings }
;
for
(
my
$digit
=1;
$digit
<= (
$last_subexpression_offsets
+ 1);
$digit
++) {
push
@split
, CORE::
eval
(
'$'
.
$digit
);
}
}
}
}
elsif
(
$limit
> 0) {
if
(
''
=~ / \A
$pattern
\z /xms) {
my
$last_subexpression_offsets
= _last_subexpression_offsets(
$pattern
);
while
((--
$limit
> 0) and (CORE::
length
(
$string
) > 0)) {
eval
q{ no warnings }
;
if
(
$string
=~ s/\A((?:
$q_char
)+?)
$pattern
//m) {
local
$@;
for
(
my
$digit
=1;
$digit
<= (
$last_subexpression_offsets
+ 1);
$digit
++) {
push
@split
, CORE::
eval
(
'$'
.
$digit
);
}
}
}
}
else
{
my
$last_subexpression_offsets
= _last_subexpression_offsets(
$pattern
);
while
((--
$limit
> 0) and (CORE::
length
(
$string
) > 0)) {
eval
q{ no warnings }
;
if
(
$string
=~ s/\A((?:
$q_char
)*?)
$pattern
//m) {
local
$@;
for
(
my
$digit
=1;
$digit
<= (
$last_subexpression_offsets
+ 1);
$digit
++) {
push
@split
, CORE::
eval
(
'$'
.
$digit
);
}
}
}
}
}
if
(CORE::
length
(
$string
) > 0) {
push
@split
,
$string
;
}
if
((not
defined
$_
[2]) or (
$_
[2] == 0)) {
while
((
scalar
(
@split
) >= 1) and (
$split
[-1] eq
''
)) {
pop
@split
;
}
}
if
(
wantarray
) {
return
@split
;
}
else
{
carp
"Use of implicit split to \@_ is deprecated"
if
$^W;
@_
=
@split
;
return
scalar
@_
;
}
}
sub
_last_subexpression_offsets {
my
$pattern
=
$_
[0];
$pattern
=~ s/\(\?\
my
$modifier
=
''
;
if
(
$pattern
=~ /\(\?\^? ([\-A-Za-z]+) :/oxms) {
$modifier
= $1;
$modifier
=~ s/-[A-Za-z]*//;
}
my
@char
= ();
if
(
$modifier
=~ /x/oxms) {
@char
=
$pattern
=~ /\G((?>
[^\\\
\\
$q_char
|
\
\[ (?>(?:[^\\\]]|\\\\|\\\]|
$q_char
)+) \] |
\(\? |
$q_char
))/oxmsg;
}
else
{
@char
=
$pattern
=~ /\G((?>
[^\\\[\(] |
\\
$q_char
|
\[ (?>(?:[^\\\]]|\\\\|\\\]|
$q_char
)+) \] |
\(\? |
$q_char
))/oxmsg;
}
return
scalar
grep
{
$_
eq
'('
}
@char
;
}
sub
Ecyrillic::
tr
($$$$;$) {
my
$bind_operator
=
$_
[1];
my
$searchlist
=
$_
[2];
my
$replacementlist
=
$_
[3];
my
$modifier
=
$_
[4] ||
''
;
if
(
$modifier
=~ /r/oxms) {
if
(
$bind_operator
=~ / !~ /oxms) {
croak
"Using !~ with tr///r doesn't make sense"
;
}
}
my
@char
=
$_
[0] =~ /\G (?>
$q_char
) /oxmsg;
my
@searchlist
= _charlist_tr(
$searchlist
);
my
@replacementlist
= _charlist_tr(
$replacementlist
);
my
%tr
= ();
for
(
my
$i
=0;
$i
<=
$#searchlist
;
$i
++) {
if
(not
exists
$tr
{
$searchlist
[
$i
]}) {
if
(
defined
$replacementlist
[
$i
] and (
$replacementlist
[
$i
] ne
''
)) {
$tr
{
$searchlist
[
$i
]} =
$replacementlist
[
$i
];
}
elsif
(
$modifier
=~ /d/oxms) {
$tr
{
$searchlist
[
$i
]} =
''
;
}
elsif
(
defined
$replacementlist
[-1] and (
$replacementlist
[-1] ne
''
)) {
$tr
{
$searchlist
[
$i
]} =
$replacementlist
[-1];
}
else
{
$tr
{
$searchlist
[
$i
]} =
$searchlist
[
$i
];
}
}
}
my
$tr
= 0;
my
$replaced
=
''
;
if
(
$modifier
=~ /c/oxms) {
while
(
defined
(
my
$char
=
shift
@char
)) {
if
(not
exists
$tr
{
$char
}) {
if
(
defined
$replacementlist
[-1]) {
$replaced
.=
$replacementlist
[-1];
}
$tr
++;
if
(
$modifier
=~ /s/oxms) {
while
(
@char
and (not
exists
$tr
{
$char
[0]})) {
shift
@char
;
$tr
++;
}
}
}
else
{
$replaced
.=
$char
;
}
}
}
else
{
while
(
defined
(
my
$char
=
shift
@char
)) {
if
(
exists
$tr
{
$char
}) {
$replaced
.=
$tr
{
$char
};
$tr
++;
if
(
$modifier
=~ /s/oxms) {
while
(
@char
and (
exists
$tr
{
$char
[0]}) and (
$tr
{
$char
[0]} eq
$tr
{
$char
})) {
shift
@char
;
$tr
++;
}
}
}
else
{
$replaced
.=
$char
;
}
}
}
if
(
$modifier
=~ /r/oxms) {
return
$replaced
;
}
else
{
$_
[0] =
$replaced
;
if
(
$bind_operator
=~ / !~ /oxms) {
return
not
$tr
;
}
else
{
return
$tr
;
}
}
}
sub
Ecyrillic::
chop
(@) {
my
$chop
;
if
(
@_
== 0) {
my
@char
= /\G (?>
$q_char
) /oxmsg;
$chop
=
pop
@char
;
$_
=
join
''
,
@char
;
}
else
{
for
(
@_
) {
my
@char
= /\G (?>
$q_char
) /oxmsg;
$chop
=
pop
@char
;
$_
=
join
''
,
@char
;
}
}
return
$chop
;
}
sub
Ecyrillic::
index
($$;$) {
my
(
$str
,
$substr
,
$position
) =
@_
;
$position
||= 0;
my
$pos
= 0;
while
(
$pos
< CORE::
length
(
$str
)) {
if
(CORE::
substr
(
$str
,
$pos
,CORE::
length
(
$substr
)) eq
$substr
) {
if
(
$pos
>=
$position
) {
return
$pos
;
}
}
if
(CORE::
substr
(
$str
,
$pos
) =~ /\A (
$q_char
) /oxms) {
$pos
+= CORE::
length
($1);
}
else
{
$pos
+= 1;
}
}
return
-1;
}
sub
Ecyrillic::
rindex
($$;$) {
my
(
$str
,
$substr
,
$position
) =
@_
;
$position
||= CORE::
length
(
$str
) - 1;
my
$pos
= 0;
my
$rindex
= -1;
while
((
$pos
< CORE::
length
(
$str
)) and (
$pos
<=
$position
)) {
if
(CORE::
substr
(
$str
,
$pos
,CORE::
length
(
$substr
)) eq
$substr
) {
$rindex
=
$pos
;
}
if
(CORE::
substr
(
$str
,
$pos
) =~ /\A (
$q_char
) /oxms) {
$pos
+= CORE::
length
($1);
}
else
{
$pos
+= 1;
}
}
return
$rindex
;
}
sub
Ecyrillic::
lcfirst
(@) {
if
(
@_
) {
my
$s
=
shift
@_
;
if
(
@_
and
wantarray
) {
return
Ecyrillic::
lc
(CORE::
substr
(
$s
,0,1)) . CORE::
substr
(
$s
,1),
@_
;
}
else
{
return
Ecyrillic::
lc
(CORE::
substr
(
$s
,0,1)) . CORE::
substr
(
$s
,1);
}
}
else
{
return
Ecyrillic::
lc
(CORE::
substr
(
$_
,0,1)) . CORE::
substr
(
$_
,1);
}
}
sub
Ecyrillic::lcfirst_() {
return
Ecyrillic::
lc
(CORE::
substr
(
$_
,0,1)) . CORE::
substr
(
$_
,1);
}
sub
Ecyrillic::
lc
(@) {
if
(
@_
) {
my
$s
=
shift
@_
;
if
(
@_
and
wantarray
) {
return
join
(
''
,
map
{
defined
(
$lc
{
$_
}) ?
$lc
{
$_
} :
$_
} (
$s
=~ /\G (
$q_char
) /oxmsg)),
@_
;
}
else
{
return
join
(
''
,
map
{
defined
(
$lc
{
$_
}) ?
$lc
{
$_
} :
$_
} (
$s
=~ /\G (
$q_char
) /oxmsg));
}
}
else
{
return
Ecyrillic::lc_();
}
}
sub
Ecyrillic::lc_() {
my
$s
=
$_
;
return
join
''
,
map
{
defined
(
$lc
{
$_
}) ?
$lc
{
$_
} :
$_
} (
$s
=~ /\G (
$q_char
) /oxmsg);
}
sub
Ecyrillic::
ucfirst
(@) {
if
(
@_
) {
my
$s
=
shift
@_
;
if
(
@_
and
wantarray
) {
return
Ecyrillic::
uc
(CORE::
substr
(
$s
,0,1)) . CORE::
substr
(
$s
,1),
@_
;
}
else
{
return
Ecyrillic::
uc
(CORE::
substr
(
$s
,0,1)) . CORE::
substr
(
$s
,1);
}
}
else
{
return
Ecyrillic::
uc
(CORE::
substr
(
$_
,0,1)) . CORE::
substr
(
$_
,1);
}
}
sub
Ecyrillic::ucfirst_() {
return
Ecyrillic::
uc
(CORE::
substr
(
$_
,0,1)) . CORE::
substr
(
$_
,1);
}
sub
Ecyrillic::
uc
(@) {
if
(
@_
) {
my
$s
=
shift
@_
;
if
(
@_
and
wantarray
) {
return
join
(
''
,
map
{
defined
(
$uc
{
$_
}) ?
$uc
{
$_
} :
$_
} (
$s
=~ /\G (
$q_char
) /oxmsg)),
@_
;
}
else
{
return
join
(
''
,
map
{
defined
(
$uc
{
$_
}) ?
$uc
{
$_
} :
$_
} (
$s
=~ /\G (
$q_char
) /oxmsg));
}
}
else
{
return
Ecyrillic::uc_();
}
}
sub
Ecyrillic::uc_() {
my
$s
=
$_
;
return
join
''
,
map
{
defined
(
$uc
{
$_
}) ?
$uc
{
$_
} :
$_
} (
$s
=~ /\G (
$q_char
) /oxmsg);
}
sub
Ecyrillic::fc(@) {
if
(
@_
) {
my
$s
=
shift
@_
;
if
(
@_
and
wantarray
) {
return
join
(
''
,
map
{
defined
(
$fc
{
$_
}) ?
$fc
{
$_
} :
$_
} (
$s
=~ /\G (
$q_char
) /oxmsg)),
@_
;
}
else
{
return
join
(
''
,
map
{
defined
(
$fc
{
$_
}) ?
$fc
{
$_
} :
$_
} (
$s
=~ /\G (
$q_char
) /oxmsg));
}
}
else
{
return
Ecyrillic::fc_();
}
}
sub
Ecyrillic::fc_() {
my
$s
=
$_
;
return
join
''
,
map
{
defined
(
$fc
{
$_
}) ?
$fc
{
$_
} :
$_
} (
$s
=~ /\G (
$q_char
) /oxmsg);
}
{
sub
Ecyrillic::capture {
return
$_
[0];
}
}
sub
Ecyrillic::ignorecase {
my
@string
=
@_
;
my
$metachar
=
qr/[\@\\|[\]{]/
oxms;
for
my
$string
(
@string
) {
my
@char
=
$string
=~ /\G (?>\[\^|\\
$q_char
|
$q_char
) /oxmsg;
for
(
my
$i
=0;
$i
<=
$#char
;
$i
++) {
next
if
not
defined
$char
[
$i
];
if
(
$char
[
$i
] eq
'['
) {
my
$left
=
$i
;
if
(
$char
[
$i
+1] eq
']'
) {
$i
++;
}
while
(1) {
if
(++
$i
>
$#char
) {
croak
"Unmatched [] in regexp"
;
}
if
(
$char
[
$i
] eq
']'
) {
my
$right
=
$i
;
my
@charlist
= charlist_qr(
@char
[
$left
+1..
$right
-1],
'i'
);
for
my
$char
(
@charlist
) {
if
(0) {
}
elsif
(
$char
=~ /\A [.|)] \z/oxms) {
$char
=
'\\'
.
$char
;
}
}
splice
@char
,
$left
,
$right
-
$left
+1,
'(?:'
.
join
(
'|'
,
@charlist
) .
')'
;
$i
=
$left
;
last
;
}
}
}
elsif
(
$char
[
$i
] eq
'[^'
) {
my
$left
=
$i
;
if
(
$char
[
$i
+1] eq
']'
) {
$i
++;
}
while
(1) {
if
(++
$i
>
$#char
) {
croak
"Unmatched [] in regexp"
;
}
if
(
$char
[
$i
] eq
']'
) {
my
$right
=
$i
;
my
@charlist
= charlist_not_qr(
@char
[
$left
+1..
$right
-1],
'i'
);
for
my
$char
(
@charlist
) {
if
(0) {
}
elsif
(
$char
=~ /\A [.|)] \z/oxms) {
$char
=
'\\'
.
$char
;
}
}
splice
@char
,
$left
,
$right
-
$left
+1,
'(?!'
.
join
(
'|'
,
@charlist
) .
")(?:$your_char)"
;
$i
=
$left
;
last
;
}
}
}
elsif
(
my
$char
= classic_character_class(
$char
[
$i
])) {
$char
[
$i
] =
$char
;
}
elsif
(
$char
[
$i
] =~ /\A [\x00-\xFF] \z/oxms) {
my
$uc
= Ecyrillic::
uc
(
$char
[
$i
]);
my
$fc
= Ecyrillic::fc(
$char
[
$i
]);
if
(
$uc
ne
$fc
) {
if
(CORE::
length
(
$fc
) == 1) {
$char
[
$i
] =
'['
.
$uc
.
$fc
.
']'
;
}
else
{
$char
[
$i
] =
'(?:'
.
$uc
.
'|'
.
$fc
.
')'
;
}
}
}
}
for
(
my
$i
=0;
$i
<=
$#char
;
$i
++) {
next
if
not
defined
$char
[
$i
];
if
(0) {
}
elsif
((
$i
>= 1) and (
$char
[
$i
] =~ /\A [\?\+\*\{] \z/oxms)) {
if
(
$char
[
$i
-1] !~ /\A [\x00-\xFF] \z/oxms) {
$char
[
$i
-1] =
'(?:'
.
$char
[
$i
-1] .
')'
;
}
}
}
$string
=
join
''
,
@char
;
}
return
@string
;
}
sub
Ecyrillic::classic_character_class {
my
(
$char
) =
@_
;
return
{
'\D'
=>
'${Ecyrillic::eD}'
,
'\S'
=>
'${Ecyrillic::eS}'
,
'\W'
=>
'${Ecyrillic::eW}'
,
'\d'
=>
'[0-9]'
,
'\s'
=>
'\s'
,
'\w'
=>
'[0-9A-Z_a-z]'
,
'\C'
=>
'[\x00-\xFF]'
,
'\X'
=>
'X'
,
'\H'
=>
'${Ecyrillic::eH}'
,
'\V'
=>
'${Ecyrillic::eV}'
,
'\h'
=>
'[\x09\x20]'
,
'\v'
=>
'[\x0A\x0B\x0C\x0D]'
,
'\R'
=>
'${Ecyrillic::eR}'
,
'\N'
=>
'${Ecyrillic::eN}'
,
'\b'
=>
'${Ecyrillic::eb}'
,
'\B'
=>
'${Ecyrillic::eB}'
,
}->{
$char
} ||
''
;
}
my
@chars1
= ();
sub
chars1 {
if
(
@chars1
) {
return
@chars1
;
}
if
(
exists
$range_tr
{1}) {
my
@ranges
= @{
$range_tr
{1} };
while
(
my
@range
=
splice
(
@ranges
,0,1)) {
for
my
$oct0
(@{
$range
[0]}) {
push
@chars1
,
pack
'C'
,
$oct0
;
}
}
}
return
@chars1
;
}
my
@chars2
= ();
sub
chars2 {
if
(
@chars2
) {
return
@chars2
;
}
if
(
exists
$range_tr
{2}) {
my
@ranges
= @{
$range_tr
{2} };
while
(
my
@range
=
splice
(
@ranges
,0,2)) {
for
my
$oct0
(@{
$range
[0]}) {
for
my
$oct1
(@{
$range
[1]}) {
push
@chars2
,
pack
'CC'
,
$oct0
,
$oct1
;
}
}
}
}
return
@chars2
;
}
my
@chars3
= ();
sub
chars3 {
if
(
@chars3
) {
return
@chars3
;
}
if
(
exists
$range_tr
{3}) {
my
@ranges
= @{
$range_tr
{3} };
while
(
my
@range
=
splice
(
@ranges
,0,3)) {
for
my
$oct0
(@{
$range
[0]}) {
for
my
$oct1
(@{
$range
[1]}) {
for
my
$oct2
(@{
$range
[2]}) {
push
@chars3
,
pack
'CCC'
,
$oct0
,
$oct1
,
$oct2
;
}
}
}
}
}
return
@chars3
;
}
my
@chars4
= ();
sub
chars4 {
if
(
@chars4
) {
return
@chars4
;
}
if
(
exists
$range_tr
{4}) {
my
@ranges
= @{
$range_tr
{4} };
while
(
my
@range
=
splice
(
@ranges
,0,4)) {
for
my
$oct0
(@{
$range
[0]}) {
for
my
$oct1
(@{
$range
[1]}) {
for
my
$oct2
(@{
$range
[2]}) {
for
my
$oct3
(@{
$range
[3]}) {
push
@chars4
,
pack
'CCCC'
,
$oct0
,
$oct1
,
$oct2
,
$oct3
;
}
}
}
}
}
}
return
@chars4
;
}
sub
_charlist_tr {
local
$_
=
shift
@_
;
my
@char
= ();
while
(not /\G \z/oxmsgc) {
if
(/\G (\\0?55|\\x2[Dd]|\\-) /oxmsgc) {
push
@char
,
'\-'
;
}
elsif
(/\G \\ ([0-7]{2,3}) /oxmsgc) {
push
@char
, CORE::
chr
(
oct
$1);
}
elsif
(/\G \\x ([0-9A-Fa-f]{1,2}) /oxmsgc) {
push
@char
, CORE::
chr
(
hex
$1);
}
elsif
(/\G \\c ([\x40-\x5F]) /oxmsgc) {
push
@char
, CORE::
chr
(CORE::
ord
($1) & 0x1F);
}
elsif
(/\G (\\ [0nrtfbae]) /oxmsgc) {
push
@char
, {
'\0'
=>
"\0"
,
'\n'
=>
"\n"
,
'\r'
=>
"\r"
,
'\t'
=>
"\t"
,
'\f'
=>
"\f"
,
'\b'
=>
"\x08"
,
'\a'
=>
"\a"
,
'\e'
=>
"\e"
,
}->{$1};
}
elsif
(/\G \\ (
$q_char
) /oxmsgc) {
push
@char
, $1;
}
elsif
(/\G (
$q_char
) /oxmsgc) {
push
@char
, $1;
}
}
@char
=
join
(
''
,
@char
) =~ /\G (?>\\-|
$q_char
) /oxmsg;
my
@i
= ();
for
my
$i
(0 ..
$#char
) {
if
(
$char
[
$i
] eq
'\-'
) {
$char
[
$i
] =
'-'
;
}
elsif
(
$char
[
$i
] eq
'-'
) {
if
((0 <
$i
) and (
$i
<
$#char
)) {
push
@i
,
$i
;
}
}
}
for
my
$i
(CORE::
reverse
@i
) {
my
@range
= ();
if
((CORE::
length
(
$char
[
$i
-1]) > CORE::
length
(
$char
[
$i
+1])) or (
$char
[
$i
-1] gt
$char
[
$i
+1])) {
croak
"Invalid tr/// range \"\\x"
.
unpack
(
'H*'
,
$char
[
$i
-1]) .
'-\x'
.
unpack
(
'H*'
,
$char
[
$i
+1]) .
'"'
;
}
if
(CORE::
length
(
$char
[
$i
-1]) == 1) {
if
(CORE::
length
(
$char
[
$i
+1]) == 1) {
push
@range
,
grep
{(
$char
[
$i
-1] le
$_
) and (
$_
le
$char
[
$i
+1])} chars1();
}
elsif
(CORE::
length
(
$char
[
$i
+1]) == 2) {
push
@range
,
grep
{
$char
[
$i
-1] le
$_
} chars1();
push
@range
,
grep
{
$_
le
$char
[
$i
+1]} chars2();
}
elsif
(CORE::
length
(
$char
[
$i
+1]) == 3) {
push
@range
,
grep
{
$char
[
$i
-1] le
$_
} chars1();
push
@range
, chars2();
push
@range
,
grep
{
$_
le
$char
[
$i
+1]} chars3();
}
elsif
(CORE::
length
(
$char
[
$i
+1]) == 4) {
push
@range
,
grep
{
$char
[
$i
-1] le
$_
} chars1();
push
@range
, chars2();
push
@range
, chars3();
push
@range
,
grep
{
$_
le
$char
[
$i
+1]} chars4();
}
else
{
croak
"Invalid tr/// range (over 4octets) \"\\x"
.
unpack
(
'H*'
,
$char
[
$i
-1]) .
'-\x'
.
unpack
(
'H*'
,
$char
[
$i
+1]) .
'"'
;
}
}
elsif
(CORE::
length
(
$char
[
$i
-1]) == 2) {
if
(CORE::
length
(
$char
[
$i
+1]) == 2) {
push
@range
,
grep
{(
$char
[
$i
-1] le
$_
) and (
$_
le
$char
[
$i
+1])} chars2();
}
elsif
(CORE::
length
(
$char
[
$i
+1]) == 3) {
push
@range
,
grep
{
$char
[
$i
-1] le
$_
} chars2();
push
@range
,
grep
{
$_
le
$char
[
$i
+1]} chars3();
}
elsif
(CORE::
length
(
$char
[
$i
+1]) == 4) {
push
@range
,
grep
{
$char
[
$i
-1] le
$_
} chars2();
push
@range
, chars3();
push
@range
,
grep
{
$_
le
$char
[
$i
+1]} chars4();
}
else
{
croak
"Invalid tr/// range (over 4octets) \"\\x"
.
unpack
(
'H*'
,
$char
[
$i
-1]) .
'-\x'
.
unpack
(
'H*'
,
$char
[
$i
+1]) .
'"'
;
}
}
elsif
(CORE::
length
(
$char
[
$i
-1]) == 3) {
if
(CORE::
length
(
$char
[
$i
+1]) == 3) {
push
@range
,
grep
{(
$char
[
$i
-1] le
$_
) and (
$_
le
$char
[
$i
+1])} chars3();
}
elsif
(CORE::
length
(
$char
[
$i
+1]) == 4) {
push
@range
,
grep
{
$char
[
$i
-1] le
$_
} chars3();
push
@range
,
grep
{
$_
le
$char
[
$i
+1]} chars4();
}
else
{
croak
"Invalid tr/// range (over 4octets) \"\\x"
.
unpack
(
'H*'
,
$char
[
$i
-1]) .
'-\x'
.
unpack
(
'H*'
,
$char
[
$i
+1]) .
'"'
;
}
}
elsif
(CORE::
length
(
$char
[
$i
-1]) == 4) {
if
(CORE::
length
(
$char
[
$i
+1]) == 4) {
push
@range
,
grep
{(
$char
[
$i
-1] le
$_
) and (
$_
le
$char
[
$i
+1])} chars4();
}
else
{
croak
"Invalid tr/// range (over 4octets) \"\\x"
.
unpack
(
'H*'
,
$char
[
$i
-1]) .
'-\x'
.
unpack
(
'H*'
,
$char
[
$i
+1]) .
'"'
;
}
}
else
{
croak
"Invalid tr/// range (over 4octets) \"\\x"
.
unpack
(
'H*'
,
$char
[
$i
-1]) .
'-\x'
.
unpack
(
'H*'
,
$char
[
$i
+1]) .
'"'
;
}
splice
@char
,
$i
-1, 3,
@range
;
}
return
@char
;
}
sub
_cc {
if
(
scalar
(
@_
) == 0) {
die
__FILE__,
": subroutine cc got no parameter.\n"
;
}
elsif
(
scalar
(
@_
) == 1) {
return
sprintf
(
'\x%02X'
,
$_
[0]);
}
elsif
(
scalar
(
@_
) == 2) {
if
(
$_
[0] >
$_
[1]) {
die
__FILE__,
": subroutine cc got \$_[0] > \$_[1] parameters).\n"
;
}
elsif
(
$_
[0] ==
$_
[1]) {
return
sprintf
(
'\x%02X'
,
$_
[0]);
}
elsif
((
$_
[0]+1) ==
$_
[1]) {
return
sprintf
(
'[\\x%02X\\x%02X]'
,
$_
[0],
$_
[1]);
}
else
{
return
sprintf
(
'[\\x%02X-\\x%02X]'
,
$_
[0],
$_
[1]);
}
}
else
{
die
__FILE__,
": subroutine cc got 3 or more parameters (@{[scalar(@_)]} parameters).\n"
;
}
}
sub
_octets {
my
$length
=
shift
@_
;
if
(
$length
== 1) {
my
(
$a1
) =
unpack
'C'
,
$_
[0];
my
(
$z1
) =
unpack
'C'
,
$_
[1];
if
(
$a1
>
$z1
) {
croak
'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) '
.
'\x'
.
unpack
(
'H*'
,
$a1
) .
'-\x'
.
unpack
(
'H*'
,
$z1
);
}
if
(
$a1
==
$z1
) {
return
sprintf
(
'\x%02X'
,
$a1
);
}
elsif
((
$a1
+1) ==
$z1
) {
return
sprintf
(
'\x%02X\x%02X'
,
$a1
,
$z1
);
}
else
{
return
sprintf
(
'\x%02X-\x%02X'
,
$a1
,
$z1
);
}
}
else
{
die
__FILE__,
": subroutine _octets got invalid length ($length).\n"
;
}
}
sub
_range_regexp {
my
(
$length
,
$first
,
$last
) =
@_
;
my
@range_regexp
= ();
if
(not
exists
$range_tr
{
$length
}) {
return
@range_regexp
;
}
my
@ranges
= @{
$range_tr
{
$length
} };
while
(
my
@range
=
splice
(
@ranges
,0,
$length
)) {
my
$min
=
''
;
my
$max
=
''
;
for
(
my
$i
=0;
$i
<
$length
;
$i
++) {
$min
.=
pack
'C'
,
$range
[
$i
][0];
$max
.=
pack
'C'
,
$range
[
$i
][-1];
}
if
(
$max
lt
$first
) {
}
elsif
((
$min
le
$first
) and (
$first
le
$max
) and (
$max
le
$last
)) {
push
@range_regexp
, _octets(
$length
,
$first
,
$max
,
$min
,
$max
);
}
elsif
((
$min
eq
$first
) and (
$max
eq
$last
)) {
push
@range_regexp
, _octets(
$length
,
$first
,
$last
,
$min
,
$max
);
}
elsif
((
$first
le
$min
) and (
$max
le
$last
)) {
push
@range_regexp
, _octets(
$length
,
$min
,
$max
,
$min
,
$max
);
}
elsif
((
$min
le
$first
) and (
$last
le
$max
)) {
push
@range_regexp
, _octets(
$length
,
$first
,
$last
,
$min
,
$max
);
}
elsif
((
$first
le
$min
) and (
$min
le
$last
) and (
$last
le
$max
)) {
push
@range_regexp
, _octets(
$length
,
$min
,
$last
,
$min
,
$max
);
}
elsif
(
$last
lt
$min
) {
}
else
{
die
__FILE__,
": subroutine _range_regexp panic.\n"
;
}
}
return
@range_regexp
;
}
sub
_charlist {
my
$modifier
=
pop
@_
;
my
@char
=
@_
;
my
$ignorecase
= (
$modifier
=~ /i/oxms) ? 1 : 0;
for
(
my
$i
=0;
$i
<=
$#char
;
$i
++) {
if
(
$char
[
$i
] eq
'-'
) {
if
((0 <
$i
) and (
$i
<
$#char
)) {
$char
[
$i
] =
'...'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
$char
[
$i
] = octchr($1);
}
elsif
(
$char
[
$i
] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
$char
[
$i
] = hexchr($1);
}
elsif
(
$char
[
$i
] =~ /\A \\ ([bBNpP]) ( \{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
$char
[
$i
] = $1 .
'\\'
. $2;
}
elsif
(
$char
[
$i
] =~ /\A \\ ( [pPX] ) \z/oxms) {
$char
[
$i
] = $1;
}
elsif
(
$char
[
$i
] =~ /\A \\ ([0-7]{2,3}) \z/oxms) {
$char
[
$i
] = CORE::
chr
oct
$1;
}
elsif
(
$char
[
$i
] =~ /\A \\x ([0-9A-Fa-f]{1,2}) \z/oxms) {
$char
[
$i
] = CORE::
chr
hex
$1;
}
elsif
(
$char
[
$i
] =~ /\A \\c ([\x40-\x5F]) \z/oxms) {
$char
[
$i
] = CORE::
chr
(CORE::
ord
($1) & 0x1F);
}
elsif
(
$char
[
$i
] =~ /\A (\\ [0nrtfbaedswDSWHVhvR]) \z/oxms) {
$char
[
$i
] = {
'\0'
=>
"\0"
,
'\n'
=>
"\n"
,
'\r'
=>
"\r"
,
'\t'
=>
"\t"
,
'\f'
=>
"\f"
,
'\b'
=>
"\x08"
,
'\a'
=>
"\a"
,
'\e'
=>
"\e"
,
'\d'
=>
'[0-9]'
,
'\s'
=>
'\s'
,
'\w'
=>
'[0-9A-Z_a-z]'
,
'\D'
=>
'${Ecyrillic::eD}'
,
'\S'
=>
'${Ecyrillic::eS}'
,
'\W'
=>
'${Ecyrillic::eW}'
,
'\H'
=>
'${Ecyrillic::eH}'
,
'\V'
=>
'${Ecyrillic::eV}'
,
'\h'
=>
'[\x09\x20]'
,
'\v'
=>
'[\x0A\x0B\x0C\x0D]'
,
'\R'
=>
'${Ecyrillic::eR}'
,
}->{$1};
}
elsif
(
$ignorecase
and (
$char
[
$i
] =~ /\A ( \[\: \^? (?:lower|upper) :\] ) \z/oxms)) {
$char
[
$i
] = {
'[:lower:]'
=>
'[\x41-\x5A\x61-\x7A]'
,
'[:upper:]'
=>
'[\x41-\x5A\x61-\x7A]'
,
'[:^lower:]'
=>
'${Ecyrillic::not_lower_i}'
,
'[:^upper:]'
=>
'${Ecyrillic::not_upper_i}'
,
}->{$1};
}
elsif
(
$char
[
$i
] =~ /\A ( \[\: \^? (?:alnum|alpha|ascii|blank|cntrl|digit|graph|lower|
print
|punct|space|upper|word|xdigit) :\] ) \z/oxms) {
$char
[
$i
] = {
'[:alnum:]'
=>
'[\x30-\x39\x41-\x5A\x61-\x7A]'
,
'[:alpha:]'
=>
'[\x41-\x5A\x61-\x7A]'
,
'[:ascii:]'
=>
'[\x00-\x7F]'
,
'[:blank:]'
=>
'[\x09\x20]'
,
'[:cntrl:]'
=>
'[\x00-\x1F\x7F]'
,
'[:digit:]'
=>
'[\x30-\x39]'
,
'[:graph:]'
=>
'[\x21-\x7F]'
,
'[:lower:]'
=>
'[\x61-\x7A]'
,
'[:print:]'
=>
'[\x20-\x7F]'
,
'[:punct:]'
=>
'[\x21-\x2F\x3A-\x3F\x40\x5B-\x5F\x60\x7B-\x7E]'
,
'[:space:]'
=>
'[\s\x0B]'
,
'[:upper:]'
=>
'[\x41-\x5A]'
,
'[:word:]'
=>
'[\x30-\x39\x41-\x5A\x5F\x61-\x7A]'
,
'[:xdigit:]'
=>
'[\x30-\x39\x41-\x46\x61-\x66]'
,
'[:^alnum:]'
=>
'${Ecyrillic::not_alnum}'
,
'[:^alpha:]'
=>
'${Ecyrillic::not_alpha}'
,
'[:^ascii:]'
=>
'${Ecyrillic::not_ascii}'
,
'[:^blank:]'
=>
'${Ecyrillic::not_blank}'
,
'[:^cntrl:]'
=>
'${Ecyrillic::not_cntrl}'
,
'[:^digit:]'
=>
'${Ecyrillic::not_digit}'
,
'[:^graph:]'
=>
'${Ecyrillic::not_graph}'
,
'[:^lower:]'
=>
'${Ecyrillic::not_lower}'
,
'[:^print:]'
=>
'${Ecyrillic::not_print}'
,
'[:^punct:]'
=>
'${Ecyrillic::not_punct}'
,
'[:^space:]'
=>
'${Ecyrillic::not_space}'
,
'[:^upper:]'
=>
'${Ecyrillic::not_upper}'
,
'[:^word:]'
=>
'${Ecyrillic::not_word}'
,
'[:^xdigit:]'
=>
'${Ecyrillic::not_xdigit}'
,
}->{$1};
}
elsif
(
$char
[
$i
] =~ /\A \\ (
$q_char
) \z/oxms) {
$char
[
$i
] = $1;
}
}
my
@singleoctet
= ();
my
@multipleoctet
= ();
for
(
my
$i
=0;
$i
<=
$#char
; ) {
if
(
defined
(
$char
[
$i
+1]) and (
$char
[
$i
+1] eq
'...'
)) {
$i
+= 1;
next
;
}
elsif
(
$char
[
$i
] eq
'...'
) {
if
(CORE::
length
(
$char
[
$i
-1]) > CORE::
length
(
$char
[
$i
+1])) {
croak
'Invalid [] range in regexp (length(A) > length(B)) '
.
'\x'
.
unpack
(
'H*'
,
$char
[
$i
-1]) .
'-\x'
.
unpack
(
'H*'
,
$char
[
$i
+1]);
}
elsif
(CORE::
length
(
$char
[
$i
-1]) == CORE::
length
(
$char
[
$i
+1])) {
if
(
$char
[
$i
-1] gt
$char
[
$i
+1]) {
croak
'Invalid [] range in regexp (CORE::ord(A) > CORE::ord(B)) '
.
'\x'
.
unpack
(
'H*'
,
$char
[
$i
-1]) .
'-\x'
.
unpack
(
'H*'
,
$char
[
$i
+1]);
}
}
for
my
$length
(CORE::
length
(
$char
[
$i
-1]) .. CORE::
length
(
$char
[
$i
+1])) {
my
@regexp
= ();
if
((
$length
== CORE::
length
(
$char
[
$i
-1])) and (
$length
== CORE::
length
(
$char
[
$i
+1]))) {
push
@regexp
, _range_regexp(
$length
,
$char
[
$i
-1],
$char
[
$i
+1]);
}
elsif
(
$length
== CORE::
length
(
$char
[
$i
-1])) {
push
@regexp
, _range_regexp(
$length
,
$char
[
$i
-1],
"\xFF"
x
$length
);
}
elsif
((CORE::
length
(
$char
[
$i
-1]) <
$length
) and (
$length
< CORE::
length
(
$char
[
$i
+1]))) {
push
@regexp
, _range_regexp(
$length
,
"\x00"
x
$length
,
"\xFF"
x
$length
);
}
elsif
(
$length
== CORE::
length
(
$char
[
$i
+1])) {
push
@regexp
, _range_regexp(
$length
,
"\x00"
x
$length
,
$char
[
$i
+1]);
}
else
{
die
__FILE__,
": subroutine make_regexp panic.\n"
;
}
if
(
$length
== 1) {
push
@singleoctet
,
@regexp
;
}
else
{
push
@multipleoctet
,
@regexp
;
}
}
$i
+= 2;
}
elsif
(
$char
[
$i
] =~ /\A [\x00-\xFF] \z/oxms) {
if
(
$modifier
=~ /i/oxms) {
my
$uc
= Ecyrillic::
uc
(
$char
[
$i
]);
my
$fc
= Ecyrillic::fc(
$char
[
$i
]);
if
(
$uc
ne
$fc
) {
if
(CORE::
length
(
$fc
) == 1) {
push
@singleoctet
,
$uc
,
$fc
;
}
else
{
push
@singleoctet
,
$uc
;
push
@multipleoctet
,
$fc
;
}
}
else
{
push
@singleoctet
,
$char
[
$i
];
}
}
else
{
push
@singleoctet
,
$char
[
$i
];
}
$i
+= 1;
}
elsif
(
$char
[
$i
] =~ /\A (?: \\h ) \z/oxms) {
push
@singleoctet
,
"\t"
,
"\x20"
;
$i
+= 1;
}
elsif
(
$char
[
$i
] =~ /\A (?: \\v ) \z/oxms) {
push
@singleoctet
,
"\x0A"
,
"\x0B"
,
"\x0C"
,
"\x0D"
;
$i
+= 1;
}
elsif
(
$char
[
$i
] =~ /\A (?: \\d | \\s | \\w ) \z/oxms) {
push
@singleoctet
,
$char
[
$i
];
$i
+= 1;
}
else
{
push
@multipleoctet
,
$char
[
$i
];
$i
+= 1;
}
}
for
(
@singleoctet
) {
if
(
$_
eq
'...'
) {
$_
=
'-'
;
}
elsif
(/\A \n \z/oxms) {
$_
=
'\n'
;
}
elsif
(/\A \r \z/oxms) {
$_
=
'\r'
;
}
elsif
(/\A ([\x00-\x20\x7F-\xFF]) \z/oxms) {
$_
=
sprintf
(
'\x%02X'
, CORE::
ord
$1);
}
elsif
(/\A [\x00-\xFF] \z/oxms) {
$_
=
quotemeta
$_
;
}
}
return
\
@singleoctet
, \
@multipleoctet
;
}
sub
octchr {
my
(
$octdigit
) =
@_
;
my
@binary
= ();
for
my
$octal
(
split
(//,
$octdigit
)) {
push
@binary
, {
'0'
=>
'000'
,
'1'
=>
'001'
,
'2'
=>
'010'
,
'3'
=>
'011'
,
'4'
=>
'100'
,
'5'
=>
'101'
,
'6'
=>
'110'
,
'7'
=>
'111'
,
}->{
$octal
};
}
my
$binary
=
join
''
,
@binary
;
my
$octchr
= {
1
=>
pack
(
'B*'
,
"0000000$binary"
),
2
=>
pack
(
'B*'
,
"000000$binary"
),
3
=>
pack
(
'B*'
,
"00000$binary"
),
4
=>
pack
(
'B*'
,
"0000$binary"
),
5
=>
pack
(
'B*'
,
"000$binary"
),
6
=>
pack
(
'B*'
,
"00$binary"
),
7
=>
pack
(
'B*'
,
"0$binary"
),
0
=>
pack
(
'B*'
,
"$binary"
),
}->{CORE::
length
(
$binary
) % 8};
return
$octchr
;
}
sub
hexchr {
my
(
$hexdigit
) =
@_
;
my
$hexchr
= {
1
=>
pack
(
'H*'
,
"0$hexdigit"
),
0
=>
pack
(
'H*'
,
"$hexdigit"
),
}->{CORE::
length
(
$_
[0]) % 2};
return
$hexchr
;
}
sub
charlist_qr {
my
$modifier
=
pop
@_
;
my
@char
=
@_
;
my
(
$singleoctet
,
$multipleoctet
) = _charlist(
@char
,
$modifier
);
my
@singleoctet
=
@$singleoctet
;
my
@multipleoctet
=
@$multipleoctet
;
if
(
scalar
(
@singleoctet
) >= 1) {
if
(
$modifier
=~ m/i/oxms) {
my
%singleoctet_ignorecase
= ();
for
(
@singleoctet
) {
while
(s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
for
my
$ord
(
hex
($1) ..
hex
($2)) {
my
$char
= CORE::
chr
(
$ord
);
my
$uc
= Ecyrillic::
uc
(
$char
);
my
$fc
= Ecyrillic::fc(
$char
);
if
(
$uc
eq
$fc
) {
$singleoctet_ignorecase
{
unpack
'C*'
,
$char
} = 1;
}
else
{
if
(CORE::
length
(
$fc
) == 1) {
$singleoctet_ignorecase
{
unpack
'C*'
,
$uc
} = 1;
$singleoctet_ignorecase
{
unpack
'C*'
,
$fc
} = 1;
}
else
{
$singleoctet_ignorecase
{
unpack
'C*'
,
$uc
} = 1;
push
@multipleoctet
,
join
''
,
map
{
sprintf
(
'\x%02X'
,
$_
)}
unpack
'C*'
,
$fc
;
}
}
}
}
if
(
$_
ne
''
) {
$singleoctet_ignorecase
{
unpack
'C*'
,
$_
} = 1;
}
}
my
$i
= 0;
my
@singleoctet_ignorecase
= ();
for
my
$ord
(0 .. 255) {
if
(
exists
$singleoctet_ignorecase
{
$ord
}) {
push
@{
$singleoctet_ignorecase
[
$i
]},
$ord
;
}
else
{
$i
++;
}
}
@singleoctet
= ();
for
my
$range
(
@singleoctet_ignorecase
) {
if
(
ref
$range
) {
if
(
scalar
(@{
$range
}) == 1) {
push
@singleoctet
,
sprintf
(
'\x%02X'
, @{
$range
}[0]);
}
elsif
(
scalar
(@{
$range
}) == 2) {
push
@singleoctet
,
sprintf
(
'\x%02X\x%02X'
, @{
$range
}[0], @{
$range
}[-1]);
}
else
{
push
@singleoctet
,
sprintf
(
'\x%02X-\x%02X'
, @{
$range
}[0], @{
$range
}[-1]);
}
}
}
}
my
$not_anchor
=
''
;
push
@multipleoctet
,
join
(
''
,
$not_anchor
,
'['
,
@singleoctet
,
']'
);
}
if
(
scalar
(
@multipleoctet
) >= 2) {
return
'(?:'
.
join
(
'|'
,
@multipleoctet
) .
')'
;
}
else
{
return
$multipleoctet
[0];
}
}
sub
charlist_not_qr {
my
$modifier
=
pop
@_
;
my
@char
=
@_
;
my
(
$singleoctet
,
$multipleoctet
) = _charlist(
@char
,
$modifier
);
my
@singleoctet
=
@$singleoctet
;
my
@multipleoctet
=
@$multipleoctet
;
if
(
$modifier
=~ m/i/oxms) {
my
%singleoctet_ignorecase
= ();
for
(
@singleoctet
) {
while
(s/ \A \\x(..) - \\x(..) //oxms or s/ \A \\x((..)) //oxms) {
for
my
$ord
(
hex
($1) ..
hex
($2)) {
my
$char
= CORE::
chr
(
$ord
);
my
$uc
= Ecyrillic::
uc
(
$char
);
my
$fc
= Ecyrillic::fc(
$char
);
if
(
$uc
eq
$fc
) {
$singleoctet_ignorecase
{
unpack
'C*'
,
$char
} = 1;
}
else
{
if
(CORE::
length
(
$fc
) == 1) {
$singleoctet_ignorecase
{
unpack
'C*'
,
$uc
} = 1;
$singleoctet_ignorecase
{
unpack
'C*'
,
$fc
} = 1;
}
else
{
$singleoctet_ignorecase
{
unpack
'C*'
,
$uc
} = 1;
push
@multipleoctet
,
join
''
,
map
{
sprintf
(
'\x%02X'
,
$_
)}
unpack
'C*'
,
$fc
;
}
}
}
}
if
(
$_
ne
''
) {
$singleoctet_ignorecase
{
unpack
'C*'
,
$_
} = 1;
}
}
my
$i
= 0;
my
@singleoctet_ignorecase
= ();
for
my
$ord
(0 .. 255) {
if
(
exists
$singleoctet_ignorecase
{
$ord
}) {
push
@{
$singleoctet_ignorecase
[
$i
]},
$ord
;
}
else
{
$i
++;
}
}
@singleoctet
= ();
for
my
$range
(
@singleoctet_ignorecase
) {
if
(
ref
$range
) {
if
(
scalar
(@{
$range
}) == 1) {
push
@singleoctet
,
sprintf
(
'\x%02X'
, @{
$range
}[0]);
}
elsif
(
scalar
(@{
$range
}) == 2) {
push
@singleoctet
,
sprintf
(
'\x%02X\x%02X'
, @{
$range
}[0], @{
$range
}[-1]);
}
else
{
push
@singleoctet
,
sprintf
(
'\x%02X-\x%02X'
, @{
$range
}[0], @{
$range
}[-1]);
}
}
}
}
if
(
scalar
(
@multipleoctet
) >= 1) {
if
(
scalar
(
@singleoctet
) >= 1) {
return
'(?!'
.
join
(
'|'
,
@multipleoctet
) .
')(?:[^'
.
join
(
''
,
@singleoctet
) .
'])'
;
}
else
{
return
'(?!'
.
join
(
'|'
,
@multipleoctet
) .
")(?:$your_char)"
;
}
}
else
{
if
(
scalar
(
@singleoctet
) >= 1) {
return
'(?:[^'
.
join
(
''
,
@singleoctet
) .
'])'
;
}
else
{
return
"(?:$your_char)"
;
}
}
}
sub
_open_r {
my
(
undef
,
$file
) =
@_
;
return
CORE::
sysopen
(
$_
[0],
$file
,
&O_RDONLY
);
}
sub
_open_a {
my
(
undef
,
$file
) =
@_
;
use
Fcntl
qw(O_WRONLY O_APPEND O_CREAT)
;
return
CORE::
sysopen
(
$_
[0],
$file
,
&O_WRONLY
|
&O_APPEND
|
&O_CREAT
);
}
sub
_systemx {
$| = 1;
local
@ENV
{
qw(IFS CDPATH ENV BASH_ENV)
};
return
CORE::
system
{
$_
[0] }
@_
;
}
sub
Ecyrillic::
chr
(;$) {
my
$c
=
@_
?
$_
[0] :
$_
;
if
(
$c
== 0x00) {
return
"\x00"
;
}
else
{
my
@chr
= ();
while
(
$c
> 0) {
unshift
@chr
, (
$c
% 0x100);
$c
=
int
(
$c
/ 0x100);
}
return
pack
'C*'
,
@chr
;
}
}
sub
Ecyrillic::chr_() {
my
$c
=
$_
;
if
(
$c
== 0x00) {
return
"\x00"
;
}
else
{
my
@chr
= ();
while
(
$c
> 0) {
unshift
@chr
, (
$c
% 0x100);
$c
=
int
(
$c
/ 0x100);
}
return
pack
'C*'
,
@chr
;
}
}
sub
Ecyrillic::
glob
($) {
if
(
wantarray
) {
my
@glob
= _DOS_like_glob(
@_
);
for
my
$glob
(
@glob
) {
$glob
=~ s{ \A (?:\./)+ }{}oxms;
}
return
@glob
;
}
else
{
my
$glob
= _DOS_like_glob(
@_
);
$glob
=~ s{ \A (?:\./)+ }{}oxms;
return
$glob
;
}
}
sub
Ecyrillic::glob_() {
if
(
wantarray
) {
my
@glob
= _DOS_like_glob();
for
my
$glob
(
@glob
) {
$glob
=~ s{ \A (?:\./)+ }{}oxms;
}
return
@glob
;
}
else
{
my
$glob
= _DOS_like_glob();
$glob
=~ s{ \A (?:\./)+ }{}oxms;
return
$glob
;
}
}
my
%iter
;
my
%entries
;
sub
_DOS_like_glob {
my
(
$expr
,
$cxix
) =
@_
;
$expr
=
$_
if
not
defined
$expr
;
if
($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
$expr
=~ s{ \A ~ (?= [^/\\] ) }
{ my_home_MSWin32() }oxmse;
}
else
{
$expr
=~ s{ \A ~ ( (?:[^/])* ) }
{ $1 ? (CORE::
eval
(
q{(getpwnam($1))[7]}
)||my_home()) : my_home() }oxmse;
}
$cxix
=
'_G_'
if
not
defined
$cxix
;
$iter
{
$cxix
} = 0
if
not
exists
$iter
{
$cxix
};
if
(
$iter
{
$cxix
} == 0) {
$entries
{
$cxix
} = [ _do_glob(1, _parse_line(
$expr
)) ];
}
if
(
wantarray
) {
delete
$iter
{
$cxix
};
return
@{
delete
$entries
{
$cxix
}};
}
else
{
if
(
$iter
{
$cxix
} =
scalar
@{
$entries
{
$cxix
}}) {
return
shift
@{
$entries
{
$cxix
}};
}
else
{
delete
$iter
{
$cxix
};
delete
$entries
{
$cxix
};
return
undef
;
}
}
}
sub
_do_glob {
my
(
$cond
,
@expr
) =
@_
;
my
@glob
= ();
my
$fix_drive_relative_paths
= 0;
OUTER:
for
my
$expr
(
@expr
) {
next
OUTER
if
not
defined
$expr
;
next
OUTER
if
$expr
eq
''
;
my
@matched
= ();
my
@globdir
= ();
my
$head
=
'.'
;
my
$pathsep
=
'/'
;
my
$tail
;
if
(
$expr
=~ /\A
" ((?:$q_char)*?) "
\z/oxms) {
$expr
= $1;
if
(
$cond
eq
'd'
) {
if
(-d
$expr
) {
push
@glob
,
$expr
;
}
}
else
{
if
(-e
$expr
) {
push
@glob
,
$expr
;
}
}
next
OUTER;
}
if
($^O =~ /\A (?: MSWin32 | NetWare | symbian | dos ) \z/oxms) {
if
(
$expr
=~ s
$fix_drive_relative_paths
= 1;
}
}
if
((
$head
,
$tail
) = _parse_path(
$expr
,
$pathsep
)) {
if
(
$tail
eq
''
) {
push
@glob
,
$expr
;
next
OUTER;
}
if
(
$head
=~ / \A (?:
$q_char
)*? [*?] /oxms) {
if
(
@globdir
= _do_glob(
'd'
,
$head
)) {
push
@glob
, _do_glob(
$cond
,
map
{
"$_$pathsep$tail"
}
@globdir
);
next
OUTER;
}
}
if
(
$head
eq
''
or
$head
=~ /\A [A-Za-z]: \z/oxms) {
$head
.=
$pathsep
;
}
$expr
=
$tail
;
}
if
(
$expr
!~ / \A (?:
$q_char
)*? [*?] /oxms) {
if
(
$head
eq
'.'
) {
$head
=
''
;
}
if
(
$head
ne
''
and (
$head
=~ / \G (
$q_char
) /oxmsg)[-1] ne
$pathsep
) {
$head
.=
$pathsep
;
}
$head
.=
$expr
;
if
(
$cond
eq
'd'
) {
if
(-d
$head
) {
push
@glob
,
$head
;
}
}
else
{
if
(-e
$head
) {
push
@glob
,
$head
;
}
}
next
OUTER;
}
opendir
(
*DIR
,
$head
) or
next
OUTER;
my
@leaf
=
readdir
DIR;
closedir
DIR;
if
(
$head
eq
'.'
) {
$head
=
''
;
}
if
(
$head
ne
''
and (
$head
=~ / \G (
$q_char
) /oxmsg)[-1] ne
$pathsep
) {
$head
.=
$pathsep
;
}
my
$pattern
=
''
;
while
(
$expr
=~ / \G (
$q_char
) /oxgc) {
my
$char
= $1;
if
(
$char
eq
'*'
) {
$pattern
.=
"(?:$your_char)*"
,
}
elsif
(
$char
eq
'?'
) {
$pattern
.=
"(?:$your_char)?"
,
}
elsif
((
my
$fc
= Ecyrillic::fc(
$char
)) ne
$char
) {
$pattern
.=
$fc
;
}
else
{
$pattern
.=
quotemeta
$char
;
}
}
my
$matchsub
=
sub
{ Ecyrillic::fc(
$_
[0]) =~ /\A
$pattern
\z/xms };
INNER:
for
my
$leaf
(
@leaf
) {
if
(
$leaf
eq
'.'
or
$leaf
eq
'..'
) {
next
INNER;
}
if
(
$cond
eq
'd'
and not -d
"$head$leaf"
) {
next
INNER;
}
if
(
&$matchsub
(
$leaf
)) {
push
@matched
,
"$head$leaf"
;
next
INNER;
}
if
(Ecyrillic::
index
(
$leaf
,
'.'
) == -1 and
CORE::
length
(
$leaf
) <= 8 and
Ecyrillic::
index
(
$pattern
,
'\\.'
) != -1
) {
if
(
&$matchsub
(
"$leaf."
)) {
push
@matched
,
"$head$leaf"
;
next
INNER;
}
}
}
if
(
@matched
) {
push
@glob
,
@matched
;
}
}
if
(
$fix_drive_relative_paths
) {
for
my
$glob
(
@glob
) {
$glob
=~ s
}
}
return
@glob
;
}
sub
_parse_line {
my
(
$line
) =
@_
;
$line
.=
' '
;
my
@piece
= ();
while
(
$line
=~ /
" ( (?>(?: [^"
] )* ) ) " (?>\s+) |
( (?>(?: [^"\s] )* ) ) (?>\s+)
/oxmsg
) {
push
@piece
,
defined
($1) ? $1 : $2;
}
return
@piece
;
}
sub
_parse_path {
my
(
$path
,
$pathsep
) =
@_
;
$path
.=
'/'
;
my
@subpath
= ();
while
(
$path
=~ /
((?: [^\/\\] )+?) [\/\\]
/oxmsg
) {
push
@subpath
, $1;
}
my
$tail
=
pop
@subpath
;
my
$head
=
join
$pathsep
,
@subpath
;
return
$head
,
$tail
;
}
sub
my_home_MSWin32 {
if
(
exists
$ENV
{
'HOME'
} and
$ENV
{
'HOME'
}) {
return
$ENV
{
'HOME'
};
}
elsif
(
exists
$ENV
{
'USERPROFILE'
} and
$ENV
{
'USERPROFILE'
}) {
return
$ENV
{
'USERPROFILE'
};
}
elsif
(
exists
$ENV
{
'HOMEDRIVE'
} and
exists
$ENV
{
'HOMEPATH'
} and
$ENV
{
'HOMEDRIVE'
} and
$ENV
{
'HOMEPATH'
}) {
return
join
''
,
$ENV
{
'HOMEDRIVE'
},
$ENV
{
'HOMEPATH'
};
}
return
undef
;
}
sub
my_home {
my
$home
;
if
(
exists
$ENV
{
'HOME'
} and
defined
$ENV
{
'HOME'
}) {
$home
=
$ENV
{
'HOME'
};
}
elsif
(
exists
$ENV
{
'LOGDIR'
} and
$ENV
{
'LOGDIR'
}) {
$home
=
$ENV
{
'LOGDIR'
};
}
else
{
$home
= CORE::
eval
q{ (getpwuid($<))[7] }
;
}
if
(
defined
$home
and ! -d(
$home
)) {
$home
=
undef
;
}
return
$home
;
}
sub
Ecyrillic::PREMATCH {
return
$`;
}
sub
Ecyrillic::MATCH {
return
$&;
}
sub
Ecyrillic::POSTMATCH {
return
$';
}
sub
Cyrillic::
ord
(;$) {
local
$_
=
shift
if
@_
;
if
(/\A (
$q_char
) /oxms) {
my
@ord
=
unpack
'C*'
, $1;
my
$ord
= 0;
while
(
my
$o
=
shift
@ord
) {
$ord
=
$ord
* 0x100 +
$o
;
}
return
$ord
;
}
else
{
return
CORE::
ord
$_
;
}
}
sub
Cyrillic::ord_() {
if
(/\A (
$q_char
) /oxms) {
my
@ord
=
unpack
'C*'
, $1;
my
$ord
= 0;
while
(
my
$o
=
shift
@ord
) {
$ord
=
$ord
* 0x100 +
$o
;
}
return
$ord
;
}
else
{
return
CORE::
ord
$_
;
}
}
sub
Cyrillic::
reverse
(@) {
if
(
wantarray
) {
return
CORE::
reverse
@_
;
}
else
{
return
join
''
, CORE::
reverse
(
join
(
''
,
@_
) =~ /\G (
$q_char
) /oxmsg);
}
}
sub
Cyrillic::
getc
(;*@) {
my
(
$package
) =
caller
;
my
$fh
=
@_
? qualify_to_ref(
shift
,
$package
) : \
*STDIN
;
croak
'Too many arguments for Cyrillic::getc'
if
@_
and not
wantarray
;
my
@length
=
sort
{
$a
<=>
$b
}
keys
%range_tr
;
my
$getc
=
''
;
for
my
$length
(
$length
[0] ..
$length
[-1]) {
$getc
.= CORE::
getc
(
$fh
);
if
(
exists
$range_tr
{CORE::
length
(
$getc
)}) {
if
(
$getc
=~ /\A ${Ecyrillic::dot_s} \z/oxms) {
return
wantarray
? (
$getc
,
@_
) :
$getc
;
}
}
}
return
wantarray
? (
$getc
,
@_
) :
$getc
;
}
sub
Cyrillic::
length
(;$) {
local
$_
=
shift
if
@_
;
local
@_
= /\G (
$q_char
) /oxmsg;
return
scalar
@_
;
}
BEGIN {
CORE::
eval
sprintf
(
<<'END', ($] >= 5.014000) ? ':lvalue' : '');
# vv----------------------*******
sub Cyrillic::substr($$;$$) %s {
my @char = $_[0] =~ /\G (?>$q_char) /oxmsg;
# If the substring is beyond either end of the string, substr() returns the undefined
# value and produces a warning. When used as an lvalue, specifying a substring that
# is entirely outside the string raises an exception.
# A return with no argument returns the scalar value undef in scalar context,
# an empty list () in list context, and (naturally) nothing at all in void
# context.
my $offset = $_[1];
if (($offset > scalar(@char)) or ($offset < (-1 * scalar(@char)))) {
return;
}
# substr($string,$offset,$length,$replacement)
if (@_ == 4) {
my(undef,undef,$length,$replacement) = @_;
my $substr = join '', splice(@char, $offset, $length, $replacement);
$_[0] = join '', @char;
# return $substr; this doesn't work, don't say "return"
$substr;
}
# substr($string,$offset,$length)
elsif (@_ == 3) {
my(undef,undef,$length) = @_;
my $octet_offset = 0;
my $octet_length = 0;
if ($offset == 0) {
$octet_offset = 0;
}
elsif ($offset > 0) {
local $SIG{__WARN__} = sub {}; # avoid: Use of uninitialized value in join or string at here
$octet_offset = CORE::length(join '', @char[0..$offset-1]);
}
else {
local $SIG{__WARN__} = sub {}; # avoid: Use of uninitialized value in join or string at here
$octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
}
if ($length == 0) {
$octet_length = 0;
}
elsif ($length > 0) {
local $SIG{__WARN__} = sub {}; # avoid: Use of uninitialized value in join or string at here
$octet_length = CORE::length(join '', @char[$offset..$offset+$length-1]);
}
else {
local $SIG{__WARN__} = sub {}; # avoid: Use of uninitialized value in join or string at here
$octet_length = -1 * CORE::length(join '', @char[$#char+$length+1..$#char]);
}
CORE::substr($_[0], $octet_offset, $octet_length);
}
# substr($string,$offset)
else {
my $octet_offset = 0;
if ($offset == 0) {
$octet_offset = 0;
}
elsif ($offset > 0) {
$octet_offset = CORE::length(join '', @char[0..$offset-1]);
}
else {
$octet_offset = -1 * CORE::length(join '', @char[$#char+$offset+1..$#char]);
}
CORE::substr($_[0], $octet_offset);
}
}
END
}
sub
Cyrillic::
index
($$;$) {
my
$index
;
if
(
@_
== 3) {
$index
= Ecyrillic::
index
(
$_
[0],
$_
[1], CORE::
length
(Cyrillic::
substr
(
$_
[0], 0,
$_
[2])));
}
else
{
$index
= Ecyrillic::
index
(
$_
[0],
$_
[1]);
}
if
(
$index
== -1) {
return
-1;
}
else
{
return
Cyrillic::
length
(CORE::
substr
$_
[0], 0,
$index
);
}
}
sub
Cyrillic::
rindex
($$;$) {
my
$rindex
;
if
(
@_
== 3) {
$rindex
= Ecyrillic::
rindex
(
$_
[0],
$_
[1], CORE::
length
(Cyrillic::
substr
(
$_
[0], 0,
$_
[2])));
}
else
{
$rindex
= Ecyrillic::
rindex
(
$_
[0],
$_
[1]);
}
if
(
$rindex
== -1) {
return
-1;
}
else
{
return
Cyrillic::
length
(CORE::
substr
$_
[0], 0,
$rindex
);
}
}
use
vars
qw($slash)
;
$slash
=
'm//'
;
my
$function_ord
=
'ord'
;
my
$function_ord_
=
'ord'
;
my
$function_reverse
=
'reverse'
;
my
$function_getc
=
'getc'
;
my
$anchor
=
''
;
my
$qq_paren
=
qr{(?{local $nest=0}
) (?>(?:
[^\\()] |
\( (?{
$nest
++}) |
\) (?(?{
$nest
>0})(?{
$nest
--})|(?!)))*) (?(?{
$nest
!=0})(?!)) |
\\ [^c] |
\\c[\x40-\x5F] |
[\x00-\xFF]
}xms;
my
$qq_brace
=
qr{(?{local $nest=0}
) (?>(?:
[^\\{}] |
\{ (?{
$nest
++}) |
\} (?(?{
$nest
>0})(?{
$nest
--})|(?!)))*) (?(?{
$nest
!=0})(?!)) |
\\ [^c] |
\\c[\x40-\x5F] |
[\x00-\xFF]
}xms;
my
$qq_bracket
=
qr{(?{local $nest=0}
) (?>(?:
[^\\\[\]] |
\[ (?{
$nest
++}) |
\] (?(?{
$nest
>0})(?{
$nest
--})|(?!)))*) (?(?{
$nest
!=0})(?!)) |
\\ [^c] |
\\c[\x40-\x5F] |
[\x00-\xFF]
}xms;
my
$qq_angle
=
qr{(?{local $nest=0}
) (?>(?:
[^\\<>] |
\< (?{
$nest
++}) |
\> (?(?{
$nest
>0})(?{
$nest
--})|(?!)))*) (?(?{
$nest
!=0})(?!)) |
\\ [^c] |
\\c[\x40-\x5F] |
[\x00-\xFF]
}xms;
my
$qq_scalar
=
qr{(?: \{ (?:$qq_brace)*? \}
|
(?: ::)? (?:
(?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
(?>(?: \[ (?: \$\[ | \$\] |
$qq_char
)*? \] | \{ (?:
$qq_brace
)*? \} )*)
(?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\
))
}xms;
my
$qq_variable
=
qr{(?: \{ (?:$qq_brace)*? \}
|
(?: ::)? (?:
(?>[0-9]+) |
[^a-zA-Z_0-9\[\]] |
^[A-Z] |
(?> [a-zA-Z_][a-zA-Z_0-9]* (?: ::[a-zA-Z_][a-zA-Z_0-9]*)* )
(?>(?: \[ (?: \$\[ | \$\] |
$qq_char
)*? \] | \{ (?:
$qq_brace
)*? \} )*)
(?>(?: (?: -> )? (?: [\$\@\%\&\*]\* | \$\
))
}xms;
my
$qq_substr
=
qr{(?> Char::substr | Cyrillic::substr | CORE::substr | substr ) (?>\s*) \( $qq_paren \)
}
xms;
my
$q_paren
=
qr{(?{local $nest=0}
) (?>(?:
[^()] |
\( (?{
$nest
++}) |
\) (?(?{
$nest
>0})(?{
$nest
--})|(?!)))*) (?(?{
$nest
!=0})(?!)) |
[\x00-\xFF]
}xms;
my
$q_brace
=
qr{(?{local $nest=0}
) (?>(?:
[^\{\}] |
\{ (?{
$nest
++}) |
\} (?(?{
$nest
>0})(?{
$nest
--})|(?!)))*) (?(?{
$nest
!=0})(?!)) |
[\x00-\xFF]
}xms;
my
$q_bracket
=
qr{(?{local $nest=0}
) (?>(?:
[^\[\]] |
\[ (?{
$nest
++}) |
\] (?(?{
$nest
>0})(?{
$nest
--})|(?!)))*) (?(?{
$nest
!=0})(?!)) |
[\x00-\xFF]
}xms;
my
$q_angle
=
qr{(?{local $nest=0}
) (?>(?:
[^<>] |
\< (?{
$nest
++}) |
\> (?(?{
$nest
>0})(?{
$nest
--})|(?!)))*) (?(?{
$nest
!=0})(?!)) |
[\x00-\xFF]
}xms;
my
$matched
=
''
;
my
$s_matched
=
''
;
my
$tr_variable
=
''
;
my
$sub_variable
=
''
;
my
$bind_operator
=
''
;
my
@heredoc
= ();
my
@heredoc_delimiter
= ();
my
$here_script
=
''
;
sub
Cyrillic::escape(;$) {
local
(
$_
) =
$_
[0]
if
@_
;
study
$_
;
my
$e_script
=
''
;
while
(not /\G \z/oxgc) {
$e_script
.= Cyrillic::escape_token();
}
return
$e_script
;
}
sub
Cyrillic::escape_token {
my
$ignore_modules
=
join
(
'|'
,
qw(
utf8
bytes
charnames
I18N::Japanese
I18N::Collate
I18N::JExt
File::DosGlob
Wild
Wildcard
Japanese
)
);
if
(/\G ( \n ) /oxgc) {
my
$heredoc
=
''
;
if
(
scalar
(
@heredoc_delimiter
) >= 1) {
$slash
=
'm//'
;
$heredoc
=
join
''
,
@heredoc
;
@heredoc
= ();
for
my
$heredoc_delimiter
(
@heredoc_delimiter
) {
/\G .*? \n
$heredoc_delimiter
\n/xmsgc;
}
@heredoc_delimiter
= ();
$here_script
=
''
;
}
return
"\n"
.
$heredoc
;
}
elsif
(/\G ((?>\s+)|\
elsif
(/\G ( (?:
if
|
elsif
|
unless
|
while
|
until
|
given
|
when
) (?>\s*) \( ) /oxgc) {
$slash
=
'm//'
;
return
$1;
}
elsif
(/\G ( \( (?>\s*) (?:
local
\b |
my
\b |
our
\b | state \b )? (?>\s*) \$
$qq_scalar
) /oxgc) {
my
$e_string
= e_string($1);
if
(/\G ( (?>\s*) =
$qq_paren
\) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?:
tr
| y ) \b ) /oxgc) {
$tr_variable
=
$e_string
. e_string($1);
$bind_operator
= $2;
$slash
=
'm//'
;
return
''
;
}
elsif
(/\G ( (?>\s*) =
$qq_paren
\) ) ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
$sub_variable
=
$e_string
. e_string($1);
$bind_operator
= $2;
$slash
=
'm//'
;
return
''
;
}
else
{
$slash
=
'div'
;
return
$e_string
;
}
}
elsif
(/\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
$slash
=
'div'
;
return
q{Ecyrillic::PREMATCH()}
;
}
elsif
(/\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
$slash
=
'div'
;
return
q{Ecyrillic::MATCH()}
;
}
elsif
(/\G ( \$
' | \$\{'
\} ) /oxmsgc) {
$slash
=
'div'
;
return
$1;
}
elsif
(/\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
$slash
=
'div'
;
return
q{Ecyrillic::POSTMATCH()}
;
}
elsif
(/\G ( \$
$qq_scalar
|
$qq_substr
) /oxgc) {
my
$scalar
= e_string($1);
if
(/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= (?:
tr
| y ) \b ) /oxgc) {
$tr_variable
=
$scalar
;
$bind_operator
= $1;
$slash
=
'm//'
;
return
''
;
}
elsif
(/\G ( (?>\s*) (?: =~ | !~ ) (?>\s*) ) (?= s \b ) /oxgc) {
$sub_variable
=
$scalar
;
$bind_operator
= $1;
$slash
=
'm//'
;
return
''
;
}
else
{
$slash
=
'div'
;
return
$scalar
;
}
}
elsif
(/\G ( [,;] ) /oxgc) {
$slash
=
'm//'
;
$tr_variable
=
''
;
$sub_variable
=
''
;
$bind_operator
=
''
;
return
$1;
}
elsif
(/\G ( \{ (?>\s*) (?:
tr
|
index
|
rindex
|
reverse
) (?>\s*) \} ) /oxmsgc) {
return
$1;
}
elsif
(/\G ( \$ 0 ) /oxmsgc) {
$slash
=
'div'
;
return
$1;
}
elsif
(/\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
$slash
=
'div'
;
return
$1;
}
elsif
(/\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
$slash
=
'div'
;
return
$1;
}
elsif
(/\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
$slash
=
'div'
;
return
e_capture($1);
}
elsif
(/\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
$slash
=
'div'
;
return
e_capture($1);
}
elsif
(/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
$slash
=
'div'
;
return
e_capture($1.
'->'
.$2);
}
elsif
(/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
$slash
=
'div'
;
return
e_capture($1.
'->'
.$2);
}
elsif
(/\G \$ ( \$ (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
$slash
=
'div'
;
return
e_capture($1);
}
elsif
(/\G \$ (?>\s*) \{ ( (?>\s*) (?> [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* ) (?>\s*) ) \} /oxmsgc) {
$slash
=
'div'
;
return
'${'
. $1 .
'}'
;
}
elsif
(/\G \$ (?>\s*) \{ (?>\s*) (
$qq_brace
) (?>\s*) \} /oxmsgc) {
$slash
=
'div'
;
return
e_capture($1);
}
elsif
(/\G ( (?: [\$\@\%\&\*] | \$\
$slash
=
'div'
;
return
$1;
}
elsif
(/\G ( \$[\$\@\
$slash
=
'div'
;
return
$1;
}
elsif
(/\G \b (
while
(?>\s*) \( (?>\s*) <[\$]?[A-Za-z_][A-Za-z_0-9]*> (?>\s*) \)) \b /oxgc) {
return
$1;
}
elsif
(/\G \b
while
(?>\s*) \( (?>\s*) < ((?:[^>\0\a\e\f\n\r\t])+?) > (?>\s*) \) \b /oxgc) {
return
'while ($_ = Ecyrillic::glob("'
. $1 .
'"))'
;
}
elsif
(/\G \b
while
(?>\s*) \( (?>\s*)
glob
(?>\s*) \) /oxgc) {
return
'while ($_ = Ecyrillic::glob_)'
;
}
elsif
(/\G \b
while
(?>\s*) \( (?>\s*)
glob
\b /oxgc) {
return
'while ($_ = Ecyrillic::glob'
;
}
elsif
(/\G \b (
if
|
unless
|
while
|
until
|
for
|
when
) \b /oxgc) {
$slash
=
'm//'
;
return
$1; }
elsif
(/\G \b (CORE:: | ->(>?\s*) (?:
atan2
| [a-z]{2,})) \b /oxgc) {
$slash
=
'm//'
;
return
$1; }
elsif
(/\G \b Char::
eval
(?= (?>\s*) \{ ) /oxgc) {
$slash
=
'm//'
;
return
'eval'
; }
elsif
(/\G \b Cyrillic::
eval
(?= (?>\s*) \{ ) /oxgc) {
$slash
=
'm//'
;
return
'eval'
; }
elsif
(/\G \b Char::
eval
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'eval Char::escape'
; }
elsif
(/\G \b Cyrillic::
eval
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'eval Cyrillic::escape'
; }
elsif
(/\G \b bytes::
substr
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'substr'
; }
elsif
(/\G \b
chop
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'Ecyrillic::chop'
; }
elsif
(/\G \b bytes::
index
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'index'
; }
elsif
(/\G \b Char::
index
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'Char::index'
; }
elsif
(/\G \b Cyrillic::
index
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'Cyrillic::index'
; }
elsif
(/\G \b
index
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'Ecyrillic::index'
; }
elsif
(/\G \b bytes::
rindex
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'rindex'
; }
elsif
(/\G \b Char::
rindex
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'Char::rindex'
; }
elsif
(/\G \b Cyrillic::
rindex
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'Cyrillic::rindex'
; }
elsif
(/\G \b
rindex
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'Ecyrillic::rindex'
; }
elsif
(/\G \b
lc
(?= (?>\s+)[A-Za-z_]|(?>\s*)[
'"`\$\@\&\*\(]) /oxgc) { $slash = '
m//
'; return '
Ecyrillic::
lc
'; }
elsif
(/\G \b
lcfirst
(?= (?>\s+)[A-Za-z_]|(?>\s*)[
'"`\$\@\&\*\(]) /oxgc) { $slash = '
m//
'; return '
Ecyrillic::
lcfirst
'; }
elsif
(/\G \b
uc
(?= (?>\s+)[A-Za-z_]|(?>\s*)[
'"`\$\@\&\*\(]) /oxgc) { $slash = '
m//
'; return '
Ecyrillic::
uc
'; }
elsif
(/\G \b
ucfirst
(?= (?>\s+)[A-Za-z_]|(?>\s*)[
'"`\$\@\&\*\(]) /oxgc) { $slash = '
m//
'; return '
Ecyrillic::
ucfirst
'; }
elsif
(/\G \b fc (?= (?>\s+)[A-Za-z_]|(?>\s*)[
'"`\$\@\&\*\(]) /oxgc) { $slash = '
m//
'; return '
Ecyrillic::fc'; }
elsif
(/\G -s (?>\s*) (\") ((?:
$qq_char
)+?) (\") /oxgc) {
$slash
=
'm//'
;
return
'-s '
. e_qq(
''
, $1,$3,$2); }
elsif
(/\G -s (?>\s+)
qq (?>\s*)
(\
elsif
(/\G -s (?>\s+) qq (?>\s*) (\() ((?:
$qq_paren
)+?) (\)) /oxgc) {
$slash
=
'm//'
;
return
'-s '
. e_qq(
'qq'
,$1,$3,$2); }
elsif
(/\G -s (?>\s+) qq (?>\s*) (\{) ((?:
$qq_brace
)+?) (\}) /oxgc) {
$slash
=
'm//'
;
return
'-s '
. e_qq(
'qq'
,$1,$3,$2); }
elsif
(/\G -s (?>\s+) qq (?>\s*) (\[) ((?:
$qq_bracket
)+?) (\]) /oxgc) {
$slash
=
'm//'
;
return
'-s '
. e_qq(
'qq'
,$1,$3,$2); }
elsif
(/\G -s (?>\s+) qq (?>\s*) (\<) ((?:
$qq_angle
)+?) (\>) /oxgc) {
$slash
=
'm//'
;
return
'-s '
. e_qq(
'qq'
,$1,$3,$2); }
elsif
(/\G -s (?>\s+) qq (?>\s*) (\S) ((?:
$qq_char
)+?) (\1) /oxgc) {
$slash
=
'm//'
;
return
'-s '
. e_qq(
'qq'
,$1,$3,$2); }
elsif
(/\G -s (?>\s*) (\
') ((?:\\\'|\\\\|$q_char)+?) (\') /oxgc) { $slash = '
m//
'; return '
-s
' . e_q ('
', $1,$3,$2); }
elsif
(/\G -s (?>\s+)
q
(?>\s*) (\
elsif
(/\G -s (?>\s+) q (?>\s*) (\() ((?:\\\)|\\\\|
$q_paren
)+?) (\)) /oxgc) {
$slash
=
'm//'
;
return
'-s '
. e_q (
'q'
, $1,$3,$2); }
elsif
(/\G -s (?>\s+) q (?>\s*) (\{) ((?:\\\}|\\\\|
$q_brace
)+?) (\}) /oxgc) {
$slash
=
'm//'
;
return
'-s '
. e_q (
'q'
, $1,$3,$2); }
elsif
(/\G -s (?>\s+) q (?>\s*) (\[) ((?:\\\]|\\\\|
$q_bracket
)+?) (\]) /oxgc) {
$slash
=
'm//'
;
return
'-s '
. e_q (
'q'
, $1,$3,$2); }
elsif
(/\G -s (?>\s+) q (?>\s*) (\<) ((?:\\\>|\\\\|
$q_angle
)+?) (\>) /oxgc) {
$slash
=
'm//'
;
return
'-s '
. e_q (
'q'
, $1,$3,$2); }
elsif
(/\G -s (?>\s+) q (?>\s*) (\S) ((?:\\\1|\\\\|
$q_char
)+?) (\1) /oxgc) {
$slash
=
'm//'
;
return
'-s '
. e_q (
'q'
, $1,$3,$2); }
elsif
(/\G -s (?>\s*) (\$ (?> \w+ (?: ::\w+)* ) (?: (?: ->)? (?: [\$\@\%\&\*]\* | \$\
{
$slash
=
'm//'
;
return
"-s $1"
; }
elsif
(/\G -s (?>\s*) \( ((?:
$qq_paren
)*?) \) /oxgc) {
$slash
=
'm//'
;
return
"-s ($1)"
; }
elsif
(/\G -s (?= (?>\s+) [a-z]+) /oxgc) {
$slash
=
'm//'
;
return
'-s'
; }
elsif
(/\G -s (?>\s+) ((?>\w+)) /oxgc) {
$slash
=
'm//'
;
return
"-s $1"
; }
elsif
(/\G \b bytes::
length
(?= (?>\s+)[A-Za-z_]|(?>\s*)[
'"`\$\@\&\*\(]) /oxgc) { $slash = '
m//
'; return '
length
'; }
elsif
(/\G \b bytes::
chr
(?= (?>\s+)[A-Za-z_]|(?>\s*)[
'"`\$\@\&\*\(]) /oxgc) { $slash = '
m//
'; return '
chr
'; }
elsif
(/\G \b
chr
(?= (?>\s+)[A-Za-z_]|(?>\s*)[
'"`\$\@\&\*\(]) /oxgc) { $slash = '
m//
'; return '
Ecyrillic::
chr
'; }
elsif
(/\G \b bytes::
ord
(?= (?>\s+)[A-Za-z_]|(?>\s*)[
'"`\$\@\&\*\(]) /oxgc) { $slash = '
div
'; return '
ord
'; }
elsif
(/\G \b
ord
(?= (?>\s+)[A-Za-z_]|(?>\s*)[
'"`\$\@\&\*\(]) /oxgc) { $slash = '
div';
return
$function_ord
; }
elsif
(/\G \b
glob
(?= (?>\s+)[A-Za-z_]|(?>\s*)[
'"`\$\@\&\*\(]) /oxgc) { $slash = '
m//
'; return '
Ecyrillic::
glob
'; }
elsif
(/\G \b
lc
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'Ecyrillic::lc_'
; }
elsif
(/\G \b
lcfirst
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'Ecyrillic::lcfirst_'
; }
elsif
(/\G \b
uc
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'Ecyrillic::uc_'
; }
elsif
(/\G \b
ucfirst
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'Ecyrillic::ucfirst_'
; }
elsif
(/\G \b fc \b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'Ecyrillic::fc_'
; }
elsif
(/\G -s \b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'-s '
; }
elsif
(/\G \b bytes::
length
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'length'
; }
elsif
(/\G \b bytes::
chr
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'chr'
; }
elsif
(/\G \b
chr
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'Ecyrillic::chr_'
; }
elsif
(/\G \b bytes::
ord
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'div'
;
return
'ord'
; }
elsif
(/\G \b
ord
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'div'
;
return
$function_ord_
; }
elsif
(/\G \b
glob
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
'Ecyrillic::glob_'
; }
elsif
(/\G \b
reverse
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
$function_reverse
; }
elsif
(/\G \b
getc
\b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
return
$function_getc
; }
elsif
(/\G \b (
split
) \b (?! (?>\s*) => ) /oxgc) {
$slash
=
'm//'
;
my
$e
=
''
;
while
(/\G ( (?>\s+) | \( | \
$e
.= $1;
}
if
(/\G (?= [,;\)\}\]] ) /oxgc) {
return
'Ecyrillic::split'
.
$e
; }
elsif
(/\G ( [\$\@\&\*]
$qq_scalar
) /oxgc) {
return
'Ecyrillic::split'
.
$e
. e_string($1); }
elsif
(/\G \b
qq
(\
elsif
(/\G \b
qq ((?>\s*))
(\() [ ] (\)) /oxgc) {
return
'Ecyrillic::split'
.
$e
.
qq{$1qq$2 $3}
; }
elsif
(/\G \b
qq ((?>\s*))
(\{) [ ] (\}) /oxgc) {
return
'Ecyrillic::split'
.
$e
.
qq{$1qq$2 $3}
; }
elsif
(/\G \b
qq ((?>\s*))
(\[) [ ] (\]) /oxgc) {
return
'Ecyrillic::split'
.
$e
.
qq{$1qq$2 $3}
; }
elsif
(/\G \b
qq ((?>\s*))
(\<) [ ] (\>) /oxgc) {
return
'Ecyrillic::split'
.
$e
.
qq{$1qq$2 $3}
; }
elsif
(/\G \b
qq ((?>\s*))
(\S) [ ] (\2) /oxgc) {
return
'Ecyrillic::split'
.
$e
.
qq{$1qq$2 $3}
; }
elsif
(/\G \b
q
(\
elsif
(/\G \b
q
((?>\s*)) (\() [ ] (\)) /oxgc) {
return
'Ecyrillic::split'
.
$e
.
qq {$1q$2
$3}; }
elsif
(/\G \b
q
((?>\s*)) (\{) [ ] (\}) /oxgc) {
return
'Ecyrillic::split'
.
$e
.
qq {$1q$2
$3}; }
elsif
(/\G \b
q
((?>\s*)) (\[) [ ] (\]) /oxgc) {
return
'Ecyrillic::split'
.
$e
.
qq {$1q$2
$3}; }
elsif
(/\G \b
q
((?>\s*)) (\<) [ ] (\>) /oxgc) {
return
'Ecyrillic::split'
.
$e
.
qq {$1q$2
$3}; }
elsif
(/\G \b
q
((?>\s*)) (\S) [ ] (\2) /oxgc) {
return
'Ecyrillic::split'
.
$e
.
qq {$1q$2
$3}; }
elsif
(/\G
' [ ] '
/oxgc) {
return
'Ecyrillic::split'
.
$e
.
qq
{
' '
}; }
elsif
(/\G
" [ ] "
/oxgc) {
return
'Ecyrillic::split'
.
$e
.
qq
{
" "
}; }
elsif
(/\G \b (
qq) \b /oxgc)
{
if
(/\G (\
else
{
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) /oxgc) {
return
e_split(
$e
.
'qr'
,$1,$3,$2,
''
); }
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) /oxgc) {
return
e_split(
$e
.
'qr'
,$1,$3,$2,
''
); }
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) /oxgc) {
return
e_split(
$e
.
'qr'
,$1,$3,$2,
''
); }
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) /oxgc) {
return
e_split(
$e
.
'qr'
,$1,$3,$2,
''
); }
elsif
(/\G ([*\-:?\\^|]) ((?:
$qq_char
)*?) (\1) /oxgc) {
return
e_split(
$e
.
'qr'
,
'{'
,
'}'
,$2,
''
); }
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) /oxgc) {
return
e_split(
$e
.
'qr'
,$1,$3,$2,
''
); }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
}
elsif
(/\G \b (
qr) \b /oxgc)
{
if
(/\G (\
else
{
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) ([imosxpadlunbB]*) /oxgc) {
return
e_split (
$e
.
'qr'
,$1, $3, $2,$4); }
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) ([imosxpadlunbB]*) /oxgc) {
return
e_split (
$e
.
'qr'
,$1, $3, $2,$4); }
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) ([imosxpadlunbB]*) /oxgc) {
return
e_split (
$e
.
'qr'
,$1, $3, $2,$4); }
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) ([imosxpadlunbB]*) /oxgc) {
return
e_split (
$e
.
'qr'
,$1, $3, $2,$4); }
elsif
(/\G (\
') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return e_split_q($e.'
qr',$1, $3, $2,$4); } # qr '
'
elsif
(/\G ([*\-:?\\^|]) ((?:
$qq_char
)*?) (\1) ([imosxpadlunbB]*) /oxgc) {
return
e_split (
$e
.
'qr'
,
'{'
,
'}'
,$2,$4); }
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) ([imosxpadlunbB]*) /oxgc) {
return
e_split (
$e
.
'qr'
,$1, $3, $2,$4); }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
}
elsif
(/\G \b (
q) \b /oxgc)
{
if
(/\G (\
else
{
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:\\\\|\\\)|\\\(|
$q_paren
)*?) (\)) /oxgc) {
return
e_split_q(
$e
.
'qr'
,$1,$3,$2,
''
); }
elsif
(/\G (\{) ((?:\\\\|\\\}|\\\{|
$q_brace
)*?) (\}) /oxgc) {
return
e_split_q(
$e
.
'qr'
,$1,$3,$2,
''
); }
elsif
(/\G (\[) ((?:\\\\|\\\]|\\\[|
$q_bracket
)*?) (\]) /oxgc) {
return
e_split_q(
$e
.
'qr'
,$1,$3,$2,
''
); }
elsif
(/\G (\<) ((?:\\\\|\\\>|\\\<|
$q_angle
)*?) (\>) /oxgc) {
return
e_split_q(
$e
.
'qr'
,$1,$3,$2,
''
); }
elsif
(/\G ([*\-:?\\^|]) ((?:
$q_char
)*?) (\1) /oxgc) {
return
e_split_q(
$e
.
'qr'
,
'{'
,
'}'
,$2,
''
); }
elsif
(/\G (\S) ((?:\\\\|\\\1|
$q_char
)*?) (\1) /oxgc) {
return
e_split_q(
$e
.
'qr'
,$1,$3,$2,
''
); }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
}
elsif
(/\G \b (m) \b /oxgc) {
if
(/\G (\
else
{
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) {
return
e_split (
$e
.
'qr'
,$1, $3, $2,$4); }
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) {
return
e_split (
$e
.
'qr'
,$1, $3, $2,$4); }
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) {
return
e_split (
$e
.
'qr'
,$1, $3, $2,$4); }
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) {
return
e_split (
$e
.
'qr'
,$1, $3, $2,$4); }
elsif
(/\G (\
') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return e_split_q($e.'
qr',$1, $3, $2,$4); } # m '
' --> qr '
'
elsif
(/\G ([*\-:?\\^|]) ((?:
$qq_char
)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) {
return
e_split (
$e
.
'qr'
,
'{'
,
'}'
,$2,$4); }
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) {
return
e_split (
$e
.
'qr'
,$1, $3, $2,$4); }
}
die
__FILE__,
": Search pattern not terminated\n"
;
}
}
elsif
(/\G (\') /oxgc) {
my
$q_string
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\\\
') /oxgc) { $q_string .= $1; } # splitqr'
' --> split qr'
'
elsif
(/\G \
' /oxgc) { return e_split_q($e.q{ qr},"'
",
"'"
,
$q_string
,'
'); } # '
' --> qr '
'
elsif
(/\G (
$q_char
) /oxgc) {
$q_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
elsif
(/\G (\") /oxgc) {
my
$qq_string
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$qq_string
.= $1; }
elsif
(/\G (\\\
") /oxgc) { $qq_string .= $1; } # splitqr"
" --> split qr"
"
elsif
(/\G \
" /oxgc) { return e_split($e.q{ qr},'"
',
'"'
,
$qq_string
,
''
); }
elsif
(/\G (
$q_char
) /oxgc) {
$qq_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
elsif
(/\G (\/) /oxgc) {
my
$regexp
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$regexp
.= $1; }
elsif
(/\G (\\\/) /oxgc) {
$regexp
.= $1; }
elsif
(/\G \/ ([cgimosxpadlunbB]*) /oxgc) {
return
e_split(
$e
.
q{ qr}
,
'/'
,
'/'
,
$regexp
,$1); }
elsif
(/\G (
$q_char
) /oxgc) {
$regexp
.= $1; }
}
die
__FILE__,
": Search pattern not terminated\n"
;
}
}
elsif
(/\G \b (
tr
| y ) \b /oxgc) {
my
$ope
= $1;
if
(/\G (\
my
@tr
= (
$tr_variable
,$2);
return
e_tr(
@tr
,
''
,$4,$6);
}
else
{
my
$e
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) /oxgc) {
my
@tr
= (
$tr_variable
,$2);
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
}
die
__FILE__,
": Transliteration replacement not terminated\n"
;
}
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) /oxgc) {
my
@tr
= (
$tr_variable
,$2);
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
}
die
__FILE__,
": Transliteration replacement not terminated\n"
;
}
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) /oxgc) {
my
@tr
= (
$tr_variable
,$2);
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
}
die
__FILE__,
": Transliteration replacement not terminated\n"
;
}
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) /oxgc) {
my
@tr
= (
$tr_variable
,$2);
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) ([cdsrbB]*) /oxgc) {
return
e_tr(
@tr
,
$e
,$2,$4); }
}
die
__FILE__,
": Transliteration replacement not terminated\n"
;
}
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) ((?:
$qq_char
)*?) (\1) ([cdsrbB]*) /oxgc) {
my
@tr
= (
$tr_variable
,$2);
return
e_tr(
@tr
,
''
,$4,$6);
}
}
die
__FILE__,
": Transliteration pattern not terminated\n"
;
}
}
elsif
(/\G \b (
qq) \b /oxgc)
{
my
$ope
= $1;
if
(/\G (\
my
$qq_string
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$qq_string
.= $1; }
elsif
(/\G (\\\
elsif
(/\G (\
elsif
(/\G (
$qq_char
) /oxgc) {
$qq_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
else
{
my
$e
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() /oxgc) {
my
$qq_string
=
''
;
local
$nest
= 1;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$qq_string
.= $1; }
elsif
(/\G (\\\)) /oxgc) {
$qq_string
.= $1; }
elsif
(/\G (\() /oxgc) {
$qq_string
.= $1;
$nest
++; }
elsif
(/\G (\)) /oxgc) {
if
(--
$nest
== 0) {
return
$e
. e_qq(
$ope
,
'('
,
')'
,
$qq_string
); }
else
{
$qq_string
.= $1; }
}
elsif
(/\G (
$qq_char
) /oxgc) {
$qq_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
elsif
(/\G (\{) /oxgc) {
my
$qq_string
=
''
;
local
$nest
= 1;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$qq_string
.= $1; }
elsif
(/\G (\\\}) /oxgc) {
$qq_string
.= $1; }
elsif
(/\G (\{) /oxgc) {
$qq_string
.= $1;
$nest
++; }
elsif
(/\G (\}) /oxgc) {
if
(--
$nest
== 0) {
return
$e
. e_qq(
$ope
,
'{'
,
'}'
,
$qq_string
); }
else
{
$qq_string
.= $1; }
}
elsif
(/\G (
$qq_char
) /oxgc) {
$qq_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
elsif
(/\G (\[) /oxgc) {
my
$qq_string
=
''
;
local
$nest
= 1;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$qq_string
.= $1; }
elsif
(/\G (\\\]) /oxgc) {
$qq_string
.= $1; }
elsif
(/\G (\[) /oxgc) {
$qq_string
.= $1;
$nest
++; }
elsif
(/\G (\]) /oxgc) {
if
(--
$nest
== 0) {
return
$e
. e_qq(
$ope
,
'['
,
']'
,
$qq_string
); }
else
{
$qq_string
.= $1; }
}
elsif
(/\G (
$qq_char
) /oxgc) {
$qq_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
elsif
(/\G (\<) /oxgc) {
my
$qq_string
=
''
;
local
$nest
= 1;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$qq_string
.= $1; }
elsif
(/\G (\\\>) /oxgc) {
$qq_string
.= $1; }
elsif
(/\G (\<) /oxgc) {
$qq_string
.= $1;
$nest
++; }
elsif
(/\G (\>) /oxgc) {
if
(--
$nest
== 0) {
return
$e
. e_qq(
$ope
,
'<'
,
'>'
,
$qq_string
); }
else
{
$qq_string
.= $1; }
}
elsif
(/\G (
$qq_char
) /oxgc) {
$qq_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
elsif
(/\G (\S) /oxgc) {
my
$delimiter
= $1;
my
$qq_string
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$qq_string
.= $1; }
elsif
(/\G (\\\Q
$delimiter
\E) /oxgc) {
$qq_string
.= $1; }
elsif
(/\G (\Q
$delimiter
\E) /oxgc) {
return
$e
. e_qq(
$ope
,
$delimiter
,
$delimiter
,
$qq_string
); }
elsif
(/\G (
$qq_char
) /oxgc) {
$qq_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
}
elsif
(/\G \b (
qr) \b /oxgc)
{
my
$ope
= $1;
if
(/\G (\
return
e_qr(
$ope
,$1,$3,$2,$4);
}
else
{
my
$e
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) ([imosxpadlunbB]*) /oxgc) {
return
$e
. e_qr (
$ope
,$1, $3, $2,$4); }
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) ([imosxpadlunbB]*) /oxgc) {
return
$e
. e_qr (
$ope
,$1, $3, $2,$4); }
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) ([imosxpadlunbB]*) /oxgc) {
return
$e
. e_qr (
$ope
,$1, $3, $2,$4); }
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) ([imosxpadlunbB]*) /oxgc) {
return
$e
. e_qr (
$ope
,$1, $3, $2,$4); }
elsif
(/\G (\
') ((?:$qq_char)*?) (\') ([imosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # qr '
'
elsif
(/\G ([*\-:?\\^|]) ((?:
$qq_char
)*?) (\1) ([imosxpadlunbB]*) /oxgc) {
return
$e
. e_qr (
$ope
,
'{'
,
'}'
,$2,$4); }
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) ([imosxpadlunbB]*) /oxgc) {
return
$e
. e_qr (
$ope
,$1, $3, $2,$4); }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
}
elsif
(/\G \b (
qw) \b /oxgc)
{
my
$ope
= $1;
if
(/\G (\
return
e_qw(
$ope
,$1,$3,$2);
}
else
{
my
$e
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ([^(]*?) (\)) /oxmsgc) {
return
$e
. e_qw(
$ope
,$1,$3,$2); }
elsif
(/\G (\() ((?:
$q_paren
)*?) (\)) /oxmsgc) {
return
$e
. e_qw(
$ope
,$1,$3,$2); }
elsif
(/\G (\{) ([^{]*?) (\}) /oxmsgc) {
return
$e
. e_qw(
$ope
,$1,$3,$2); }
elsif
(/\G (\{) ((?:
$q_brace
)*?) (\}) /oxmsgc) {
return
$e
. e_qw(
$ope
,$1,$3,$2); }
elsif
(/\G (\[) ([^[]*?) (\]) /oxmsgc) {
return
$e
. e_qw(
$ope
,$1,$3,$2); }
elsif
(/\G (\[) ((?:
$q_bracket
)*?) (\]) /oxmsgc) {
return
$e
. e_qw(
$ope
,$1,$3,$2); }
elsif
(/\G (\<) ([^<]*?) (\>) /oxmsgc) {
return
$e
. e_qw(
$ope
,$1,$3,$2); }
elsif
(/\G (\<) ((?:
$q_angle
)*?) (\>) /oxmsgc) {
return
$e
. e_qw(
$ope
,$1,$3,$2); }
elsif
(/\G ([\x21-\x3F]) (.*?) (\1) /oxmsgc) {
return
$e
. e_qw(
$ope
,$1,$3,$2); }
elsif
(/\G (\S) ((?:
$q_char
)*?) (\1) /oxmsgc) {
return
$e
. e_qw(
$ope
,$1,$3,$2); }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
}
elsif
(/\G \b (
qx) \b /oxgc)
{
my
$ope
= $1;
if
(/\G (\
return
e_qq(
$ope
,$1,$3,$2);
}
else
{
my
$e
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) /oxgc) {
return
$e
. e_qq(
$ope
,$1,$3,$2); }
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) /oxgc) {
return
$e
. e_qq(
$ope
,$1,$3,$2); }
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) /oxgc) {
return
$e
. e_qq(
$ope
,$1,$3,$2); }
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) /oxgc) {
return
$e
. e_qq(
$ope
,$1,$3,$2); }
elsif
(/\G (\
') ((?:$qq_char)*?) (\') /oxgc) { return $e . e_q ($ope,$1,$3,$2); } # qx '
'
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) /oxgc) {
return
$e
. e_qq(
$ope
,$1,$3,$2); }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
}
elsif
(/\G \b (
q) \b /oxgc)
{
my
$ope
= $1;
if
(/\G (\
my
$q_string
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\\\
elsif
(/\G (\
elsif
(/\G (
$q_char
) /oxgc) {
$q_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
else
{
my
$e
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() /oxgc) {
my
$q_string
=
''
;
local
$nest
= 1;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\\\)) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\\\() /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\() /oxgc) {
$q_string
.= $1;
$nest
++; }
elsif
(/\G (\)) /oxgc) {
if
(--
$nest
== 0) {
return
$e
. e_q(
$ope
,
'('
,
')'
,
$q_string
); }
else
{
$q_string
.= $1; }
}
elsif
(/\G (
$q_char
) /oxgc) {
$q_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
elsif
(/\G (\{) /oxgc) {
my
$q_string
=
''
;
local
$nest
= 1;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\\\}) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\\\{) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\{) /oxgc) {
$q_string
.= $1;
$nest
++; }
elsif
(/\G (\}) /oxgc) {
if
(--
$nest
== 0) {
return
$e
. e_q(
$ope
,
'{'
,
'}'
,
$q_string
); }
else
{
$q_string
.= $1; }
}
elsif
(/\G (
$q_char
) /oxgc) {
$q_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
elsif
(/\G (\[) /oxgc) {
my
$q_string
=
''
;
local
$nest
= 1;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\\\]) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\\\[) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\[) /oxgc) {
$q_string
.= $1;
$nest
++; }
elsif
(/\G (\]) /oxgc) {
if
(--
$nest
== 0) {
return
$e
. e_q(
$ope
,
'['
,
']'
,
$q_string
); }
else
{
$q_string
.= $1; }
}
elsif
(/\G (
$q_char
) /oxgc) {
$q_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
elsif
(/\G (\<) /oxgc) {
my
$q_string
=
''
;
local
$nest
= 1;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\\\>) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\\\<) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\<) /oxgc) {
$q_string
.= $1;
$nest
++; }
elsif
(/\G (\>) /oxgc) {
if
(--
$nest
== 0) {
return
$e
. e_q(
$ope
,
'<'
,
'>'
,
$q_string
); }
else
{
$q_string
.= $1; }
}
elsif
(/\G (
$q_char
) /oxgc) {
$q_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
elsif
(/\G (\S) /oxgc) {
my
$delimiter
= $1;
my
$q_string
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\\\Q
$delimiter
\E) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\Q
$delimiter
\E) /oxgc) {
return
$e
. e_q(
$ope
,
$delimiter
,
$delimiter
,
$q_string
); }
elsif
(/\G (
$q_char
) /oxgc) {
$q_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
}
elsif
(/\G \b (m) \b /oxgc) {
my
$ope
= $1;
if
(/\G (\
return
e_qr(
$ope
,$1,$3,$2,$4);
}
else
{
my
$e
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) ([cgimosxpadlunbB]*) /oxgc) {
return
$e
. e_qr (
$ope
,$1, $3, $2,$4); }
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) ([cgimosxpadlunbB]*) /oxgc) {
return
$e
. e_qr (
$ope
,$1, $3, $2,$4); }
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) ([cgimosxpadlunbB]*) /oxgc) {
return
$e
. e_qr (
$ope
,$1, $3, $2,$4); }
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) ([cgimosxpadlunbB]*) /oxgc) {
return
$e
. e_qr (
$ope
,$1, $3, $2,$4); }
elsif
(/\G (\?) ((?:
$qq_char
)*?) (\?) ([cgimosxpadlunbB]*) /oxgc) {
return
$e
. e_qr (
$ope
,$1, $3, $2,$4); }
elsif
(/\G (\
') ((?:$qq_char)*?) (\') ([cgimosxpadlunbB]*) /oxgc) { return $e . e_qr_q($ope,$1, $3, $2,$4); } # m '
'
elsif
(/\G ([*\-:\\^|]) ((?:
$qq_char
)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) {
return
$e
. e_qr (
$ope
,
'{'
,
'}'
,$2,$4); }
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) ([cgimosxpadlunbB]*) /oxgc) {
return
$e
. e_qr (
$ope
,$1, $3, $2,$4); }
}
die
__FILE__,
": Search pattern not terminated\n"
;
}
}
elsif
(/\G \b (s) \b /oxgc) {
my
$ope
= $1;
if
(/\G (\
return
e_sub(
$sub_variable
,$1,$2,$3,$3,$4,$5,$6);
}
else
{
my
$e
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) /oxgc) {
my
@s
= ($1,$2,$3);
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\') ((?:
$qq_char
)*?) (\') ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\$) ((?:
$qq_char
)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\:) ((?:
$qq_char
)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\@) ((?:
$qq_char
)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
}
die
__FILE__,
": Substitution replacement not terminated\n"
;
}
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) /oxgc) {
my
@s
= ($1,$2,$3);
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\') ((?:
$qq_char
)*?) (\') ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\$) ((?:
$qq_char
)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\:) ((?:
$qq_char
)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\@) ((?:
$qq_char
)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
}
die
__FILE__,
": Substitution replacement not terminated\n"
;
}
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) /oxgc) {
my
@s
= ($1,$2,$3);
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\') ((?:
$qq_char
)*?) (\') ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\$) ((?:
$qq_char
)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
}
die
__FILE__,
": Substitution replacement not terminated\n"
;
}
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) /oxgc) {
my
@s
= ($1,$2,$3);
while
(not /\G \z/oxgc) {
if
(/\G ((?>\s+)|\
elsif
(/\G (\() ((?:
$qq_paren
)*?) (\)) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\{) ((?:
$qq_brace
)*?) (\}) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\[) ((?:
$qq_bracket
)*?) (\]) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\<) ((?:
$qq_angle
)*?) (\>) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\') ((?:
$qq_char
)*?) (\') ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\$) ((?:
$qq_char
)*?) (\$) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\:) ((?:
$qq_char
)*?) (\:) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\@) ((?:
$qq_char
)*?) (\@) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
@s
,$1,$2,$3,$4); }
}
die
__FILE__,
": Substitution replacement not terminated\n"
;
}
elsif
(/\G (\') ((?:
$qq_char
)*?) (\') ((?:
$qq_char
)*?) (\') ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,$1,$2,$3,$3,$4,$5,$6);
}
elsif
(/\G ([*\-:?\\^|]) ((?:
$qq_char
)*?) (\1) ((?:
$qq_char
)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,
'{'
,$2,
'}'
,
'{'
,$4,
'}'
,$6);
}
elsif
(/\G (\$) ((?:
$qq_char
)*?) (\1) ((?:
$qq_char
)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,$1,$2,$3,$3,$4,$5,$6);
}
elsif
(/\G (\S) ((?:
$qq_char
)*?) (\1) ((?:
$qq_char
)*?) (\1) ([cegimosxpradlunbB]*) /oxgc) {
return
e_sub(
$sub_variable
,$1,$2,$3,$3,$4,$5,$6);
}
}
die
__FILE__,
": Substitution pattern not terminated\n"
;
}
}
elsif
(/\G \b
require
((?>\s+) (?:
$ignore_modules
) .*? ;) ([ \t]* [
elsif
(/\G \b
require
((?>\s+) (?:
$ignore_modules
) .*? ;) ([ \t]* [^
elsif
(/\G \b
require
((?>\s+) (?:
$ignore_modules
)) \b /oxmsgc) {
return
"# require$1"
; }
elsif
(/\G \b
use
((?>\s+) strict .*? ;) ([ \t]* [
elsif
(/\G \b
use
((?>\s+) strict .*? ;) ([ \t]* [^
elsif
(/\G \b
use
((?>\s+) strict) \b /oxmsgc) {
return
"use$1; no strict qw(refs)"
; }
elsif
(/\G \b
use
(?>\s+) ((?>([1-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
if
(($2 >= 6) or (($2 == 5) and ($3 ge
'012'
))) {
return
"use $1; no strict qw(refs);"
;
}
else
{
return
"use $1;"
;
}
}
elsif
(/\G \b
use
(?>\s+) ((?>v([0-9][0-9_]*)(?:\.([0-9_]+))*)) (?>\s*) ; /oxmsgc) {
if
(($2 >= 6) or (($2 == 5) and ($3 >= 12))) {
return
"use $1; no strict qw(refs);"
;
}
else
{
return
"use $1;"
;
}
}
elsif
(/\G \b
use
((?>\s+) (?:
$ignore_modules
) .*? ;) ([ \t]* [
elsif
(/\G \b
use
((?>\s+) (?:
$ignore_modules
) .*? ;) ([ \t]* [^
elsif
(/\G \b
use
((?>\s+) (?:
$ignore_modules
)) \b /oxmsgc) {
return
"# use$1"
; }
elsif
(/\G \b
no
((?>\s+) (?:
$ignore_modules
) .*? ;) ([ \t]* [
elsif
(/\G \b
no
((?>\s+) (?:
$ignore_modules
) .*? ;) ([ \t]* [^
elsif
(/\G \b
no
((?>\s+) (?:
$ignore_modules
)) \b /oxmsgc) {
return
"# no$1"
; }
elsif
(/\G \b
use
\b /oxmsgc) {
return
"use"
; }
elsif
(/\G \b
no
\b /oxmsgc) {
return
"no"
; }
elsif
(/\G (?<![\w\$\@\%\&\*]) (\') /oxgc) {
my
$q_string
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$q_string
.= $1; }
elsif
(/\G (\\\') /oxgc) {
$q_string
.= $1; }
elsif
(/\G \
' /oxgc) { return e_q('
', "'
",
"'"
,
$q_string
); }
elsif
(/\G (
$q_char
) /oxgc) {
$q_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
elsif
(/\G (\") /oxgc) {
my
$qq_string
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$qq_string
.= $1; }
elsif
(/\G (\\\") /oxgc) {
$qq_string
.= $1; }
elsif
(/\G \
" /oxgc) { return e_qq('', '"
',
'"'
,
$qq_string
); }
elsif
(/\G (
$q_char
) /oxgc) {
$qq_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
elsif
(/\G (\`) /oxgc) {
my
$qx_string
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$qx_string
.= $1; }
elsif
(/\G (\\\`) /oxgc) {
$qx_string
.= $1; }
elsif
(/\G \` /oxgc) {
return
e_qq(
''
,
'`'
,
'`'
,
$qx_string
); }
elsif
(/\G (
$q_char
) /oxgc) {
$qx_string
.= $1; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
elsif
((
$slash
eq
'm//'
) and /\G (\/) /oxgc) {
my
$regexp
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$regexp
.= $1; }
elsif
(/\G (\\\/) /oxgc) {
$regexp
.= $1; }
elsif
(/\G \/ ([cgimosxpadlunbB]*) /oxgc) {
return
e_qr(
''
,
'/'
,
'/'
,
$regexp
,$1); }
elsif
(/\G (
$q_char
) /oxgc) {
$regexp
.= $1; }
}
die
__FILE__,
": Search pattern not terminated\n"
;
}
elsif
((
$slash
eq
'm//'
) and /\G (\?) /oxgc) {
my
$regexp
=
''
;
while
(not /\G \z/oxgc) {
if
(/\G (\\\\) /oxgc) {
$regexp
.= $1; }
elsif
(/\G (\\\?) /oxgc) {
$regexp
.= $1; }
elsif
(/\G \? ([cgimosxpadlunbB]*) /oxgc) {
return
e_qr(
'm'
,
'?'
,
'?'
,
$regexp
,$1); }
elsif
(/\G (
$q_char
) /oxgc) {
$regexp
.= $1; }
}
die
__FILE__,
": Search pattern not terminated\n"
;
}
elsif
(/\G ( <<>> ) /oxgc) {
$slash
=
'm//'
;
return
$1; }
elsif
(/\G ( << (?>\s*) ) (?= [0-9\$\@\&] ) /oxgc) {
$slash
=
'm//'
;
return
$1; }
elsif
(/\G ( <<~ [\t ]*
'([a-zA-Z_0-9]*)'
) /oxgc) {
$slash
=
'm//'
;
my
$here_quote
= $1;
my
$delimiter
= $2;
if
(
$here_script
eq
''
) {
$here_script
= CORE::
substr
$_
,
pos
$_
;
$here_script
=~ s/.*?\n//oxm;
}
if
(
$here_script
=~ s/\A (.*?) \n ([\t ]*)
$delimiter
\n //xms) {
my
$heredoc
= $1;
my
$indent
= $2;
$heredoc
=~ s{^
$indent
}{}msg;
push
@heredoc
,
$heredoc
.
qq{\n$delimiter\n}
;
push
@heredoc_delimiter
,
qq{\\s*$delimiter}
;
}
else
{
die
__FILE__,
": Can't find string terminator $delimiter anywhere before EOF\n"
;
}
return
qq{<<'$delimiter'}
;
}
elsif
(/\G ( <<~ \\([a-zA-Z_0-9]+) ) /oxgc) {
$slash
=
'm//'
;
my
$here_quote
= $1;
my
$delimiter
= $2;
if
(
$here_script
eq
''
) {
$here_script
= CORE::
substr
$_
,
pos
$_
;
$here_script
=~ s/.*?\n//oxm;
}
if
(
$here_script
=~ s/\A (.*?) \n ([\t ]*)
$delimiter
\n //xms) {
my
$heredoc
= $1;
my
$indent
= $2;
$heredoc
=~ s{^
$indent
}{}msg;
push
@heredoc
,
$heredoc
.
qq{\n$delimiter\n}
;
push
@heredoc_delimiter
,
qq{\\s*$delimiter}
;
}
else
{
die
__FILE__,
": Can't find string terminator $delimiter anywhere before EOF\n"
;
}
return
qq{<<\\$delimiter}
;
}
elsif
(/\G ( <<~ [\t ]*
"([a-zA-Z_0-9]*)"
) /oxgc) {
$slash
=
'm//'
;
my
$here_quote
= $1;
my
$delimiter
= $2;
if
(
$here_script
eq
''
) {
$here_script
= CORE::
substr
$_
,
pos
$_
;
$here_script
=~ s/.*?\n//oxm;
}
if
(
$here_script
=~ s/\A (.*?) \n ([\t ]*)
$delimiter
\n //xms) {
my
$heredoc
= $1;
my
$indent
= $2;
$heredoc
=~ s{^
$indent
}{}msg;
push
@heredoc
, e_heredoc(
$heredoc
) .
qq{\n$delimiter\n}
;
push
@heredoc_delimiter
,
qq{\\s*$delimiter}
;
}
else
{
die
__FILE__,
": Can't find string terminator $delimiter anywhere before EOF\n"
;
}
return
qq{<<"$delimiter"}
;
}
elsif
(/\G ( <<~ ([a-zA-Z_0-9]+) ) /oxgc) {
$slash
=
'm//'
;
my
$here_quote
= $1;
my
$delimiter
= $2;
if
(
$here_script
eq
''
) {
$here_script
= CORE::
substr
$_
,
pos
$_
;
$here_script
=~ s/.*?\n//oxm;
}
if
(
$here_script
=~ s/\A (.*?) \n ([\t ]*)
$delimiter
\n //xms) {
my
$heredoc
= $1;
my
$indent
= $2;
$heredoc
=~ s{^
$indent
}{}msg;
push
@heredoc
, e_heredoc(
$heredoc
) .
qq{\n$delimiter\n}
;
push
@heredoc_delimiter
,
qq{\\s*$delimiter}
;
}
else
{
die
__FILE__,
": Can't find string terminator $delimiter anywhere before EOF\n"
;
}
return
qq{<<$delimiter}
;
}
elsif
(/\G ( <<~ [\t ]* `([a-zA-Z_0-9]*)` ) /oxgc) {
$slash
=
'm//'
;
my
$here_quote
= $1;
my
$delimiter
= $2;
if
(
$here_script
eq
''
) {
$here_script
= CORE::
substr
$_
,
pos
$_
;
$here_script
=~ s/.*?\n//oxm;
}
if
(
$here_script
=~ s/\A (.*?) \n ([\t ]*)
$delimiter
\n //xms) {
my
$heredoc
= $1;
my
$indent
= $2;
$heredoc
=~ s{^
$indent
}{}msg;
push
@heredoc
, e_heredoc(
$heredoc
) .
qq{\n$delimiter\n}
;
push
@heredoc_delimiter
,
qq{\\s*$delimiter}
;
}
else
{
die
__FILE__,
": Can't find string terminator $delimiter anywhere before EOF\n"
;
}
return
qq{<<`$delimiter`}
;
}
elsif
(/\G ( <<
'([a-zA-Z_0-9]*)'
) /oxgc) {
$slash
=
'm//'
;
my
$here_quote
= $1;
my
$delimiter
= $2;
if
(
$here_script
eq
''
) {
$here_script
= CORE::
substr
$_
,
pos
$_
;
$here_script
=~ s/.*?\n//oxm;
}
if
(
$here_script
=~ s/\A (.*?) \n
$delimiter
\n //xms) {
push
@heredoc
, $1 .
qq{\n$delimiter\n}
;
push
@heredoc_delimiter
,
$delimiter
;
}
else
{
die
__FILE__,
": Can't find string terminator $delimiter anywhere before EOF\n"
;
}
return
$here_quote
;
}
elsif
(/\G ( << \\([a-zA-Z_0-9]+) ) /oxgc) {
$slash
=
'm//'
;
my
$here_quote
= $1;
my
$delimiter
= $2;
if
(
$here_script
eq
''
) {
$here_script
= CORE::
substr
$_
,
pos
$_
;
$here_script
=~ s/.*?\n//oxm;
}
if
(
$here_script
=~ s/\A (.*?) \n
$delimiter
\n //xms) {
push
@heredoc
, $1 .
qq{\n$delimiter\n}
;
push
@heredoc_delimiter
,
$delimiter
;
}
else
{
die
__FILE__,
": Can't find string terminator $delimiter anywhere before EOF\n"
;
}
return
$here_quote
;
}
elsif
(/\G ( <<
"([a-zA-Z_0-9]*)"
) /oxgc) {
$slash
=
'm//'
;
my
$here_quote
= $1;
my
$delimiter
= $2;
if
(
$here_script
eq
''
) {
$here_script
= CORE::
substr
$_
,
pos
$_
;
$here_script
=~ s/.*?\n//oxm;
}
if
(
$here_script
=~ s/\A (.*?) \n
$delimiter
\n //xms) {
push
@heredoc
, e_heredoc($1) .
qq{\n$delimiter\n}
;
push
@heredoc_delimiter
,
$delimiter
;
}
else
{
die
__FILE__,
": Can't find string terminator $delimiter anywhere before EOF\n"
;
}
return
$here_quote
;
}
elsif
(/\G ( << ([a-zA-Z_0-9]+) ) /oxgc) {
$slash
=
'm//'
;
my
$here_quote
= $1;
my
$delimiter
= $2;
if
(
$here_script
eq
''
) {
$here_script
= CORE::
substr
$_
,
pos
$_
;
$here_script
=~ s/.*?\n//oxm;
}
if
(
$here_script
=~ s/\A (.*?) \n
$delimiter
\n //xms) {
push
@heredoc
, e_heredoc($1) .
qq{\n$delimiter\n}
;
push
@heredoc_delimiter
,
$delimiter
;
}
else
{
die
__FILE__,
": Can't find string terminator $delimiter anywhere before EOF\n"
;
}
return
$here_quote
;
}
elsif
(/\G ( << `([a-zA-Z_0-9]*)` ) /oxgc) {
$slash
=
'm//'
;
my
$here_quote
= $1;
my
$delimiter
= $2;
if
(
$here_script
eq
''
) {
$here_script
= CORE::
substr
$_
,
pos
$_
;
$here_script
=~ s/.*?\n//oxm;
}
if
(
$here_script
=~ s/\A (.*?) \n
$delimiter
\n //xms) {
push
@heredoc
, e_heredoc($1) .
qq{\n$delimiter\n}
;
push
@heredoc_delimiter
,
$delimiter
;
}
else
{
die
__FILE__,
": Can't find string terminator $delimiter anywhere before EOF\n"
;
}
return
$here_quote
;
}
elsif
(/\G ( <<= | <=> | <= | < ) (?= (?>\s*) [A-Za-z_0-9'"`\$\@\&\*\(\+\-] )/oxgc) {
return
$1;
}
elsif
(/\G (<[\$]?[A-Za-z_][A-Za-z_0-9]*>) /oxgc) {
return
$1;
}
elsif
(/\G < ((?:[^>\0\a\e\f\n\r\t])+?) > /oxgc) {
return
'Ecyrillic::glob("'
. $1 .
'")'
;
}
elsif
(/\G ^ ( __DATA__ \n .*) \z /oxmsgc) {
return
$1; }
elsif
(/\G ^ ( __END__ \n .*) \z /oxmsgc) {
return
$1; }
elsif
(/\G ( \cD .*) \z /oxmsgc) {
return
$1; }
elsif
(/\G ( \cZ .*) \z /oxmsgc) {
return
$1; }
elsif
(/\G (
-- | \+\+ |
[\)\}\]]
) /oxgc) {
$slash
=
'div'
;
return
$1; }
elsif
(/\G (
\.\.\.
) /oxgc) {
$slash
=
'm//'
;
return
q{die('Unimplemented')}
; }
elsif
(/\G ((?>
!~~ | !~ | != | ! |
%= | % |
&&= | && | &= | &\.= | &\. | & |
-= | -> | - |
:(?>\s*)= |
: |
<<>> |
<<= | <=> | <= | < |
== | => | =~ | = |
>>= | >> | >= | > |
\*\*= | \*\* | \*= | \* |
\+= | \+ |
\.\. | \.= | \. |
\/\/= | \/\/ |
\/= | \/ |
\? |
\\ |
\^= | \^\.= | \^\. | \^ |
\b x= |
\|\|= | \|\| | \|= | \|\.= | \|\. | \| |
~~ | ~\. | ~ |
\b(?: and | cmp | eq | ge | gt | le | lt | ne | not | or | xor | x )\b |
\b(?:
print
)\b |
[,;\(\{\[]
)) /oxgc) {
$slash
=
'm//'
;
return
$1; }
elsif
(/\G (
$q_char
) /oxgc) {
$slash
=
'div'
;
return
$1; }
else
{
die
__FILE__,
": Oops, this shouldn't happen!\n"
;
}
}
sub
e_string {
my
(
$string
) =
@_
;
my
$e_string
=
''
;
local
$slash
=
'm//'
;
my
@char
=
$string
=~ / \G (?>[^\\]|\\
$q_char
|
$q_char
) /oxmsg;
if
(not (
grep
(/\A \{ \z/xms,
@char
) and
grep
(/\A \} \z/xms,
@char
))) {
if
(
$string
!~ /<</oxms) {
return
$string
;
}
}
E_STRING_LOOP:
while
(
$string
!~ /\G \z/oxgc) {
if
(0) {
}
elsif
(
$string
=~ /\G ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH \b | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) /oxmsgc) {
$e_string
.=
q{Ecyrillic::PREMATCH()}
;
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G ( \$& | \$\{&\} | \$ (?>\s*) MATCH \b | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) /oxmsgc) {
$e_string
.=
q{Ecyrillic::MATCH()}
;
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G ( \$
' | \$\{'
\} ) /oxmsgc) {
$e_string
.= $1;
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G ( \$ (?>\s*) POSTMATCH \b | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) /oxmsgc) {
$e_string
.=
q{Ecyrillic::POSTMATCH()}
;
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G ( \{ (?>\s*) (?:
tr
|
index
|
rindex
|
reverse
) (?>\s*) \} ) /oxmsgc) {
$e_string
.= $1;
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G ( \$ 0 ) /oxmsgc) {
$e_string
.= $1;
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G ( \$ \{ (?>\s*) 0 (?>\s*) \} ) /oxmsgc) {
$e_string
.= $1;
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G ( \$ \$ ) (?![\w\{]) /oxmsgc) {
$e_string
.= $1;
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G \$ ((?>[1-9][0-9]*)) /oxmsgc) {
$e_string
.= e_capture($1);
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} /oxmsgc) {
$e_string
.= e_capture($1);
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ .+? \] ) /oxmsgc) {
$e_string
.= e_capture($1.
'->'
.$2);
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ .+? \} ) /oxmsgc) {
$e_string
.= e_capture($1.
'->'
.$2);
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) /oxmsgc) {
$e_string
.= e_capture($1);
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} /oxmsgc) {
$e_string
.=
'${'
. $1 .
'}'
;
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G \$ (?>\s*) \{ (?>\s*) (
$qq_brace
) (?>\s*) \} /oxmsgc) {
$e_string
.= e_capture($1);
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G ( (?: [\$\@\%\&\*] | \$\
$e_string
.= $1;
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G ( \$[\$\@\
$e_string
.= $1;
$slash
=
'div'
;
}
elsif
(
$string
=~ /\G \b (
qq) \b /oxgc)
{
my
$ope
= $1;
if
(
$string
=~ /\G (\
$e_string
.= e_qq(
$ope
,$1,$3,$2);
}
else
{
my
$e
=
''
;
while
(
$string
!~ /\G \z/oxgc) {
if
(
$string
=~ /\G ((?>\s+)|\
elsif
(
$string
=~ /\G (\() ((?:
$qq_paren
)*?) (\)) /oxgc) {
$e_string
.=
$e
. e_qq(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
elsif
(
$string
=~ /\G (\{) ((?:
$qq_brace
)*?) (\}) /oxgc) {
$e_string
.=
$e
. e_qq(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
elsif
(
$string
=~ /\G (\[) ((?:
$qq_bracket
)*?) (\]) /oxgc) {
$e_string
.=
$e
. e_qq(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
elsif
(
$string
=~ /\G (\<) ((?:
$qq_angle
)*?) (\>) /oxgc) {
$e_string
.=
$e
. e_qq(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
elsif
(
$string
=~ /\G (\S) ((?:
$qq_char
)*?) (\1) /oxgc) {
$e_string
.=
$e
. e_qq(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
}
elsif
(
$string
=~ /\G \b (
qx) \b /oxgc)
{
my
$ope
= $1;
if
(
$string
=~ /\G (\
$e_string
.= e_qq(
$ope
,$1,$3,$2);
}
else
{
my
$e
=
''
;
while
(
$string
!~ /\G \z/oxgc) {
if
(
$string
=~ /\G ((?>\s+)|\
elsif
(
$string
=~ /\G (\() ((?:
$qq_paren
)*?) (\)) /oxgc) {
$e_string
.=
$e
. e_qq(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
elsif
(
$string
=~ /\G (\{) ((?:
$qq_brace
)*?) (\}) /oxgc) {
$e_string
.=
$e
. e_qq(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
elsif
(
$string
=~ /\G (\[) ((?:
$qq_bracket
)*?) (\]) /oxgc) {
$e_string
.=
$e
. e_qq(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
elsif
(
$string
=~ /\G (\<) ((?:
$qq_angle
)*?) (\>) /oxgc) {
$e_string
.=
$e
. e_qq(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
elsif
(
$string
=~ /\G (\
') ((?:$qq_char)*?) (\') /oxgc) { $e_string .= $e . e_q ($ope,$1,$3,$2); next E_STRING_LOOP; } # qx '
'
elsif
(
$string
=~ /\G (\S) ((?:
$qq_char
)*?) (\1) /oxgc) {
$e_string
.=
$e
. e_qq(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
}
elsif
(
$string
=~ /\G \b (
q) \b /oxgc)
{
my
$ope
= $1;
if
(
$string
=~ /\G (\
$e_string
.= e_q(
$ope
,$1,$3,$2);
}
else
{
my
$e
=
''
;
while
(
$string
!~ /\G \z/oxgc) {
if
(
$string
=~ /\G ((?>\s+)|\
elsif
(
$string
=~ /\G (\() ((?:\\\\|\\\)|\\\(|
$q_paren
)*?) (\)) /oxgc) {
$e_string
.=
$e
. e_q(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
elsif
(
$string
=~ /\G (\{) ((?:\\\\|\\\}|\\\{|
$q_brace
)*?) (\}) /oxgc) {
$e_string
.=
$e
. e_q(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
elsif
(
$string
=~ /\G (\[) ((?:\\\\|\\\]|\\\[|
$q_bracket
)*?) (\]) /oxgc) {
$e_string
.=
$e
. e_q(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
elsif
(
$string
=~ /\G (\<) ((?:\\\\|\\\>|\\\<|
$q_angle
)*?) (\>) /oxgc) {
$e_string
.=
$e
. e_q(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
elsif
(
$string
=~ /\G (\S) ((?:\\\\|\\\1|
$q_char
)*?) (\1) /oxgc) {
$e_string
.=
$e
. e_q(
$ope
,$1,$3,$2);
next
E_STRING_LOOP; }
}
die
__FILE__,
": Can't find string terminator anywhere before EOF\n"
;
}
}
elsif
(
$string
=~ /\G (?<![\w\$\@\%\&\*]) (\
') ((?:\\\'|\\\\|$q_char)*?) (\') /oxgc) { $e_string .= e_q('
',$1,$3,$2); }
elsif
(
$string
=~ /\G (\") ((?:
$qq_char
)*?) (\") /oxgc) {
$e_string
.= e_qq(
''
,$1,$3,$2); }
elsif
(
$string
=~ /\G (\`) ((?:
$qq_char
)*?) (\`) /oxgc) {
$e_string
.= e_qq(
''
,$1,$3,$2); }
elsif
(
$string
=~ /\G (
$q_char
) /oxgc) {
$e_string
.= $1; }
else
{
die
__FILE__,
": Oops, this shouldn't happen!\n"
;
}
}
return
$e_string
;
}
sub
character_class {
my
(
$char
,
$modifier
) =
@_
;
if
(
$char
eq
'.'
) {
if
(
$modifier
=~ /s/) {
return
'${Ecyrillic::dot_s}'
;
}
else
{
return
'${Ecyrillic::dot}'
;
}
}
else
{
return
Ecyrillic::classic_character_class(
$char
);
}
}
sub
e_capture {
return
join
''
,
'${'
,
$_
[0],
'}'
;
}
sub
e_tr {
my
(
$variable
,
$charclass
,
$e
,
$charclass2
,
$modifier
) =
@_
;
my
$e_tr
=
''
;
$modifier
||=
''
;
$slash
=
'div'
;
$charclass
= q_tr(
$charclass
);
$charclass2
= q_tr(
$charclass2
);
if
(
$modifier
=~
tr
/bB//d) {
if
(
$variable
eq
''
) {
$e_tr
=
qq{tr$charclass$e$charclass2$modifier}
;
}
else
{
$e_tr
=
qq{$variable${bind_operator}
tr
$charclass
$e
$charclass2
$modifier
};
}
}
else
{
if
(
$variable
eq
''
) {
$e_tr
=
qq{Ecyrillic::tr(\$_,' =~ ',$charclass,$e$charclass2,'$modifier')}
;
}
else
{
$e_tr
=
qq{Ecyrillic::tr($variable,'$bind_operator',$charclass,$e$charclass2,'$modifier')}
;
}
}
$tr_variable
=
''
;
$bind_operator
=
''
;
return
$e_tr
;
}
sub
q_tr {
my
(
$charclass
) =
@_
;
if
(
$charclass
!~ /'/oxms) {
return
e_q(
''
,
"'"
,
"'"
,
$charclass
);
}
elsif
(
$charclass
!~ /\//oxms) {
return
e_q(
'q'
,
'/'
,
'/'
,
$charclass
);
}
elsif
(
$charclass
!~ /\
return
e_q(
'q'
,
'#'
,
'#'
,
$charclass
); # -->
q# #
}
elsif
(
$charclass
!~ /[\<\>]/oxms) {
return
e_q(
'q'
,
'<'
,
'>'
,
$charclass
);
}
elsif
(
$charclass
!~ /[\(\)]/oxms) {
return
e_q(
'q'
,
'('
,
')'
,
$charclass
);
}
elsif
(
$charclass
!~ /[\{\}]/oxms) {
return
e_q(
'q'
,
'{'
,
'}'
,
$charclass
);
}
else
{
for
my
$char
(
qw( ! " $ % & * + . : = ? @ ^ ` | ~ )
, "\x00
".."
\x1F
", "
\x7F
", "
\xFF") {
if
(
$charclass
!~ /\Q
$char
\E/xms) {
return
e_q(
'q'
,
$char
,
$char
,
$charclass
);
}
}
}
return
e_q(
'q'
,
'{'
,
'}'
,
$charclass
);
}
sub
e_q {
my
(
$ope
,
$delimiter
,
$end_delimiter
,
$string
) =
@_
;
$slash
=
'div'
;
return
join
''
,
$ope
,
$delimiter
,
$string
,
$end_delimiter
;
}
sub
e_qq {
my
(
$ope
,
$delimiter
,
$end_delimiter
,
$string
) =
@_
;
$slash
=
'div'
;
my
$left_e
= 0;
my
$right_e
= 0;
my
@char
=
$string
=~ /\G((?>
[^\\\$] |
\\x\{ (?>[0-9A-Fa-f]+) \} |
\\o\{ (?>[0-7]+) \} |
\\N\{ (?>[^0-9\}][^\}]*) \} |
\\
$q_char
|
\$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
\$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
\$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
\$ (?>\s* [0-9]+) |
\$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
\$ \$ (?![\w\{]) |
\$ (?>\s*) \$ (?>\s*)
$qq_variable
|
$q_char
))/oxmsg;
for
(
my
$i
=0;
$i
<=
$#char
;
$i
++) {
if
((
$char
[
$i
] eq
'\L'
) and (
$char
[
$i
+1] eq
'\u'
)) {
@char
[
$i
,
$i
+1] =
@char
[
$i
+1,
$i
];
}
elsif
((
$char
[
$i
] eq
'\U'
) and (
$char
[
$i
+1] eq
'\l'
)) {
@char
[
$i
,
$i
+1] =
@char
[
$i
+1,
$i
];
}
elsif
(
$char
[
$i
] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
$char
[
$i
] = Ecyrillic::octchr($1);
}
elsif
(
$char
[
$i
] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
$char
[
$i
] = Ecyrillic::hexchr($1);
}
elsif
(
$char
[
$i
] =~ /\A \\ ( N\{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
$char
[
$i
] = $1;
}
if
(0) {
}
elsif
(
$char
[
$i
] =~ /\A ([<>]) \z/oxms) {
if
(
$right_e
<
$left_e
) {
$char
[
$i
] =
'\\'
.
$char
[
$i
];
}
}
elsif
(
$char
[
$i
] eq
'\u'
) {
$char
[
$i
] =
'@{[Ecyrillic::ucfirst qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\l'
) {
$char
[
$i
] =
'@{[Ecyrillic::lcfirst qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\U'
) {
$char
[
$i
] =
'@{[Ecyrillic::uc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\L'
) {
$char
[
$i
] =
'@{[Ecyrillic::lc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\F'
) {
$char
[
$i
] =
'@{[Ecyrillic::fc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\Q'
) {
$char
[
$i
] =
'@{[CORE::quotemeta qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\E'
) {
if
(
$right_e
<
$left_e
) {
$char
[
$i
] =
'>]}'
;
$right_e
++;
}
else
{
$char
[
$i
] =
''
;
}
}
elsif
(
$char
[
$i
] eq
'\Q'
) {
while
(1) {
if
(++
$i
>
$#char
) {
last
;
}
if
(
$char
[
$i
] eq
'\E'
) {
last
;
}
}
}
elsif
(
$char
[
$i
] eq
'\E'
) {
}
elsif
(
$char
[
$i
] =~ /\A \$ 0 \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \$\$ \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
$char
[
$i
] = e_capture($1);
}
elsif
(
$char
[
$i
] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
$char
[
$i
] = e_capture($1);
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:
$qq_bracket
)*? \] ) \z/oxms) {
$char
[
$i
] = e_capture($1.
'->'
.$2);
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:
$qq_brace
)*? \} ) \z/oxms) {
$char
[
$i
] = e_capture($1.
'->'
.$2);
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
$char
[
$i
] = e_capture($1);
}
elsif
(
$char
[
$i
] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
$char
[
$i
] =
'@{[Ecyrillic::PREMATCH()]}'
;
}
elsif
(
$char
[
$i
] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
$char
[
$i
] =
'@{[Ecyrillic::MATCH()]}'
;
}
elsif
(
$char
[
$i
] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
$char
[
$i
] =
'@{[Ecyrillic::POSTMATCH()]}'
;
}
elsif
(
$char
[
$i
] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
$char
[
$i
] = e_capture($1);
}
}
if
(
$left_e
>
$right_e
) {
return
join
''
,
$ope
,
$delimiter
,
@char
,
'>]}'
x (
$left_e
-
$right_e
),
$end_delimiter
;
}
return
join
''
,
$ope
,
$delimiter
,
@char
,
$end_delimiter
;
}
sub
e_qw {
my
(
$ope
,
$delimiter
,
$end_delimiter
,
$string
) =
@_
;
$slash
=
'div'
;
my
%octet
=
map
{
$_
=> 1} (
$string
=~ /\G ([\x00-\xFF]) /oxmsg);
if
(not
$octet
{
$end_delimiter
}) {
return
join
''
,
$ope
,
$delimiter
,
$string
,
$end_delimiter
;
}
elsif
(not
$octet
{
')'
}) {
return
join
''
,
$ope
,
'('
,
$string
,
')'
;
}
elsif
(not
$octet
{
'}'
}) {
return
join
''
,
$ope
,
'{'
,
$string
,
'}'
;
}
elsif
(not
$octet
{
']'
}) {
return
join
''
,
$ope
,
'['
,
$string
,
']'
;
}
elsif
(not
$octet
{
'>'
}) {
return
join
''
,
$ope
,
'<'
,
$string
,
'>'
;
}
else
{
for
my
$char
(
qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ )
, "\x00
".."
\x1F
", "
\x7F
", "
\xFF") {
if
(not
$octet
{
$char
}) {
return
join
''
,
$ope
,
$char
,
$string
,
$char
;
}
}
}
my
@string
= CORE::
split
(/\s+/,
$string
);
for
my
$string
(
@string
) {
my
@octet
=
$string
=~ /\G ([\x00-\xFF]) /oxmsg;
for
my
$octet
(
@octet
) {
if
(
$octet
=~ /\A (['\\]) \z/oxms) {
$octet
=
'\\'
. $1;
}
}
$string
=
join
''
,
@octet
;
}
return
join
''
,
'('
, (
join
', '
,
map
{
"'$_'"
}
@string
),
')'
;
}
sub
e_heredoc {
my
(
$string
) =
@_
;
$slash
=
'm//'
;
my
$metachar
=
qr/[\@\\|]/
oxms;
my
$left_e
= 0;
my
$right_e
= 0;
my
@char
=
$string
=~ /\G((?>
[^\\\$] |
\\x\{ (?>[0-9A-Fa-f]+) \} |
\\o\{ (?>[0-7]+) \} |
\\N\{ (?>[^0-9\}][^\}]*) \} |
\\
$q_char
|
\$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
\$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
\$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
\$ (?>\s* [0-9]+) |
\$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
\$ \$ (?![\w\{]) |
\$ (?>\s*) \$ (?>\s*)
$qq_variable
|
$q_char
))/oxmsg;
for
(
my
$i
=0;
$i
<=
$#char
;
$i
++) {
if
((
$char
[
$i
] eq
'\L'
) and (
$char
[
$i
+1] eq
'\u'
)) {
@char
[
$i
,
$i
+1] =
@char
[
$i
+1,
$i
];
}
elsif
((
$char
[
$i
] eq
'\U'
) and (
$char
[
$i
+1] eq
'\l'
)) {
@char
[
$i
,
$i
+1] =
@char
[
$i
+1,
$i
];
}
elsif
(
$char
[
$i
] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
$char
[
$i
] = Ecyrillic::octchr($1);
}
elsif
(
$char
[
$i
] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
$char
[
$i
] = Ecyrillic::hexchr($1);
}
elsif
(
$char
[
$i
] =~ /\A \\ ( N\{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
$char
[
$i
] = $1;
}
if
(0) {
}
elsif
(
$char
[
$i
] =~ /\A ([<>]) \z/oxms) {
if
(
$right_e
<
$left_e
) {
$char
[
$i
] =
'\\'
.
$char
[
$i
];
}
}
elsif
(
$char
[
$i
] eq
'\u'
) {
$char
[
$i
] =
'@{[Ecyrillic::ucfirst qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\l'
) {
$char
[
$i
] =
'@{[Ecyrillic::lcfirst qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\U'
) {
$char
[
$i
] =
'@{[Ecyrillic::uc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\L'
) {
$char
[
$i
] =
'@{[Ecyrillic::lc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\F'
) {
$char
[
$i
] =
'@{[Ecyrillic::fc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\Q'
) {
$char
[
$i
] =
'@{[CORE::quotemeta qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\E'
) {
if
(
$right_e
<
$left_e
) {
$char
[
$i
] =
'>]}'
;
$right_e
++;
}
else
{
$char
[
$i
] =
''
;
}
}
elsif
(
$char
[
$i
] eq
'\Q'
) {
while
(1) {
if
(++
$i
>
$#char
) {
last
;
}
if
(
$char
[
$i
] eq
'\E'
) {
last
;
}
}
}
elsif
(
$char
[
$i
] eq
'\E'
) {
}
elsif
(
$char
[
$i
] =~ /\A \$ 0 \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \$\$ \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
$char
[
$i
] = e_capture($1);
}
elsif
(
$char
[
$i
] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
$char
[
$i
] = e_capture($1);
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:
$qq_bracket
)*? \] ) \z/oxms) {
$char
[
$i
] = e_capture($1.
'->'
.$2);
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:
$qq_brace
)*? \} ) \z/oxms) {
$char
[
$i
] = e_capture($1.
'->'
.$2);
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
$char
[
$i
] = e_capture($1);
}
elsif
(
$char
[
$i
] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
$char
[
$i
] =
'@{[Ecyrillic::PREMATCH()]}'
;
}
elsif
(
$char
[
$i
] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
$char
[
$i
] =
'@{[Ecyrillic::MATCH()]}'
;
}
elsif
(
$char
[
$i
] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
$char
[
$i
] =
'@{[Ecyrillic::POSTMATCH()]}'
;
}
elsif
(
$char
[
$i
] =~ /\A \$ (?>\s*) \{ (?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* ) \} \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
$char
[
$i
] = e_capture($1);
}
}
if
(
$left_e
>
$right_e
) {
return
join
''
,
@char
,
'>]}'
x (
$left_e
-
$right_e
);
}
return
join
''
,
@char
;
}
sub
e_qr {
my
(
$ope
,
$delimiter
,
$end_delimiter
,
$string
,
$modifier
) =
@_
;
$modifier
||=
''
;
$modifier
=~
tr
/p//d;
if
(
$modifier
=~ /([adlu])/oxms) {
my
$line
= 0;
for
(
my
$i
=0;
my
(
$package
,
$filename
,
$use_line
,
$subroutine
) =
caller
(
$i
);
$i
++) {
if
(
$filename
ne __FILE__) {
$line
=
$use_line
+ (CORE::
substr
(
$_
,0,
pos
(
$_
)) =~
tr
/\n//) + 1;
last
;
}
}
die
qq{Unsupported modifier "$1" used at line $line.\n}
;
}
$slash
=
'div'
;
if
(
$string
eq
''
) {
$modifier
=~
tr
/bB//d;
$modifier
=~
tr
/i//d;
return
join
''
,
$ope
,
$delimiter
,
$end_delimiter
,
$modifier
;
}
elsif
(
$modifier
=~
tr
/bB//d) {
if
(
$delimiter
=~ / [\@:] /oxms) {
my
@char
=
$string
=~ /\G ([\x00-\xFF]) /oxmsg;
my
%octet
=
map
{
$_
=> 1}
@char
;
if
(not
$octet
{
')'
}) {
$delimiter
=
'('
;
$end_delimiter
=
')'
;
}
elsif
(not
$octet
{
'}'
}) {
$delimiter
=
'{'
;
$end_delimiter
=
'}'
;
}
elsif
(not
$octet
{
']'
}) {
$delimiter
=
'['
;
$end_delimiter
=
']'
;
}
elsif
(not
$octet
{
'>'
}) {
$delimiter
=
'<'
;
$end_delimiter
=
'>'
;
}
else
{
for
my
$char
(
qw( ! " $ % & * + - . / = ? ^ ` | ~ )
, "\x00
".."
\x1F
", "
\x7F
", "
\xFF") {
if
(not
$octet
{
$char
}) {
$delimiter
=
$char
;
$end_delimiter
=
$char
;
last
;
}
}
}
}
if
((
$ope
=~ /\A m? \z/oxms) and (
$delimiter
eq
'?'
)) {
return
join
''
,
$ope
,
$delimiter
,
$string
,
$matched
,
$end_delimiter
,
$modifier
;
}
else
{
return
join
''
,
$ope
,
$delimiter
,
'(?:'
,
$string
,
')'
,
$matched
,
$end_delimiter
,
$modifier
;
}
}
my
$ignorecase
= (
$modifier
=~ /i/oxms) ? 1 : 0;
my
$metachar
=
qr/[\@\\|[\]{^]/
oxms;
my
@char
=
$string
=~ /\G((?>
[^\\\$\@\[\(] |
\\x (?>[0-9A-Fa-f]{1,2}) |
\\ (?>[0-7]{2,3}) |
\\c [\x40-\x5F] |
\\x\{ (?>[0-9A-Fa-f]+) \} |
\\o\{ (?>[0-7]+) \} |
\\[bBNpP]\{ (?>[^0-9\}][^\}]*) \} |
\\
$q_char
|
\$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
\$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
\$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
[\$\@]
$qq_variable
|
\$ (?>\s* [0-9]+) |
\$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
\$ \$ (?![\w\{]) |
\$ (?>\s*) \$ (?>\s*)
$qq_variable
|
\[\^ |
\[\: (?>[a-z]+) :\] |
\[\:\^ (?>[a-z]+) :\] |
\(\? |
$q_char
))/oxmsg;
if
(
$delimiter
=~ / [\@:] /oxms) {
my
%octet
=
map
{
$_
=> 1}
@char
;
if
(not
$octet
{
')'
}) {
$delimiter
=
'('
;
$end_delimiter
=
')'
;
}
elsif
(not
$octet
{
'}'
}) {
$delimiter
=
'{'
;
$end_delimiter
=
'}'
;
}
elsif
(not
$octet
{
']'
}) {
$delimiter
=
'['
;
$end_delimiter
=
']'
;
}
elsif
(not
$octet
{
'>'
}) {
$delimiter
=
'<'
;
$end_delimiter
=
'>'
;
}
else
{
for
my
$char
(
qw( ! " $ % & * + - . / = ? ^ ` | ~ )
, "\x00
".."
\x1F
", "
\x7F
", "
\xFF") {
if
(not
$octet
{
$char
}) {
$delimiter
=
$char
;
$end_delimiter
=
$char
;
last
;
}
}
}
}
my
$left_e
= 0;
my
$right_e
= 0;
for
(
my
$i
=0;
$i
<=
$#char
;
$i
++) {
if
((
$char
[
$i
] eq
'\L'
) and (
$char
[
$i
+1] eq
'\u'
)) {
@char
[
$i
,
$i
+1] =
@char
[
$i
+1,
$i
];
}
elsif
((
$char
[
$i
] eq
'\U'
) and (
$char
[
$i
+1] eq
'\l'
)) {
@char
[
$i
,
$i
+1] =
@char
[
$i
+1,
$i
];
}
elsif
(
$char
[
$i
] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
$char
[
$i
] = Ecyrillic::octchr($1);
}
elsif
(
$char
[
$i
] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
$char
[
$i
] = Ecyrillic::hexchr($1);
}
elsif
(
$char
[
$i
] =~ /\A \\ ([bBNpP]) ( \{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
$char
[
$i
] = $1 .
'\\'
. $2;
}
elsif
(
$char
[
$i
] =~ /\A \\ ( [pPX] ) \z/oxms) {
$char
[
$i
] = $1;
}
if
(0) {
}
elsif
(
$char
[
$i
] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
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)) {
$char
[
$i
] .=
join
''
,
splice
@char
,
$i
+1, 3;
}
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)) {
$char
[
$i
] .=
join
''
,
splice
@char
,
$i
+1, 2;
}
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)) {
$char
[
$i
] .=
join
''
,
splice
@char
,
$i
+1, 1;
}
}
elsif
(
$char
[
$i
] eq
'['
) {
my
$left
=
$i
;
if
(
$char
[
$i
+1] eq
']'
) {
$i
++;
}
while
(1) {
if
(++
$i
>
$#char
) {
die
__FILE__,
": Unmatched [] in regexp\n"
;
}
if
(
$char
[
$i
] eq
']'
) {
my
$right
=
$i
;
if
(
grep
(/\A [\$\@]/oxms,
@char
[
$left
+1..
$right
-1]) >= 1) {
splice
@char
,
$left
,
$right
-
$left
+1,
sprintf
(
q{@{[Ecyrillic::charlist_qr(%s,'%s')]}
},
join
(
','
,
map
{qq_stuff(
$delimiter
,
$end_delimiter
,
$_
)}
@char
[
$left
+1..
$right
-1]),
$modifier
);
}
else
{
splice
@char
,
$left
,
$right
-
$left
+1, Ecyrillic::charlist_qr(
@char
[
$left
+1..
$right
-1],
$modifier
);
}
$i
=
$left
;
last
;
}
}
}
elsif
(
$char
[
$i
] eq
'[^'
) {
my
$left
=
$i
;
if
(
$char
[
$i
+1] eq
']'
) {
$i
++;
}
while
(1) {
if
(++
$i
>
$#char
) {
die
__FILE__,
": Unmatched [] in regexp\n"
;
}
if
(
$char
[
$i
] eq
']'
) {
my
$right
=
$i
;
if
(
grep
(/\A [\$\@]/oxms,
@char
[
$left
+1..
$right
-1]) >= 1) {
splice
@char
,
$left
,
$right
-
$left
+1,
sprintf
(
q{@{[Ecyrillic::charlist_not_qr(%s,'%s')]}
},
join
(
','
,
map
{qq_stuff(
$delimiter
,
$end_delimiter
,
$_
)}
@char
[
$left
+1..
$right
-1]),
$modifier
);
}
else
{
splice
@char
,
$left
,
$right
-
$left
+1, Ecyrillic::charlist_not_qr(
@char
[
$left
+1..
$right
-1],
$modifier
);
}
$i
=
$left
;
last
;
}
}
}
elsif
(
my
$char
= character_class(
$char
[
$i
],
$modifier
)) {
$char
[
$i
] =
$char
;
}
elsif
(
$ignorecase
and (
$char
[
$i
] =~ /\A [\x00-\xFF] \z/oxms) and (Ecyrillic::
uc
(
$char
[
$i
]) ne Ecyrillic::fc(
$char
[
$i
]))) {
if
(CORE::
length
(Ecyrillic::fc(
$char
[
$i
])) == 1) {
$char
[
$i
] =
'['
. Ecyrillic::
uc
(
$char
[
$i
]) . Ecyrillic::fc(
$char
[
$i
]) .
']'
;
}
else
{
$char
[
$i
] =
'(?:'
. Ecyrillic::
uc
(
$char
[
$i
]) .
'|'
. Ecyrillic::fc(
$char
[
$i
]) .
')'
;
}
}
elsif
(
$char
[
$i
] =~ /\A [<>] \z/oxms) {
if
(
$right_e
<
$left_e
) {
$char
[
$i
] =
'\\'
.
$char
[
$i
];
}
}
elsif
(
$char
[
$i
] eq
'\u'
) {
$char
[
$i
] =
'@{[Ecyrillic::ucfirst qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\l'
) {
$char
[
$i
] =
'@{[Ecyrillic::lcfirst qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\U'
) {
$char
[
$i
] =
'@{[Ecyrillic::uc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\L'
) {
$char
[
$i
] =
'@{[Ecyrillic::lc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\F'
) {
$char
[
$i
] =
'@{[Ecyrillic::fc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\Q'
) {
$char
[
$i
] =
'@{[CORE::quotemeta qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\E'
) {
if
(
$right_e
<
$left_e
) {
$char
[
$i
] =
'>]}'
;
$right_e
++;
}
else
{
$char
[
$i
] =
''
;
}
}
elsif
(
$char
[
$i
] eq
'\Q'
) {
while
(1) {
if
(++
$i
>
$#char
) {
last
;
}
if
(
$char
[
$i
] eq
'\E'
) {
last
;
}
}
}
elsif
(
$char
[
$i
] eq
'\E'
) {
}
elsif
(
$char
[
$i
] =~ /\A \$ 0 \z/oxms) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$\$ \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
$char
[
$i
] = e_capture($1);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
$char
[
$i
] = e_capture($1);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:
$qq_bracket
)*? \] ) \z/oxms) {
$char
[
$i
] = e_capture($1.
'->'
.$2);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:
$qq_brace
)*? \} ) \z/oxms) {
$char
[
$i
] = e_capture($1.
'->'
.$2);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
$char
[
$i
] = e_capture($1);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase(Ecyrillic::PREMATCH())]}'
;
}
else
{
$char
[
$i
] =
'@{[Ecyrillic::PREMATCH()]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase(Ecyrillic::MATCH())]}'
;
}
else
{
$char
[
$i
] =
'@{[Ecyrillic::MATCH()]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase(Ecyrillic::POSTMATCH())]}'
;
}
else
{
$char
[
$i
] =
'@{[Ecyrillic::POSTMATCH()]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
$char
[
$i
] = e_capture($1);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A [\$\@].+ /oxms) {
$char
[
$i
] = e_string(
$char
[
$i
]);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
((
$i
>= 1) and (
$char
[
$i
] =~ /\A [\?\+\*\{] \z/oxms)) {
if
(
$char
[
$i
-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
}
elsif
((
$ope
=~ /\A m? \z/oxms) and (
$delimiter
eq
'?'
)) {
my
$char
=
$char
[
$i
-1];
if
(
$char
[
$i
] eq
'{'
) {
die
__FILE__,
qq{: "MULTIBYTE{n}
" should be
"(MULTIBYTE){n}"
in m?? (and
shift
\$1,\$2,\$3,...) (
$char
){n}\n};
}
else
{
die
__FILE__,
qq{: "MULTIBYTE$char[$i]" should be "(MULTIBYTE)$char[$i]" in m?? (and shift \$1,\$2,\$3,...) ($char)$char[$i]\n}
;
}
}
else
{
$char
[
$i
-1] =
'(?:'
.
$char
[
$i
-1] .
')'
;
}
}
}
$modifier
=~
tr
/i//d;
if
(
$left_e
>
$right_e
) {
if
((
$ope
=~ /\A m? \z/oxms) and (
$delimiter
eq
'?'
)) {
return
join
''
,
$ope
,
$delimiter
,
$anchor
,
@char
,
'>]}'
x (
$left_e
-
$right_e
),
$matched
,
$end_delimiter
,
$modifier
;
}
else
{
return
join
''
,
$ope
,
$delimiter
,
$anchor
,
'(?:'
,
@char
,
'>]}'
x (
$left_e
-
$right_e
),
')'
,
$matched
,
$end_delimiter
,
$modifier
;
}
}
if
((
$ope
=~ /\A m? \z/oxms) and (
$delimiter
eq
'?'
)) {
return
join
''
,
$ope
,
$delimiter
,
$anchor
,
@char
,
$matched
,
$end_delimiter
,
$modifier
;
}
else
{
return
join
''
,
$ope
,
$delimiter
,
$anchor
,
'(?:'
,
@char
,
')'
,
$matched
,
$end_delimiter
,
$modifier
;
}
}
sub
qq_stuff {
my
(
$delimiter
,
$end_delimiter
,
$stuff
) =
@_
;
if
(
$stuff
=~ /\A [\$\@] /oxms) {
return
$stuff
;
}
my
%octet
=
map
{
$_
=> 1} (
$stuff
=~ /\G ([\x00-\xFF]) /oxmsg);
for
my
$char
(
qw( ! " $ % & * + - . / : = ? @ ^ ` | ~ )
, "\x00
".."
\x1F
", "
\x7F
", "
\xFF") {
next
if
$char
eq
$delimiter
;
next
if
$char
eq
$end_delimiter
;
if
(not
$octet
{
$char
}) {
return
join
''
,
'qq'
,
$char
,
$stuff
,
$char
;
}
}
return
join
''
,
'qq'
,
'<'
,
$stuff
,
'>'
;
}
sub
e_qr_q {
my
(
$ope
,
$delimiter
,
$end_delimiter
,
$string
,
$modifier
) =
@_
;
$modifier
||=
''
;
$modifier
=~
tr
/p//d;
if
(
$modifier
=~ /([adlu])/oxms) {
my
$line
= 0;
for
(
my
$i
=0;
my
(
$package
,
$filename
,
$use_line
,
$subroutine
) =
caller
(
$i
);
$i
++) {
if
(
$filename
ne __FILE__) {
$line
=
$use_line
+ (CORE::
substr
(
$_
,0,
pos
(
$_
)) =~
tr
/\n//) + 1;
last
;
}
}
die
qq{Unsupported modifier "$1" used at line $line.\n}
;
}
$slash
=
'div'
;
if
(
$string
eq
''
) {
$modifier
=~
tr
/bB//d;
$modifier
=~
tr
/i//d;
return
join
''
,
$ope
,
$delimiter
,
$end_delimiter
,
$modifier
;
}
elsif
(
$modifier
=~
tr
/bB//d) {
return
e_qr_qb(
$ope
,
$delimiter
,
$end_delimiter
,
$string
,
$modifier
);
}
else
{
return
e_qr_qt(
$ope
,
$delimiter
,
$end_delimiter
,
$string
,
$modifier
);
}
}
sub
e_qr_qt {
my
(
$ope
,
$delimiter
,
$end_delimiter
,
$string
,
$modifier
) =
@_
;
my
$ignorecase
= (
$modifier
=~ /i/oxms) ? 1 : 0;
my
@char
=
$string
=~ /\G((?>
[^\\\[\$\@\/] |
[\x00-\xFF] |
\[\^ |
\[\: (?>[a-z]+) \:\] |
\[\:\^ (?>[a-z]+) \:\] |
[\$\@\/] |
\\ (?:
$q_char
) |
(?:
$q_char
)
))/oxmsg;
for
(
my
$i
=0;
$i
<=
$#char
;
$i
++) {
if
(0) {
}
elsif
(
$char
[
$i
] eq
'['
) {
my
$left
=
$i
;
if
(
$char
[
$i
+1] eq
']'
) {
$i
++;
}
while
(1) {
if
(++
$i
>
$#char
) {
die
__FILE__,
": Unmatched [] in regexp\n"
;
}
if
(
$char
[
$i
] eq
']'
) {
my
$right
=
$i
;
splice
@char
,
$left
,
$right
-
$left
+1, Ecyrillic::charlist_qr(
@char
[
$left
+1..
$right
-1],
$modifier
);
$i
=
$left
;
last
;
}
}
}
elsif
(
$char
[
$i
] eq
'[^'
) {
my
$left
=
$i
;
if
(
$char
[
$i
+1] eq
']'
) {
$i
++;
}
while
(1) {
if
(++
$i
>
$#char
) {
die
__FILE__,
": Unmatched [] in regexp\n"
;
}
if
(
$char
[
$i
] eq
']'
) {
my
$right
=
$i
;
splice
@char
,
$left
,
$right
-
$left
+1, Ecyrillic::charlist_not_qr(
@char
[
$left
+1..
$right
-1],
$modifier
);
$i
=
$left
;
last
;
}
}
}
elsif
(
$char
[
$i
] =~ /\A [\$\@\/\\] \z/oxms) {
$char
[
$i
] =
'\\'
.
$char
[
$i
];
}
elsif
(
my
$char
= character_class(
$char
[
$i
],
$modifier
)) {
$char
[
$i
] =
$char
;
}
elsif
(
$ignorecase
and (
$char
[
$i
] =~ /\A [\x00-\xFF] \z/oxms) and (Ecyrillic::
uc
(
$char
[
$i
]) ne Ecyrillic::fc(
$char
[
$i
]))) {
if
(CORE::
length
(Ecyrillic::fc(
$char
[
$i
])) == 1) {
$char
[
$i
] =
'['
. Ecyrillic::
uc
(
$char
[
$i
]) . Ecyrillic::fc(
$char
[
$i
]) .
']'
;
}
else
{
$char
[
$i
] =
'(?:'
. Ecyrillic::
uc
(
$char
[
$i
]) .
'|'
. Ecyrillic::fc(
$char
[
$i
]) .
')'
;
}
}
elsif
((
$i
>= 1) and (
$char
[
$i
] =~ /\A [\?\+\*\{] \z/oxms)) {
if
(
$char
[
$i
-1] =~ /\A [\x00-\xFF] \z/oxms) {
}
else
{
$char
[
$i
-1] =
'(?:'
.
$char
[
$i
-1] .
')'
;
}
}
}
$delimiter
=
'/'
;
$end_delimiter
=
'/'
;
$modifier
=~
tr
/i//d;
return
join
''
,
$ope
,
$delimiter
,
$anchor
,
'(?:'
,
@char
,
')'
,
$matched
,
$end_delimiter
,
$modifier
;
}
sub
e_qr_qb {
my
(
$ope
,
$delimiter
,
$end_delimiter
,
$string
,
$modifier
) =
@_
;
my
@char
=
$string
=~ /\G ((?>[^\\]|\\\\)) /oxmsg;
for
(
my
$i
=0;
$i
<=
$#char
;
$i
++) {
if
(0) {
}
elsif
(
$char
[
$i
] eq
'\\\\'
) {
}
elsif
(
$char
[
$i
] =~ /\A [\$\@\/\\] \z/oxms) {
$char
[
$i
] =
'\\'
.
$char
[
$i
];
}
}
$delimiter
=
'/'
;
$end_delimiter
=
'/'
;
return
join
''
,
$ope
,
$delimiter
,
'(?:'
,
@char
,
')'
,
$matched
,
$end_delimiter
,
$modifier
;
}
sub
e_s1 {
my
(
$ope
,
$delimiter
,
$end_delimiter
,
$string
,
$modifier
) =
@_
;
$modifier
||=
''
;
$modifier
=~
tr
/p//d;
if
(
$modifier
=~ /([adlu])/oxms) {
my
$line
= 0;
for
(
my
$i
=0;
my
(
$package
,
$filename
,
$use_line
,
$subroutine
) =
caller
(
$i
);
$i
++) {
if
(
$filename
ne __FILE__) {
$line
=
$use_line
+ (CORE::
substr
(
$_
,0,
pos
(
$_
)) =~
tr
/\n//) + 1;
last
;
}
}
die
qq{Unsupported modifier "$1" used at line $line.\n}
;
}
$slash
=
'div'
;
if
(
$string
eq
''
) {
$modifier
=~
tr
/bB//d;
$modifier
=~
tr
/i//d;
return
join
''
,
$ope
,
$delimiter
,
$end_delimiter
,
$modifier
;
}
elsif
(
$modifier
=~
tr
/bB//d) {
if
(
$delimiter
=~ / [\@:] /oxms) {
my
@char
=
$string
=~ /\G ([\x00-\xFF]) /oxmsg;
my
%octet
=
map
{
$_
=> 1}
@char
;
if
(not
$octet
{
')'
}) {
$delimiter
=
'('
;
$end_delimiter
=
')'
;
}
elsif
(not
$octet
{
'}'
}) {
$delimiter
=
'{'
;
$end_delimiter
=
'}'
;
}
elsif
(not
$octet
{
']'
}) {
$delimiter
=
'['
;
$end_delimiter
=
']'
;
}
elsif
(not
$octet
{
'>'
}) {
$delimiter
=
'<'
;
$end_delimiter
=
'>'
;
}
else
{
for
my
$char
(
qw( ! " $ % & * + - . / = ? ^ ` | ~ )
, "\x00
".."
\x1F
", "
\x7F
", "
\xFF") {
if
(not
$octet
{
$char
}) {
$delimiter
=
$char
;
$end_delimiter
=
$char
;
last
;
}
}
}
}
my
$prematch
=
''
;
return
join
''
,
$ope
,
$delimiter
,
$prematch
,
'(?:'
,
$string
,
')'
,
$matched
,
$end_delimiter
,
$modifier
;
}
my
$ignorecase
= (
$modifier
=~ /i/oxms) ? 1 : 0;
my
$metachar
=
qr/[\@\\|[\]{^]/
oxms;
my
@char
=
$string
=~ /\G((?>
[^\\\$\@\[\(] |
\\ (?>[1-9][0-9]*) |
\\g (?>\s*) (?>[1-9][0-9]*) |
\\g (?>\s*) \{ (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
\\g (?>\s*) \{ (?>\s*) - (?>\s*) (?>[1-9][0-9]*) (?>\s*) \} |
\\x (?>[0-9A-Fa-f]{1,2}) |
\\ (?>[0-7]{2,3}) |
\\c [\x40-\x5F] |
\\x\{ (?>[0-9A-Fa-f]+) \} |
\\o\{ (?>[0-7]+) \} |
\\[bBNpP]\{ (?>[^0-9\}][^\}]*) \} |
\\
$q_char
|
\$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
\$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
\$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
[\$\@]
$qq_variable
|
\$ (?>\s* [0-9]+) |
\$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
\$ \$ (?![\w\{]) |
\$ (?>\s*) \$ (?>\s*)
$qq_variable
|
\[\^ |
\[\: (?>[a-z]+) :\] |
\[\:\^ (?>[a-z]+) :\] |
\(\? |
$q_char
))/oxmsg;
if
(
$delimiter
=~ / [\@:] /oxms) {
my
%octet
=
map
{
$_
=> 1}
@char
;
if
(not
$octet
{
')'
}) {
$delimiter
=
'('
;
$end_delimiter
=
')'
;
}
elsif
(not
$octet
{
'}'
}) {
$delimiter
=
'{'
;
$end_delimiter
=
'}'
;
}
elsif
(not
$octet
{
']'
}) {
$delimiter
=
'['
;
$end_delimiter
=
']'
;
}
elsif
(not
$octet
{
'>'
}) {
$delimiter
=
'<'
;
$end_delimiter
=
'>'
;
}
else
{
for
my
$char
(
qw( ! " $ % & * + - . / = ? ^ ` | ~ )
, "\x00
".."
\x1F
", "
\x7F
", "
\xFF") {
if
(not
$octet
{
$char
}) {
$delimiter
=
$char
;
$end_delimiter
=
$char
;
last
;
}
}
}
}
my
$parens
=
grep
{
$_
eq
'('
}
@char
;
my
$left_e
= 0;
my
$right_e
= 0;
for
(
my
$i
=0;
$i
<=
$#char
;
$i
++) {
if
((
$char
[
$i
] eq
'\L'
) and (
$char
[
$i
+1] eq
'\u'
)) {
@char
[
$i
,
$i
+1] =
@char
[
$i
+1,
$i
];
}
elsif
((
$char
[
$i
] eq
'\U'
) and (
$char
[
$i
+1] eq
'\l'
)) {
@char
[
$i
,
$i
+1] =
@char
[
$i
+1,
$i
];
}
elsif
(
$char
[
$i
] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
$char
[
$i
] = Ecyrillic::octchr($1);
}
elsif
(
$char
[
$i
] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
$char
[
$i
] = Ecyrillic::hexchr($1);
}
elsif
(
$char
[
$i
] =~ /\A \\ ([bBNpP]) ( \{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
$char
[
$i
] = $1 .
'\\'
. $2;
}
elsif
(
$char
[
$i
] =~ /\A \\ ( [pPX] ) \z/oxms) {
$char
[
$i
] = $1;
}
if
(0) {
}
elsif
(
$char
[
$i
] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
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)) {
$char
[
$i
] .=
join
''
,
splice
@char
,
$i
+1, 3;
}
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)) {
$char
[
$i
] .=
join
''
,
splice
@char
,
$i
+1, 2;
}
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)) {
$char
[
$i
] .=
join
''
,
splice
@char
,
$i
+1, 1;
}
}
elsif
(
$char
[
$i
] eq
'['
) {
my
$left
=
$i
;
if
(
$char
[
$i
+1] eq
']'
) {
$i
++;
}
while
(1) {
if
(++
$i
>
$#char
) {
die
__FILE__,
": Unmatched [] in regexp\n"
;
}
if
(
$char
[
$i
] eq
']'
) {
my
$right
=
$i
;
if
(
grep
(/\A [\$\@]/oxms,
@char
[
$left
+1..
$right
-1]) >= 1) {
splice
@char
,
$left
,
$right
-
$left
+1,
sprintf
(
q{@{[Ecyrillic::charlist_qr(%s,'%s')]}
},
join
(
','
,
map
{qq_stuff(
$delimiter
,
$end_delimiter
,
$_
)}
@char
[
$left
+1..
$right
-1]),
$modifier
);
}
else
{
splice
@char
,
$left
,
$right
-
$left
+1, Ecyrillic::charlist_qr(
@char
[
$left
+1..
$right
-1],
$modifier
);
}
$i
=
$left
;
last
;
}
}
}
elsif
(
$char
[
$i
] eq
'[^'
) {
my
$left
=
$i
;
if
(
$char
[
$i
+1] eq
']'
) {
$i
++;
}
while
(1) {
if
(++
$i
>
$#char
) {
die
__FILE__,
": Unmatched [] in regexp\n"
;
}
if
(
$char
[
$i
] eq
']'
) {
my
$right
=
$i
;
if
(
grep
(/\A [\$\@]/oxms,
@char
[
$left
+1..
$right
-1]) >= 1) {
splice
@char
,
$left
,
$right
-
$left
+1,
sprintf
(
q{@{[Ecyrillic::charlist_not_qr(%s,'%s')]}
},
join
(
','
,
map
{qq_stuff(
$delimiter
,
$end_delimiter
,
$_
)}
@char
[
$left
+1..
$right
-1]),
$modifier
);
}
else
{
splice
@char
,
$left
,
$right
-
$left
+1, Ecyrillic::charlist_not_qr(
@char
[
$left
+1..
$right
-1],
$modifier
);
}
$i
=
$left
;
last
;
}
}
}
elsif
(
my
$char
= character_class(
$char
[
$i
],
$modifier
)) {
$char
[
$i
] =
$char
;
}
elsif
(
$ignorecase
and (
$char
[
$i
] =~ /\A [\x00-\xFF] \z/oxms) and (Ecyrillic::
uc
(
$char
[
$i
]) ne Ecyrillic::fc(
$char
[
$i
]))) {
if
(CORE::
length
(Ecyrillic::fc(
$char
[
$i
])) == 1) {
$char
[
$i
] =
'['
. Ecyrillic::
uc
(
$char
[
$i
]) . Ecyrillic::fc(
$char
[
$i
]) .
']'
;
}
else
{
$char
[
$i
] =
'(?:'
. Ecyrillic::
uc
(
$char
[
$i
]) .
'|'
. Ecyrillic::fc(
$char
[
$i
]) .
')'
;
}
}
elsif
(
$char
[
$i
] =~ /\A [<>] \z/oxms) {
if
(
$right_e
<
$left_e
) {
$char
[
$i
] =
'\\'
.
$char
[
$i
];
}
}
elsif
(
$char
[
$i
] eq
'\u'
) {
$char
[
$i
] =
'@{[Ecyrillic::ucfirst qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\l'
) {
$char
[
$i
] =
'@{[Ecyrillic::lcfirst qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\U'
) {
$char
[
$i
] =
'@{[Ecyrillic::uc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\L'
) {
$char
[
$i
] =
'@{[Ecyrillic::lc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\F'
) {
$char
[
$i
] =
'@{[Ecyrillic::fc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\Q'
) {
$char
[
$i
] =
'@{[CORE::quotemeta qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\E'
) {
if
(
$right_e
<
$left_e
) {
$char
[
$i
] =
'>]}'
;
$right_e
++;
}
else
{
$char
[
$i
] =
''
;
}
}
elsif
(
$char
[
$i
] eq
'\Q'
) {
while
(1) {
if
(++
$i
>
$#char
) {
last
;
}
if
(
$char
[
$i
] eq
'\E'
) {
last
;
}
}
}
elsif
(
$char
[
$i
] eq
'\E'
) {
}
elsif
(
$char
[
$i
] =~ /\A \\ (?>\s*) 0 \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \\g (?>\s*) \{ (?>\s*) - (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \\g (?>\s*) \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \\g (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \\ (?>\s*) ((?>[1-9][0-9]*)) \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \$ 0 \z/oxms) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$\$ \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
$char
[
$i
] = e_capture($1);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
$char
[
$i
] = e_capture($1);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:
$qq_bracket
)*? \] ) \z/oxms) {
$char
[
$i
] = e_capture($1.
'->'
.$2);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:
$qq_brace
)*? \} ) \z/oxms) {
$char
[
$i
] = e_capture($1.
'->'
.$2);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
$char
[
$i
] = e_capture($1);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase(Ecyrillic::PREMATCH())]}'
;
}
else
{
$char
[
$i
] =
'@{[Ecyrillic::PREMATCH()]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase(Ecyrillic::MATCH())]}'
;
}
else
{
$char
[
$i
] =
'@{[Ecyrillic::MATCH()]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase(Ecyrillic::POSTMATCH())]}'
;
}
else
{
$char
[
$i
] =
'@{[Ecyrillic::POSTMATCH()]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
$char
[
$i
] = e_capture($1);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A [\$\@].+ /oxms) {
$char
[
$i
] = e_string(
$char
[
$i
]);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
((
$i
>= 1) and (
$char
[
$i
] =~ /\A [\?\+\*\{] \z/oxms)) {
if
(
$char
[
$i
-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
}
else
{
$char
[
$i
-1] =
'(?:'
.
$char
[
$i
-1] .
')'
;
}
}
}
my
$prematch
=
''
;
$modifier
=~
tr
/i//d;
if
(
$left_e
>
$right_e
) {
return
join
''
,
$ope
,
$delimiter
,
$prematch
,
'(?:'
,
@char
,
'>]}'
x (
$left_e
-
$right_e
),
')'
,
$matched
,
$end_delimiter
,
$modifier
;
}
return
join
''
,
$ope
,
$delimiter
,
$prematch
,
'(?:'
,
@char
,
')'
,
$matched
,
$end_delimiter
,
$modifier
;
}
sub
e_s1_q {
my
(
$ope
,
$delimiter
,
$end_delimiter
,
$string
,
$modifier
) =
@_
;
$modifier
||=
''
;
$modifier
=~
tr
/p//d;
if
(
$modifier
=~ /([adlu])/oxms) {
my
$line
= 0;
for
(
my
$i
=0;
my
(
$package
,
$filename
,
$use_line
,
$subroutine
) =
caller
(
$i
);
$i
++) {
if
(
$filename
ne __FILE__) {
$line
=
$use_line
+ (CORE::
substr
(
$_
,0,
pos
(
$_
)) =~
tr
/\n//) + 1;
last
;
}
}
die
qq{Unsupported modifier "$1" used at line $line.\n}
;
}
$slash
=
'div'
;
if
(
$string
eq
''
) {
$modifier
=~
tr
/bB//d;
$modifier
=~
tr
/i//d;
return
join
''
,
$ope
,
$delimiter
,
$end_delimiter
,
$modifier
;
}
elsif
(
$modifier
=~
tr
/bB//d) {
return
e_s1_qb(
$ope
,
$delimiter
,
$end_delimiter
,
$string
,
$modifier
);
}
else
{
return
e_s1_qt(
$ope
,
$delimiter
,
$end_delimiter
,
$string
,
$modifier
);
}
}
sub
e_s1_qt {
my
(
$ope
,
$delimiter
,
$end_delimiter
,
$string
,
$modifier
) =
@_
;
my
$ignorecase
= (
$modifier
=~ /i/oxms) ? 1 : 0;
my
@char
=
$string
=~ /\G((?>
[^\\\[\$\@\/] |
[\x00-\xFF] |
\[\^ |
\[\: (?>[a-z]+) \:\] |
\[\:\^ (?>[a-z]+) \:\] |
[\$\@\/] |
\\ (?:
$q_char
) |
(?:
$q_char
)
))/oxmsg;
for
(
my
$i
=0;
$i
<=
$#char
;
$i
++) {
if
(0) {
}
elsif
(
$char
[
$i
] eq
'['
) {
my
$left
=
$i
;
if
(
$char
[
$i
+1] eq
']'
) {
$i
++;
}
while
(1) {
if
(++
$i
>
$#char
) {
die
__FILE__,
": Unmatched [] in regexp\n"
;
}
if
(
$char
[
$i
] eq
']'
) {
my
$right
=
$i
;
splice
@char
,
$left
,
$right
-
$left
+1, Ecyrillic::charlist_qr(
@char
[
$left
+1..
$right
-1],
$modifier
);
$i
=
$left
;
last
;
}
}
}
elsif
(
$char
[
$i
] eq
'[^'
) {
my
$left
=
$i
;
if
(
$char
[
$i
+1] eq
']'
) {
$i
++;
}
while
(1) {
if
(++
$i
>
$#char
) {
die
__FILE__,
": Unmatched [] in regexp\n"
;
}
if
(
$char
[
$i
] eq
']'
) {
my
$right
=
$i
;
splice
@char
,
$left
,
$right
-
$left
+1, Ecyrillic::charlist_not_qr(
@char
[
$left
+1..
$right
-1],
$modifier
);
$i
=
$left
;
last
;
}
}
}
elsif
(
$char
[
$i
] =~ /\A [\$\@\/\\] \z/oxms) {
$char
[
$i
] =
'\\'
.
$char
[
$i
];
}
elsif
(
my
$char
= character_class(
$char
[
$i
],
$modifier
)) {
$char
[
$i
] =
$char
;
}
elsif
(
$ignorecase
and (
$char
[
$i
] =~ /\A [\x00-\xFF] \z/oxms) and (Ecyrillic::
uc
(
$char
[
$i
]) ne Ecyrillic::fc(
$char
[
$i
]))) {
if
(CORE::
length
(Ecyrillic::fc(
$char
[
$i
])) == 1) {
$char
[
$i
] =
'['
. Ecyrillic::
uc
(
$char
[
$i
]) . Ecyrillic::fc(
$char
[
$i
]) .
']'
;
}
else
{
$char
[
$i
] =
'(?:'
. Ecyrillic::
uc
(
$char
[
$i
]) .
'|'
. Ecyrillic::fc(
$char
[
$i
]) .
')'
;
}
}
elsif
((
$i
>= 1) and (
$char
[
$i
] =~ /\A [\?\+\*\{] \z/oxms)) {
if
(
$char
[
$i
-1] =~ /\A [\x00-\xFF] \z/oxms) {
}
else
{
$char
[
$i
-1] =
'(?:'
.
$char
[
$i
-1] .
')'
;
}
}
}
$modifier
=~
tr
/i//d;
$delimiter
=
'/'
;
$end_delimiter
=
'/'
;
my
$prematch
=
''
;
return
join
''
,
$ope
,
$delimiter
,
$prematch
,
'(?:'
,
@char
,
')'
,
$matched
,
$end_delimiter
,
$modifier
;
}
sub
e_s1_qb {
my
(
$ope
,
$delimiter
,
$end_delimiter
,
$string
,
$modifier
) =
@_
;
my
@char
=
$string
=~ /\G (?>[^\\]|\\\\) /oxmsg;
for
(
my
$i
=0;
$i
<=
$#char
;
$i
++) {
if
(0) {
}
elsif
(
$char
[
$i
] eq
'\\\\'
) {
}
elsif
(
$char
[
$i
] =~ /\A [\$\@\/\\] \z/oxms) {
$char
[
$i
] =
'\\'
.
$char
[
$i
];
}
}
$delimiter
=
'/'
;
$end_delimiter
=
'/'
;
my
$prematch
=
''
;
return
join
''
,
$ope
,
$delimiter
,
$prematch
,
'(?:'
,
@char
,
')'
,
$matched
,
$end_delimiter
,
$modifier
;
}
sub
e_s2_q {
my
(
$ope
,
$delimiter
,
$end_delimiter
,
$string
) =
@_
;
$slash
=
'div'
;
my
@char
=
$string
=~ / \G (?>[^\\]|\\\\|
$q_char
) /oxmsg;
for
(
my
$i
=0;
$i
<=
$#char
;
$i
++) {
if
(0) {
}
elsif
(
$char
[
$i
] =~ /\A \\\\ \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A [\$\@\/\\] \z/oxms) {
$char
[
$i
] =
'\\'
.
$char
[
$i
];
}
}
return
join
''
,
$ope
,
$delimiter
,
@char
,
$end_delimiter
;
}
sub
e_sub {
my
(
$variable
,
$delimiter1
,
$pattern
,
$end_delimiter1
,
$delimiter2
,
$replacement
,
$end_delimiter2
,
$modifier
) =
@_
;
$modifier
||=
''
;
$modifier
=~
tr
/p//d;
if
(
$modifier
=~ /([adlu])/oxms) {
my
$line
= 0;
for
(
my
$i
=0;
my
(
$package
,
$filename
,
$use_line
,
$subroutine
) =
caller
(
$i
);
$i
++) {
if
(
$filename
ne __FILE__) {
$line
=
$use_line
+ (CORE::
substr
(
$_
,0,
pos
(
$_
)) =~
tr
/\n//) + 1;
last
;
}
}
die
qq{Unsupported modifier "$1" used at line $line.\n}
;
}
if
(
$variable
eq
''
) {
$variable
=
'$_'
;
$bind_operator
=
' =~ '
;
}
$slash
=
'div'
;
my
$e_modifier
=
$modifier
=~
tr
/e//d;
my
$r_modifier
=
$modifier
=~
tr
/r//d;
my
$my
=
''
;
if
(
$variable
=~ s/\A \( (?>\s*) ( (?>(?:
local
\b |
my
\b |
our
\b | state \b )?) .+ ) \) \z/$1/oxms) {
$my
=
$variable
;
$variable
=~ s/ (?:
local
\b |
my
\b |
our
\b | state \b ) (?>\s*) //oxms;
$variable
=~ s/ = .+ \z//oxms;
}
(
my
$variable_basename
=
$variable
) =~ s/ [\[\{].* \z//oxms;
$variable_basename
=~ s/ \s+ \z//oxms;
my
$e_replacement
=
''
;
if
(
$e_modifier
>= 1) {
$e_replacement
= e_qq(
''
,
''
,
''
,
$replacement
);
$e_modifier
--;
}
else
{
if
(
$delimiter2
eq
"'"
) {
$e_replacement
= e_s2_q(
'qq'
,
'/'
,
'/'
,
$replacement
);
}
else
{
$e_replacement
= e_qq (
'qq'
,
$delimiter2
,
$end_delimiter2
,
$replacement
);
}
}
my
$sub
=
''
;
if
(
$r_modifier
) {
if
(0) {
}
elsif
(
$modifier
=~ /g/oxms) {
$sub
=
sprintf
(
q<CORE::eval{local $Ecyrillic::re_t=%s; while($Ecyrillic::re_t =~ %s){%s local $^W=0; local $Ecyrillic::re_r=%s; %s$Ecyrillic::re_t="$`$Ecyrillic::re_r$'"; pos($Ecyrillic::re_t)=length "$`$Ecyrillic::re_r"; } return $Ecyrillic::re_t}>
,
$variable
,
(
$delimiter1
eq
"'"
) ?
e_s1_q(
'm'
,
$delimiter1
,
$end_delimiter1
,
$pattern
,
$modifier
) :
e_s1 (
'm'
,
$delimiter1
,
$end_delimiter1
,
$pattern
,
$modifier
),
$s_matched
,
$e_replacement
,
'$Ecyrillic::re_r=CORE::eval $Ecyrillic::re_r; '
x
$e_modifier
,
);
}
else
{
my
$prematch
=
q{$`}
;
$sub
=
sprintf
(
q<(%s =~ %s) ? CORE::eval{%s local $^W=0; local $Ecyrillic::re_r=%s; %s"%s$Ecyrillic::re_r$'" } : %s>
,
$variable
,
(
$delimiter1
eq
"'"
) ?
e_s1_q(
'm'
,
$delimiter1
,
$end_delimiter1
,
$pattern
,
$modifier
) :
e_s1 (
'm'
,
$delimiter1
,
$end_delimiter1
,
$pattern
,
$modifier
),
$s_matched
,
$e_replacement
,
'$Ecyrillic::re_r=CORE::eval $Ecyrillic::re_r; '
x
$e_modifier
,
$prematch
,
$variable
,
);
}
if
(
$bind_operator
=~ / !~ /oxms) {
$sub
=
q{die("$0: Using !~ with s///r doesn't make sense"), }
.
$sub
;
}
}
else
{
if
(0) {
}
elsif
(
$modifier
=~ /g/oxms) {
$sub
=
sprintf
(
q<CORE::eval{local $Ecyrillic::re_n=0; while(%s =~ %s){%s local $^W=0; local $Ecyrillic::re_r=%s; %s%s="$`$Ecyrillic::re_r$'"; pos(%s)=length "$`$Ecyrillic::re_r"; $Ecyrillic::re_n++} return %s$Ecyrillic::re_n}>
,
$variable
,
(
$delimiter1
eq
"'"
) ?
e_s1_q(
'm'
,
$delimiter1
,
$end_delimiter1
,
$pattern
,
$modifier
) :
e_s1 (
'm'
,
$delimiter1
,
$end_delimiter1
,
$pattern
,
$modifier
),
$s_matched
,
$e_replacement
,
'$Ecyrillic::re_r=CORE::eval $Ecyrillic::re_r; '
x
$e_modifier
,
$variable
,
$variable
,
(
$bind_operator
=~ / !~ /oxms) ?
'!'
:
''
,
);
}
else
{
my
$prematch
=
q{$`}
;
$sub
=
sprintf
(
(
$bind_operator
=~ / =~ /oxms) ?
q<(%s%s%s) ? CORE::eval{%s local $^W=0; local $Ecyrillic::re_r=%s; %s%s="%s$Ecyrillic::re_r$'"; 1 } : undef>
:
q<(%s%s%s) ? 1 : CORE::eval{%s local $^W=0; local $Ecyrillic::re_r=%s; %s%s="%s$Ecyrillic::re_r$'"; undef }>
,
$variable
,
$bind_operator
,
(
$delimiter1
eq
"'"
) ?
e_s1_q(
'm'
,
$delimiter1
,
$end_delimiter1
,
$pattern
,
$modifier
) :
e_s1 (
'm'
,
$delimiter1
,
$end_delimiter1
,
$pattern
,
$modifier
),
$s_matched
,
$e_replacement
,
'$Ecyrillic::re_r=CORE::eval $Ecyrillic::re_r; '
x
$e_modifier
,
$variable
,
$prematch
,
);
}
}
if
(
$my
ne
''
) {
$sub
=
"($my, $sub)[1]"
;
}
$sub_variable
=
''
;
$bind_operator
=
''
;
return
$sub
;
}
sub
e_split {
my
(
$ope
,
$delimiter
,
$end_delimiter
,
$string
,
$modifier
) =
@_
;
$modifier
||=
''
;
$modifier
=~
tr
/p//d;
if
(
$modifier
=~ /([adlu])/oxms) {
my
$line
= 0;
for
(
my
$i
=0;
my
(
$package
,
$filename
,
$use_line
,
$subroutine
) =
caller
(
$i
);
$i
++) {
if
(
$filename
ne __FILE__) {
$line
=
$use_line
+ (CORE::
substr
(
$_
,0,
pos
(
$_
)) =~
tr
/\n//) + 1;
last
;
}
}
die
qq{Unsupported modifier "$1" used at line $line.\n}
;
}
$slash
=
'div'
;
if
(
$modifier
=~
tr
/bB//d) {
return
join
''
,
'split'
,
$ope
,
$delimiter
,
$string
,
$end_delimiter
,
$modifier
;
}
my
$ignorecase
= (
$modifier
=~ /i/oxms) ? 1 : 0;
my
$metachar
=
qr/[\@\\|[\]{^]/
oxms;
my
@char
=
$string
=~ /\G((?>
[^\\\$\@\[\(] |
\\x (?>[0-9A-Fa-f]{1,2}) |
\\ (?>[0-7]{2,3}) |
\\c [\x40-\x5F] |
\\x\{ (?>[0-9A-Fa-f]+) \} |
\\o\{ (?>[0-7]+) \} |
\\[bBNpP]\{ (?>[^0-9\}][^\}]*) \} |
\\
$q_char
|
\$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} |
\$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} |
\$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} |
[\$\@]
$qq_variable
|
\$ (?>\s* [0-9]+) |
\$ (?>\s*) \{ (?>\s* [0-9]+ \s*) \} |
\$ \$ (?![\w\{]) |
\$ (?>\s*) \$ (?>\s*)
$qq_variable
|
\[\^ |
\[\: (?>[a-z]+) :\] |
\[\:\^ (?>[a-z]+) :\] |
\(\? |
$q_char
))/oxmsg;
my
$left_e
= 0;
my
$right_e
= 0;
for
(
my
$i
=0;
$i
<=
$#char
;
$i
++) {
if
((
$char
[
$i
] eq
'\L'
) and (
$char
[
$i
+1] eq
'\u'
)) {
@char
[
$i
,
$i
+1] =
@char
[
$i
+1,
$i
];
}
elsif
((
$char
[
$i
] eq
'\U'
) and (
$char
[
$i
+1] eq
'\l'
)) {
@char
[
$i
,
$i
+1] =
@char
[
$i
+1,
$i
];
}
elsif
(
$char
[
$i
] =~ /\A \\o \{ ([0-7]+) \} \z/oxms) {
$char
[
$i
] = Ecyrillic::octchr($1);
}
elsif
(
$char
[
$i
] =~ /\A \\x \{ ([0-9A-Fa-f]+) \} \z/oxms) {
$char
[
$i
] = Ecyrillic::hexchr($1);
}
elsif
(
$char
[
$i
] =~ /\A \\ ([bBNpP]) ( \{ ([^0-9\}][^\}]*) \} ) \z/oxms) {
$char
[
$i
] = $1 .
'\\'
. $2;
}
elsif
(
$char
[
$i
] =~ /\A \\ ( [pPX] ) \z/oxms) {
$char
[
$i
] = $1;
}
if
(0) {
}
elsif
(
$char
[
$i
] =~ /\A (?: \\ [0-7]{2,3} | \\x [0-9A-Fa-f]{1,2}) \z/oxms) {
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)) {
$char
[
$i
] .=
join
''
,
splice
@char
,
$i
+1, 3;
}
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)) {
$char
[
$i
] .=
join
''
,
splice
@char
,
$i
+1, 2;
}
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)) {
$char
[
$i
] .=
join
''
,
splice
@char
,
$i
+1, 1;
}
}
elsif
(
$char
[
$i
] eq
'['
) {
my
$left
=
$i
;
if
(
$char
[
$i
+1] eq
']'
) {
$i
++;
}
while
(1) {
if
(++
$i
>
$#char
) {
die
__FILE__,
": Unmatched [] in regexp\n"
;
}
if
(
$char
[
$i
] eq
']'
) {
my
$right
=
$i
;
if
(
grep
(/\A [\$\@]/oxms,
@char
[
$left
+1..
$right
-1]) >= 1) {
splice
@char
,
$left
,
$right
-
$left
+1,
sprintf
(
q{@{[Ecyrillic::charlist_qr(%s,'%s')]}
},
join
(
','
,
map
{qq_stuff(
$delimiter
,
$end_delimiter
,
$_
)}
@char
[
$left
+1..
$right
-1]),
$modifier
);
}
else
{
splice
@char
,
$left
,
$right
-
$left
+1, Ecyrillic::charlist_qr(
@char
[
$left
+1..
$right
-1],
$modifier
);
}
$i
=
$left
;
last
;
}
}
}
elsif
(
$char
[
$i
] eq
'[^'
) {
my
$left
=
$i
;
if
(
$char
[
$i
+1] eq
']'
) {
$i
++;
}
while
(1) {
if
(++
$i
>
$#char
) {
die
__FILE__,
": Unmatched [] in regexp\n"
;
}
if
(
$char
[
$i
] eq
']'
) {
my
$right
=
$i
;
if
(
grep
(/\A [\$\@]/oxms,
@char
[
$left
+1..
$right
-1]) >= 1) {
splice
@char
,
$left
,
$right
-
$left
+1,
sprintf
(
q{@{[Ecyrillic::charlist_not_qr(%s,'%s')]}
},
join
(
','
,
map
{qq_stuff(
$delimiter
,
$end_delimiter
,
$_
)}
@char
[
$left
+1..
$right
-1]),
$modifier
);
}
else
{
splice
@char
,
$left
,
$right
-
$left
+1, Ecyrillic::charlist_not_qr(
@char
[
$left
+1..
$right
-1],
$modifier
);
}
$i
=
$left
;
last
;
}
}
}
elsif
(
my
$char
= character_class(
$char
[
$i
],
$modifier
)) {
$char
[
$i
] =
$char
;
}
elsif
((
$char
[
$i
] eq
'^'
) and (
$modifier
!~ /m/oxms)) {
$modifier
.=
'm'
;
}
elsif
(
$ignorecase
and (
$char
[
$i
] =~ /\A [\x00-\xFF] \z/oxms) and (Ecyrillic::
uc
(
$char
[
$i
]) ne Ecyrillic::fc(
$char
[
$i
]))) {
if
(CORE::
length
(Ecyrillic::fc(
$char
[
$i
])) == 1) {
$char
[
$i
] =
'['
. Ecyrillic::
uc
(
$char
[
$i
]) . Ecyrillic::fc(
$char
[
$i
]) .
']'
;
}
else
{
$char
[
$i
] =
'(?:'
. Ecyrillic::
uc
(
$char
[
$i
]) .
'|'
. Ecyrillic::fc(
$char
[
$i
]) .
')'
;
}
}
elsif
(
$char
[
$i
] =~ /\A ([<>]) \z/oxms) {
if
(
$right_e
<
$left_e
) {
$char
[
$i
] =
'\\'
.
$char
[
$i
];
}
}
elsif
(
$char
[
$i
] eq
'\u'
) {
$char
[
$i
] =
'@{[Ecyrillic::ucfirst qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\l'
) {
$char
[
$i
] =
'@{[Ecyrillic::lcfirst qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\U'
) {
$char
[
$i
] =
'@{[Ecyrillic::uc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\L'
) {
$char
[
$i
] =
'@{[Ecyrillic::lc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\F'
) {
$char
[
$i
] =
'@{[Ecyrillic::fc qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\Q'
) {
$char
[
$i
] =
'@{[CORE::quotemeta qq<'
;
$left_e
++;
}
elsif
(
$char
[
$i
] eq
'\E'
) {
if
(
$right_e
<
$left_e
) {
$char
[
$i
] =
'>]}'
;
$right_e
++;
}
else
{
$char
[
$i
] =
''
;
}
}
elsif
(
$char
[
$i
] eq
'\Q'
) {
while
(1) {
if
(++
$i
>
$#char
) {
last
;
}
if
(
$char
[
$i
] eq
'\E'
) {
last
;
}
}
}
elsif
(
$char
[
$i
] eq
'\E'
) {
}
elsif
(
$char
[
$i
] =~ /\A \$ 0 \z/oxms) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ \{ (?>\s*) 0 (?>\s*) \} \z/oxms) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$\$ \z/oxms) {
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?>[1-9][0-9]*)) \z/oxms) {
$char
[
$i
] = e_capture($1);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ \{ (?>\s*) ((?>[1-9][0-9]*)) (?>\s*) \} \z/oxms) {
$char
[
$i
] = e_capture($1);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \[ (?:
$qq_bracket
)*? \] ) \z/oxms) {
$char
[
$i
] = e_capture($1.
'->'
.$2);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) ( \{ (?:
$qq_brace
)*? \} ) \z/oxms) {
$char
[
$i
] = e_capture($1.
'->'
.$2);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ ((?> \$ [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* )) \z/oxms) {
$char
[
$i
] = e_capture($1);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A ( \$` | \$\{`\} | \$ (?>\s*) PREMATCH | \$ (?>\s*) \{ (?>\s*) PREMATCH (?>\s*) \} | \$ (?>\s*) \{\^PREMATCH\} ) \z/oxmsgc) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase(Ecyrillic::PREMATCH())]}'
;
}
else
{
$char
[
$i
] =
'@{[Ecyrillic::PREMATCH()]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A ( \$& | \$\{&\} | \$ (?>\s*) MATCH | \$ (?>\s*) \{ (?>\s*) MATCH (?>\s*) \} | \$ (?>\s*) \{\^MATCH\} ) \z/oxmsgc) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase(Ecyrillic::MATCH())]}'
;
}
else
{
$char
[
$i
] =
'@{[Ecyrillic::MATCH()]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A ( \$ (?>\s*) POSTMATCH | \$ (?>\s*) \{ (?>\s*) POSTMATCH (?>\s*) \} | \$ (?>\s*) \{\^POSTMATCH\} ) \z/oxmsgc) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase(Ecyrillic::POSTMATCH())]}'
;
}
else
{
$char
[
$i
] =
'@{[Ecyrillic::POSTMATCH()]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ (?>\s*) \{ ((?> \s* [A-Za-z_][A-Za-z0-9_]*(?: ::[A-Za-z_][A-Za-z0-9_]*)* \s* )) \} \z/oxms) {
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
. $1 .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A \$ (?>\s*) \{ ( .+ ) \} \z/oxms) {
$char
[
$i
] = e_capture($1);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
(
$char
[
$i
] =~ /\A [\$\@].+ /oxms) {
$char
[
$i
] = e_string(
$char
[
$i
]);
if
(
$ignorecase
) {
$char
[
$i
] =
'@{[Ecyrillic::ignorecase('
.
$char
[
$i
] .
')]}'
;
}
}
elsif
((
$i
>= 1) and (
$char
[
$i
] =~ /\A [\?\+\*\{] \z/oxms)) {
if
(
$char
[
$i
-1] =~ /\A (?:[\x00-\xFF]|\\[0-7]{2,3}|\\x[0-9-A-Fa-f]{1,2}) \z/oxms) {
}
else
{
$char
[
$i
-1] =
'(?:'
.
$char
[
$i
-1] .
')'
;
}
}
}
$modifier
=~
tr
/i//d;
if
(
$left_e
>
$right_e
) {
return
join
''
,
'Ecyrillic::split'
,
$ope
,
$delimiter
,
@char
,
'>]}'
x (
$left_e
-
$right_e
),
$end_delimiter
,
$modifier
;
}
return
join
''
,
'Ecyrillic::split'
,
$ope
,
$delimiter
,
@char
,
$end_delimiter
,
$modifier
;
}
sub
e_split_q {
my
(
$ope
,
$delimiter
,
$end_delimiter
,
$string
,
$modifier
) =
@_
;
$modifier
||=
''
;
$modifier
=~
tr
/p//d;
if
(
$modifier
=~ /([adlu])/oxms) {
my
$line
= 0;
for
(
my
$i
=0;
my
(
$package
,
$filename
,
$use_line
,
$subroutine
) =
caller
(
$i
);
$i
++) {
if
(
$filename
ne __FILE__) {
$line
=
$use_line
+ (CORE::
substr
(
$_
,0,
pos
(
$_
)) =~
tr
/\n//) + 1;
last
;
}
}
die
qq{Unsupported modifier "$1" used at line $line.\n}
;
}
$slash
=
'div'
;
if
(
$modifier
=~
tr
/bB//d) {
return
join
''
,
'split'
,
$ope
,
$delimiter
,
$string
,
$end_delimiter
,
$modifier
;
}
my
$ignorecase
= (
$modifier
=~ /i/oxms) ? 1 : 0;
my
@char
=
$string
=~ /\G((?>
[^\\\[] |
[\x00-\xFF] |
\[\^ |
\[\: (?>[a-z]+) \:\] |
\[\:\^ (?>[a-z]+) \:\] |
\\ (?:
$q_char
) |
(?:
$q_char
)
))/oxmsg;
for
(
my
$i
=0;
$i
<=
$#char
;
$i
++) {
if
(0) {
}
elsif
(
$char
[
$i
] eq
'['
) {
my
$left
=
$i
;
if
(
$char
[
$i
+1] eq
']'
) {
$i
++;
}
while
(1) {
if
(++
$i
>
$#char
) {
die
__FILE__,
": Unmatched [] in regexp\n"
;
}
if
(
$char
[
$i
] eq
']'
) {
my
$right
=
$i
;
splice
@char
,
$left
,
$right
-
$left
+1, Ecyrillic::charlist_qr(
@char
[
$left
+1..
$right
-1],
$modifier
);
$i
=
$left
;
last
;
}
}
}
elsif
(
$char
[
$i
] eq
'[^'
) {
my
$left
=
$i
;
if
(
$char
[
$i
+1] eq
']'
) {
$i
++;
}
while
(1) {
if
(++
$i
>
$#char
) {
die
__FILE__,
": Unmatched [] in regexp\n"
;
}
if
(
$char
[
$i
] eq
']'
) {
my
$right
=
$i
;
splice
@char
,
$left
,
$right
-
$left
+1, Ecyrillic::charlist_not_qr(
@char
[
$left
+1..
$right
-1],
$modifier
);
$i
=
$left
;
last
;
}
}
}
elsif
(
my
$char
= character_class(
$char
[
$i
],
$modifier
)) {
$char
[
$i
] =
$char
;
}
elsif
((
$char
[
$i
] eq
'^'
) and (
$modifier
!~ /m/oxms)) {
$modifier
.=
'm'
;
}
elsif
(
$ignorecase
and (
$char
[
$i
] =~ /\A [\x00-\xFF] \z/oxms) and (Ecyrillic::
uc
(
$char
[
$i
]) ne Ecyrillic::fc(
$char
[
$i
]))) {
if
(CORE::
length
(Ecyrillic::fc(
$char
[
$i
])) == 1) {
$char
[
$i
] =
'['
. Ecyrillic::
uc
(
$char
[
$i
]) . Ecyrillic::fc(
$char
[
$i
]) .
']'
;
}
else
{
$char
[
$i
] =
'(?:'
. Ecyrillic::
uc
(
$char
[
$i
]) .
'|'
. Ecyrillic::fc(
$char
[
$i
]) .
')'
;
}
}
elsif
((
$i
>= 1) and (
$char
[
$i
] =~ /\A [\?\+\*\{] \z/oxms)) {
if
(
$char
[
$i
-1] =~ /\A [\x00-\xFF] \z/oxms) {
}
else
{
$char
[
$i
-1] =
'(?:'
.
$char
[
$i
-1] .
')'
;
}
}
}
$modifier
=~
tr
/i//d;
return
join
''
,
'Ecyrillic::split'
,
$ope
,
$delimiter
,
@char
,
$end_delimiter
,
$modifier
;
}
sub
carp {
my
(
$package
,
$filename
,
$line
) =
caller
(1);
print
STDERR
"@_ at $filename line $line.\n"
;
}
sub
croak {
my
(
$package
,
$filename
,
$line
) =
caller
(1);
print
STDERR
"@_ at $filename line $line.\n"
;
die
"\n"
;
}
sub
cluck {
my
$i
= 0;
my
@cluck
= ();
while
(
my
(
$package
,
$filename
,
$line
,
$subroutine
) =
caller
(
$i
)) {
push
@cluck
,
"[$i] $filename($line) $package::$subroutine\n"
;
$i
++;
}
print
STDERR CORE::
reverse
@cluck
;
print
STDERR
"\n"
;
print
STDERR
@_
;
}
sub
confess {
my
$i
= 0;
my
@confess
= ();
while
(
my
(
$package
,
$filename
,
$line
,
$subroutine
) =
caller
(
$i
)) {
push
@confess
,
"[$i] $filename($line) $package::$subroutine\n"
;
$i
++;
}
print
STDERR CORE::
reverse
@confess
;
print
STDERR
"\n"
;
print
STDERR
@_
;
die
"\n"
;
}
1;