Shift-JISeLXg𐳂
ŋ߂̍XV
2005-03-26: uŏɁvAXML{vt@C2łɊÂA኱ǋLB 
2005-03-09: uŏɁvA͂኱CB 
2003-06-24: Shift-JIS̊܂ރt@C/pX 
2003-05-31: uŏɁvAuVtgJISvȂǂ̕\LɂāB 
2003-05-24: CP932d`̕ϊ 
2002-08-30: Perl 5.8.0 ɂāB 
2002-01-17: ɑ΂鐳K\ 
2001-12-15: ShiftJIS::Collate  overrideCJK p[^p~Ƃɔ {ꕶёւ̏B 
ŏ 
肪ȃG[ 
G[ԈႢh΍ 
񃊃e̍ 
K\ƃ}b` 
O[o}b` 
At@xbg̑啶Ə 
ɑ΂鐳K\ 
O̕ϊ 
CP932d`̕ϊ 
𐔂 
Pʂɕ 
낢ȕ 
̒Ő؂肻낦 
{ꕶёւ 
Shift-JIS̊܂ރt@C/pX 
ŏ
{̕R[hɂ͂̂̂gĂ܂BxʓIȂ̂ȂAǂgĂ悢ł傤iǂ̕R[hŕĂ邩̏񂪎ꂳȂ΁jB
Ⴆ΁A{Windowsł́AłDOSłShift-JISgĂ܂BꍇA̓rł킴킴EUC-JPUTF-8ɕϊƂʓ|łBfobÔƂAu̒iKł͂̕ϐɂ͉Ă̂vo͂ē_̂͂悭s܂ÂƂEUC-JPƂĎ߂ĂAƂ͎Ԃǂł傤B͂o͂Shift-JISōsȂȂŜShift-JIŜ܂܈炫ƕ֗ł傤B
F "VtgJIS", "Shift_JIS", "Shift-JIS" Ȃǂ̕\L̈ႢɂĂ͂悭킩Ă܂B̂Ƃ땪Ă邱Ƃ́F
JIS X 0208:1997̕1iVtg\jɂ́AuQlvƂāu̕\͒ʏgVtgJISR[hhƌĂ΂Ăv̋Lq܂B 
IANA  CHARACTER SETS ɂ́AShift_JIS  Windows-31J Ƃʂɓo^Ă܂B܂AShift_JISɂāAuCCSiWjJIS X0201:1997JIS X0208:1997łASȒ`JIS X 0208:1997̕1ɎĂBvƋLĂ܂B 
W3C  XML Japanese Profile ɂ́AShift-JISUnicodeւ̕ϊ\|̋Lڂ܂BXML Japanese Profile (Second Edition)ł́AUnicode ConsortiumŌJĂMicrosoft CP932̕ϊ\ɂcharset̖ "x-sjis-cp932"  "Windows-31J" ɕύXĂ܂B 
MicrosoftЂ Global Dev ł́ACodepage 932  "Japanese Shift-JIS" ƒLĂ܂B 
AShift-JISɂ͂̕ȂāAƂƂoOG[╶̌ƂȂ܂BȂƂȂȂ̂ł傤B
Perl͐䕶i܂ރoCif[^ł琳ł悤ɐ݌vĂ̂ŁAXNvgeLXgShift-JISŏ炢ŖɂȂ邱Ƃ͂܂B
AperlXNvg߂Ƃ́iʏjoCgPʂŒׂ̂ŁAShift-JIŜ悤ȃ}`oCg܂ޕ͂̂܂܂ł͒ڗł܂B
Ƃ΁AShift-JIS '' Ƃ́A16i82 A0ƂQoCgŕ\܂B "\x82\xA0" ƏĂperlɂƂĂ͓łBꂪ{́icountryj{́ilanguagejłƂAShift-JISŏĂicharsetjƂ͂ǂɂ܂܂Ă܂B
̂߁AShift-JISŏƂɂ́Aperľ󂯂Ȃ悤ɏĂȂ΂Ȃ܂B̔źAvO}ĂȂ΂Ȃ܂B̋̕Lq́Â悤ȎԂĂAShift-JISp邱ƂɈӋ`ƍlĂlɂ͎QlɂȂ邩܂B
ȎԂ|ȂĺA 
Perl 5.8.xȍ~gB 
_Fperl5-porters@perl.org ŃT|[gĂB 
_FƓ̍lA]̓{ꏈƂ͑eȂƂ낪iƂÂċCɂȂȂȂ邩ȂjB 
jperlgB 
_FShift-JIS 𕶎ƂĒڈƂłB 
_F݁AێlȂB 
R[hUTF-8EUC-JPɕϊĂ珈B 
_FPerl 5.8.xȍ~łȂĂ삷ϊp̃W[(.pm)⃉Cu(.pl)낢\B 
_FShift-JISقǈȂɂĂA}`oCgVOoCgƋʂAƂɈꕶƂď͖̂ʓ|łB 
 ƂΏƂق悢ł傤B̃vO͗LȂ̂ŁAT΂ł傤A͂ɂ͎܂B
ȂA̕ɏĂ鎖Ał߂Ȃ@Ȃ̂ŁÁÂłǂ݉B̕@ɂĉ^₪ƂĂAɂđ̂ƂŎ₷ƁAłȂĂ̂ƁAƔł傤BƂāAɂuȂŉB
Shift-JISgƂɂ肪ȁiHjG[
Shift-JISɂ́AQoCg [@-~]iASCII 10i64-126j͈̔͂ɓ̂܂BASCIÍAperlɂƂēʂȈӖƂ邽߁A΂΃G[̌ƂȂ܂BShift-JISł́AQoCg̑QoCǵA[\x40-\x7E\x80-\xFC])͈̔͂ɂ邽߁A18863AR̂P̕炩̖NƂ܂B
ɁAShift-JISgƂɋN肪ȃG[Ƃ̌܂BG[bZ[Wperl̈Ⴂio[Wǂ̃vbgtH[p̂̂ł邩jɂ葽̈Ⴂ邩܂B
G[ɂȂȂĂAA҂悤ȓȂŁA܂ȂƂ܂B̏ꍇAG[oȂAŒTȂ΂ȂȂȂ邽߃oO͂΂΍łB
ł̓G[ɑ΂΍͒񎦂܂B΍͂Ƃł܂Ƃ߂ď܂B
ȂAɂ͕R[hEUC-JPɂĂN悤ȖG[͎܂B{IɁAEUC-JPȂNȂAShift-JIŜƂɂ͋N悤ȎɌ܂B
G[ɂ͂ȂȂǕiPj 
Ⴆ΁A"\" Ƃ "\" ƂeN܂B "" Ƃ "" ɂȂ܂B́A"\"  "\"̑̕QoCg \ ł邽߁A_uNI[g̒ł͎̃̕GXP[v邱ƂɂȂ̂ŁA\  0x955C8EA6 łĂANI[ǧʂ "\"  0x958EA6 ƂȂ邩łB'\' ƂΕ͋N܂񂪁AVONI[głhȂG[܂ijB 
G[ɂ͂ȂȂǕiQj 
Ⴆ΁A"~\\500" Ƃeł́A\ EĂ܂܂B́A'~\\500'  q(~\\500) ȂǂƂĂhƂł܂B \\ ƂA \ PɂȂĂ܂ƂK邩łB 
NI[gNI[gZq̒ł́AɃNI[gƓ܂߂悤ɁA\ ɂGXP[vt΃NI[g̏I[ł͂ȂÄꕔƂ݂Ȃ܂B̂߁A\\  \ ̕\GXP[vɂȂ܂B̓NI[g̎n[EI[ɂĂƂłB
G[ɂ͂ȂȂǕiRj 
Ⴆ΁A"ۏ\net" ƂeN܂B "ۥ
et" ̂悤ɓrŉsĂ܂܂B́A"\" ̑QoCg \ ł邽߁A_uNI[g̒ł͎ 'n' ƍ킹\n̂Ȃ킿s\^Ƃĉ߂邩łB 
G[ɂ͂ȂȂǕiSj 
Ⴆ΁A"@ARGV" ƂeN܂B́A"@"iSpXy[Xj̑QoCg @ ł邽߁A_uNI[g̒ł͎ ARGV ƍ킹 "@ARGV" ƂzƂĕϐWJsłB@ARGV̂悤ɕK`悤ȔzȂAWJ܂Aʂ̏ꍇł̓G[ɂȂ邩܂i͎QƁjB 
In string, @dog now must be written as \@dog (Perl 5.6.0܂) 
u̒ł́A@dog͍\@dogƏȂ΂ȂȂv 
Oł݂悤ɁASpXy[X "@"̑QoCg @ ł邽߁A̕ƍ킹Ĕzł邩̂悤ɉ߂悤Ƃ܂B"@dog" ̂悤ȏꍇA@dog Ƃz񂪒`Ă΂pĕϐWJ܂A`ĂȂꍇAG[bZ[Wo܂B 
``now must be written as''u͂Ȃ΂ȂȂvƂ́APerl4܂ł͔z̕ϐWJ͍sȂ߁A"hoge@foo.bar" ̂悤ȏ邱Ƃł̂A Perlł @foo WJĂ܂̂ŁAӂN邽߃G[o悤ɂĂ悤łiPerl̂z̓WJT|[gĂAG[oƂȂAقēWJ邾܂BQƁjB
"@\dog" Ƃ΂Ƃӌ܂A\d ^ƂēʈӖȂ߂ɂ܂̂łāiPerl 5.6ȍ~ł́Ax Unrecognized escape \d passed through uFłȂGXP[v \d nꂽvN܂jAႦ "ԁ@\flower" ̂Ƃ́A\f y[WƂĉ߂A܂B
Possible unintended interpolation of @dog in string (Perl 5.6.1ȍ~) 
̒ŁA@dog\ɓWJ 
OƓA"@dog" łAPerl 5.6.1iActivePerl 626jȍ~ł́A`ĂȂzłقēWJ܂Bz @dog WĴŁA"\x81" ƓɂȂ܂B 
̓G[ł͂ȂAxɂȂ܂B
Can't find string terminator '"' anywhere before EOF 
uI[ '"'t@C̏I EOF ܂łɌȂv 
Ⴆ΁A"Ή\" ̂悤ȃeł́A'\' ̑QoCg \ ł邽߁A " GXP[vĂ܂܂B̂perĺA " ̓NI[g̏I[Ƃ݂͂ȂɁA񂪂ɑƍlĂ܂܂Bȍ~AXNvg̒ " ̕S܂܂Ȃ΁Â悤ɃG[񍐂܂B 
qq{ "{" }̂悤ȏꍇɂӂȂ΂Ȃ܂B"{" ̑oCg { Ȃ̂ŁÂ܂܂ł { }̃lXgĂ܂Al̃G[܂B
Bareword found where operator expected 
ǔꂪZqĂقʒuɌv 
Ⴆ΁Aprint "<img alt=\"Ή\\" height=115 width=150>"; ̂悤ȏꍇA\" ɂp̃GXP[v́A\ ̑QoCg\̂߁A\\ " Ƃgݍ킹ɂȂAGXP[vłĂ܂B̂߁ÃéAperl猩ƁA"<img alt=\"Ή\\" ŏIĂ܂B̂߁AěɁAheight ƂǔviNI[gň͂܂ĂȂj悤ɂ݂āAɂ͗̌ł͂ȂAZqׂł͂ȂHperl͍l܂B 
Unrecognized character \x82 
uFȂ \x82v 
́AASCII₻̑̕ǔvɂƂɏo郁bZ[WłB"Ή\" ̂悤ȃeāÂƂ "Ȃł" ̂悤ȃeƂAOƓRN̂łB 
܂Aq{}b`} ̂悤ȏꍇɂA'}' ̑oCg } Ȃ̂ŁA{ } ̃JbR͂ŏIĂ܂AlȃG[ɂȂ܂B
}b`Ȃ͂Ȃ̂Ƀ}b`iPj 
"J" =~ /|bg/ ̓}b`܂B́A'|' ̑oCg | Ȃ̂ŁA/|bg/  /\x83|bg/ Ƃ݂ȂA\x83 }b`΂悢łB 
}b`Ȃ͂Ȃ̂Ƀ}b`iQj 
"Z" =~ /Z/ ̓}b`܂B́A'Z' ̑oCg 'Z' łBoCgAt@xbgɂȂ镶ɂ͒ӂKvłB 
}b`͂Ȃ̂Ƀ}b`ȂiPj 
"^]Ƌ" =~ /^]/ ̓}b`܂B́A'^' ̑oCg '^'Ȃ̂ŁA/^]/  /\x89^]/ Ƃ݂ȂA̎n ^ ̑O \x89 ͂ȂłB 
Search pattern not terminated 
uT[`p^[IȂv 
́A/\/ ̂悤ɁAoCg \ ł镶ŃT[`p^[I点悤ƂƂɋN܂B}b`Zq̏I[ / GXP[vĂ܂̂ŁAT[`p^[ɐɑ悤ɉ߂܂B̐ɂx/͂܂H 
ƂŁAʂ̃G[ł傤B
Substitution replacement not terminated 
uu̒u񂪏IȂv 
uZq s/PATTERN/REPLACEMENT/̌`Ƃ˂΂Ȃ܂B s/\//; ̂悤ɁAoCg \ ł镶PATTERNI点悤ƂƂɂ̃G[N܂B}b`Zq̏I[ / GXP[vĂ܂̂ŁAPATTERNɐɑ悤ɉ߂܂B̂perĺAPATTERN \/ ̕łƍlARԖڂ/̐REPLACEMENTɈႢȂƎv̂łA̐ɂx/͂܂H 
ƂŁAʂ̃G[ł傤B
unmatched [ ] in regexp 
uK\Ƀ}b`Ȃ [ ] v 
Ⴆ΁A/v[/ ł̓G[N܂B '[' ̑oCg [ Ȃ̂ŁA/v[/  /v\x81[\x83\x8B/ Ƃ݂ȂAperl͕NX̂ł͂ȂƎv܂BNX̏I ] Ȃ̂ŃG[ɂȂ܂B 
G[ɂ͂ȂȂǕiTj 
Ⴆ΁Alc('ACEGI')́A'acegi'Ԃ܂BShift-JIŜQoCg̒ɂ́AQoCgASCIIŉpɓ̂܂Bڂ̓At@xbg̑啶ƏB 
G[ԈႢh΍
ȏ̂悤ȃG[hɂ͂܂܂ȕ@l܂BႦ΁A"\\" Ə΂ȂǂƂĂ܂B񂻂ł܂܂B̂߂ɂ͂ǂ̌̕ \ ΂mKv܂B͕R[h\ΈꔭŖ炩łB
cȂǂƂʓ|ȂƂɂȂȂlAR[h\Ȃ񂩁iȂƂɂȂ悤ȕ炢́jËLĂ܂΂Ƃ悤ȐlɂƂẮAmɂŉɂȂƎv܂BÂ悤Ȑlɂ́Aȃy[WɂKvq}Ȃł傤B
ŁÂ悤ȃy[W킴킴ɂ悤ȐĺAR[h\ׂȂЂƂƉ肵܂BʂɂƂĔ邱Ƃ͂܂BAԂɂނ܂ԈvO𕽋CōĂẮAɃN[pCԂĂd܂B
񃊃e̍
悭mĂ˂΂ȂȂƂ́A\ ƂGXP[vṕ̕AϐWJ⃁^̉߂肸ƑO̒iKł܂܂ȉeyڂƂƂłB̂߁Aǂf[^mɕϐ̒Ɏ߂邩lKv܂Bϐ̓Ɏ߂Ă܂΁APerlf[^K؂ɊǗĂ܂B悭mĂ $str = "\" ̕Aϐ$strɑȑOA_uNH[gň͂񂾎_łłɕĂƍlׂłBłɕf[^āADʂ͂܂B
qAhLg͈S̍@łBAI[VONH[gň͂łȂĂ͂Ȃ܂B_uNH[gň͂񂾂ANH[gtȂł́A\ʕϐWJ⃁^̉߂hƂł܂B
VONH[gŏI[͂񂾃qAhLgł́AϐWJ⃁^̉߂͉N܂BAI[ȉꍇ "\nEOF\n"jTƂs܂BqAhLggƕɉs܂AchompŏƂł傤B
̗ $str = 'ɃeLXg' Ɠ悤ɓ܂A̓eɂĖ肪N܂BƂɃełƊ҂ł܂B
TvR[h 
chomp($str = << 'EOF');
ɃeLXg
EOF

$src = << 'EOF';
  $path = "C:\\path\\file";
  open FH, $path;
EOF

̕xɍ肽΁AsplitŕƗeՂɍ܂B
TvR[h 
($name, $career, $age, $memo) = split "\n", << 'EOF';
cY
vO}
O\
啟DłB  ͂܂ۂ܂ȂB
EOF

Ȍɏ΁A󔒕A\iQoCgɊ܂܂Ă͍̂\ȂjAуJbR܂܂ȂƂŁAqw() gƂł܂BႦ΁A@str = qw(\ Ή\ );̂悤ɋ󔒂ăJbR̃GXP[vh܂B@str = qw(\ Ή\);̂悤ɋ󔒂ȂƃG[̌łB
P̕鎞łAӂۃJbRň͂ŃXgReLXgAEӂXCXɂ邩Ȃ΂Ȃ܂B́Aił́jqw//  split(' ', q//) ̗LƂĎĂ邩łBȂAPerl 5.6ł̓XgƓɂȂĂ悤łB
TvR[h 
($str) =  qw(SO\ );
 $str  = (qw/SO\ /)[0];
 $str  =  qw/SO\ /; # Perl 5.6

K\ƃ}b`
K\̃^͑̂ŁAK\̒Shift-JIS̕𖄂߂ނ͓̂ł͂܂BႦ΁A/\QΉ\/ ł̓G[ɂȂ܂B́A/ / ͈̔͂̌肪^ɍsA̎_ŃG[̂ŁA\Q ̌ʂyڂƂłȂłB܂A/\QΉ\\E/ ͍Is܂B́AΉ\\E Ƃ܂ނ̂ɂ}b`܂B́A\\ ƂA邽߁A\E FȂł傤iԂjB
̂߁AϐɓāA}b`ZquZq̒œWJƂ낵łB̂Ƃ{ꕶ͗\quotemeta ֐ŏĂ܂B
TvR[h 
$pat = quotemeta +(qw/ \ /)[0];
$str =~ /$pat\d+/; # \1, \2, ..ȂǂɃ}b`
  #  $str = '\\1' ł}b`i̖͌qj

̂悤ȏ͊mɏXłˁBNI[g̒ \Q \E ǵA񂪓ĂϐƈꏏɂȂ肪N܂B邱ƂŁA\Q \E ͈̔͂mɂȂ邩łB̍́AOq̃e̍肩QlɂĉB
TvR[h 
$pat = "(?:\Q$str1\E|\Q$str2\E)*";
$str =~ /$pat/;

# ͏͎̕̕ƓB
# $pat = "(?:" . quotemeta($str1) . "|" . quotemeta($str2) . ")*";

eNH[g̒ɒږ߂ނƂ܂sȂƂ܂B́Aperl \E Ƃ^𔭌悤Ƃ̂AShift-JISW邽߂łB
"\Q\\E"ł́A\EɃ}b`鐳K\ɂȂ܂B\̑oCg \ Ǝ \킳̂ŁAperlɂ\Q \x95 \\ Ȇgݍ킹ł悤Ɏv܂B \Q̍p̌ʂ\\x95\\x5cEɂȂ܂B̂߁A\EɃ}b`܂B
"\Q\"͂ǂł傤B̏ꍇ́A" " ͈̔͂߂ƂɁA\̑oCg̃NH[gGXP[vĂ܂̂ŁA͈̔͂҂悤ɂ͒܂炸AG[ɂȂ܂B̃G[\Q̌ʂlOɔ̂ŁAh悤܂B
"\Q\\\E"͂ǂł傤BmShift-JISł͖肠܂BXNvgEUC-JPUTF-8ɕϊƂɂ͖肪܂B\\EƗ]ȂQ镶łȂƃ}b`܂BǂɂA\ǂɓY邩lKv̂ŁA̎|ɍ܂B
K\͗Ⴆ΁Â悤ɂ܂B񂱂Shift-JIŜ݂ɗLłB
    $digit = '(?:[0-9]|\x82[\x4F-\x58])'; # ipƑSpj
    $upper = '(?:[A-Z]|\x82[\x60-\x79])'; # At@xbg啶ipƑSpj
    $lower = '(?:[a-z]|\x82[\x81-\x9A])'; # At@xbgipƑSpj
    $space = '(?:[\ \n\r\t\f]|\x81\x40)'; # 󔒕ipƑSpj
    $ascii = '[\x00-\x7F]';               # ASCII

    # Spi_E_Ex莚܂ށj
    $hiraZ = '(?:\x82[\x9F-\xF1]|\x81[\x4A\x4B\x54\x55])'; 

    # SpЉiE_E_Ex莚܂ށj
    $kataZ = '(?:\x83[\x40-\x7E\x80-\x96]|\x81[\x5B\x4A\x4B\x52\x53])';

    # pЉipEǓ_܂ށj
    $kataH = '[\xA1-\xDF]';

    $onebyte = '[\x00-\x7F\xA1-\xDF]';
    $twobyte = '(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])'; 
    $char    = '(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';

    # JIS
    $all_JIS = '(?:[\x00-\x7f\xa1-\xdf]|'.
        . '\x81[\x40-\x7e\x80-\xac\xb8-\xbf\xc8-\xce\xda-\xe8\xf0-\xf7\xfc]|'
        . '\x82[\x4f-\x58\x60-\x79\x81-\x9a\x9f-\xf1]|'
        . '\x83[\x40-\x7e\x80-\x96\x9f-\xb6\xbf-\xd6]|'
        . '\x84[\x40-\x60\x70-\x7e\x80-\x91\x9f-\xbe]|'
        . '\x88[\x9f-\xfc]|\x98[\x40-\x72\x9f-\xfc]|\xea[\x40-\x7e\x80-\xa4]|'
        . '[\x89-\x97\x99-\x9f\xe0-\xe9][\x40-\x7e\x80-\xfc])';

    # x_`

    # NECꕶ
    $NEC_special = '(?:\x87[\x40-\x5d\x5f-\x75\x7e\x80-\x9c])';

    # NECIIBMg
    $NEC_IBM_ext = '(?:\xed[\x40-\x7e\x80-\xfc]|\xee[\x40-\x7e\x80-\xec\xef-\xfc])';

    # IBMg
    $IBM_ext     = '(?:[\xfa-\xfb][\x40-\x7e\x80-\xfc]|\xfc[\x40-\x4b])';


Shift-JISŃ}b`sɂ́AQ̖肪܂B
oCgASCIÏ̗ɓ镶̂ŁAASCII܂ރp^[Ƀ}b`\B 
镶̑oCgƎ̑̕oCgPł邩̂悤Ƀ}b`Ă܂B 
҂EUC-JPłN肤łiUTF-8ȂNȂA͂ꂪȂ̂ł͂ȂjBO҂EUC-JPł͋NȂAShift-JISł͋N肤łBh@́AǓƂłAK\̒ɁAɐ擪܂܂邱ƂłB
TvR[h 
# 擪}b`
$str =~ /^$char*?(?:$pat)/;

̃}b`ł͂܂sȂƂ܂B"E" =~ /E$/lΏ\ł傤B܂A"\x8E" x 30 . "E"$str = "E"ł邪A"\x8E" x 31 . "E"$str = "E"ł܂AShift-JIS납؂蕪K؂ȕ@͂Ȃƍl܂B
ȂƂAQoCg\ȂoCg [\x00-\x3F\x7F] 鏊܂ŁAɒ[ȏꍇ͕̍ŏ܂ŃXLȂƂ킩炸Aǂ lookbehind ̐K\ (?<=PATTERN)͍̏As蒷ɂł܂i(?<=(?:\A|[\x00-\x3F\x7F])$char*) Ƃ͂łȂĵŁA擪當Pʂł΂炵Ă珈̂Aǂ͊ȕւȂ̂܂B
O[o}b`
O[o}b` /g ̏ꍇ́A\Gg܂傤B\G͑O}b`̖w܂B
̗ł́AuȂ̂]܂̂łA\GȂ̂ŁA擪JnĕŜ܂ŉтă}b`ȂƁA߂Đ擪PoCgi񂾈ʒuXLĊĴŁAꂽʒuȂ̂Ƀ}b`ƍlĂ܂܂B\GgȂƁAԈʒuɃ}b`邩ȂɁA]vȍČ̂ŁAԂ܂B
TvR[h 
    $str = 'EE';
    $pat = 'E';
    $str =~ s/\G($char*?)($pat)/${1}E/og;
    # 'EE' ̂܂܁ijB

\GtȂꍇ

    $str = 'EE';
    $pat = 'E';
    $str =~ s/($char*?)($pat)/${1}E/og; # 'E'  'E' ɒu
    print  $str;
    # 'EE' ɂȂĂ܂ijB

@@@@EE
Pځ@//  i}b`Ȃj
Qځ@||||||||||  i}b`̂Œuj
Rځ@|||||||||/  i}b`Ȃj
Sځ@||||||||||  i}b`̂Œuj

@}F @$charQoCgɃ}b`
@@@@@/@$charPoCgɃ}b`
@@@@ ˁ@$pat}b`
@@@@@|@XL͈̔͊O

Ap^[[Ƀ}b`ꍇɂ́AӂKvłB̗́AuAv̑O 'Z' ̂łBP͕̂i'A' : 0x8341ɑ΂'A' : 0x8B8341ă}b`jhł܂BQ́A̕@ŁuvhƂ̂łAZ ւ̒uAċNĂ܂B
͑R̂悤ɂKv܂B́AQł́uȂHvɏ悤ɁAu邩ƍl܂B
TvR[h 
$str = "ACEGAACEAA";

print +($temp = $str) =~ s/(?=A)/Z/g, $temp;

print +($temp = $str) =~ s/\G($char*?)(?=A)/${1}Z/g, $temp;

print +($temp = $str) =~ s/\G(\A|$char+?)(?=A)/${1}Z/g, $temp;

 
5    ZACEGZAZACEZAZA
7    ZACEGZZAZZACEZZAA
4    ZACEGZAZACEZAA

ȂH 
     A   C   E   G   A   A   C   E   A      A
1  \G Z
2  \G$char$char$char$char Z
3                      \G Z
4                      \G$char Z
5      ȉAȗ

܂AO[o}b`ł́A}b`[łȂp^[̑Oɂ\G($char*?)A[łp^[̑Oɂ\G(\A|$char+?)Kv܂B
AłiHj}b`Ȃꍇ܂B
TvR[h 
$str = "0123000123";

print +($temp = $str) =~ s/0*/Z/g, $temp;

print +($temp = $str) =~ s/\G($char*?)0*/${1}Z/g, $temp;

print +($temp = $str) =~ s/\G(\A|$char+?)0*/${1}Z/g, $temp;
__END__
 9    ZZ1Z2Z3ZZ1Z2Z3Z
14    ZZ1ZZ2ZZ3ZZ1ZZ2ZZ3ZZ
 7    Z1Z2Z3Z1Z2Z3Z

́Ap^[[Ƀ}b`̂łƁA/g̏Ŗɑ݂ďIȂȂ̂h߁AperĺA}b`Iɐi߂Ă̂łicf. perlre, Repeated patterns matching zero-length substringjA̐iߕ̐^ioCgPʂł͂ȂAPʂŐiނ́jA\G($char*?)\G(\A|$char+?)ł́A܂łȂłBƂ}b`邱Ƃ́AقƂǂȂƍl܂̂ŁACɂKv͂Ȃ̂m܂iɂ݁jB
At@xbg̑啶Ə
Shift-JIŜQoCg̒ɂ́AQoCgASCIIŉpɓ̂܂B̂߁A֐ uc, lc A^ \U, \LQoCg̈ꕔϊĂ܂i֐ ucfirst, lcfirst  ^ \u, \l ͖ƂȂȂjAm//i  s///iȂǂ /iCqɂĈႤȂ̂Ƀ}b`Ă܂肷邱Ƃ܂B
Shift-JISɊ܂܂ASCIỈp啶܂͏ɑȂAႦ΁Â悤ȃTu[`Ύł܂B
TvR[h 
$char = '(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';

lc("PERLvO~O");      # 'perlvo~o'
tolower("PERLvO~O"); # 'perlvO~O'

sub tolower {
  my $str = $_[0];
  $str =~ s/\G($char*?)([A-Z]+)/$1\L$2/g;
  $str;
}

sub toupper {
  my $str = $_[0];
  $str =~ s/\G($char*?)([a-z]+)/$1\U$2/g;
  $str;
}

P[X̃}b` /i ̏ꍇ́AႦ 'G'̑oCg 'G' łA'g'̑oCg 'g' ł邱ƂA'G' =~ /g/i̓}b`܂BłAShift-JISŐmȃ}b`΁A/iCq͎gƂł܂B
ɁAɊ܂܂At@xbgioCg̑QoCgɂ̂ji܂͑啶Aǂ炩jɓꂵă}b`܂Btolower̒`͏B
TvR[h 
$char = '(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';

$lcstr = tolower($str);
$lckey = tolower(quotemeta $key);

if ($lcstr =~ /^$char*?$lckey/) {
    print "matched";
}
else {
    print "not matched";
}

܂͖ߍݏCq (?ismx-ismx) pĂDʂ𓾂܂B
TvR[h 
"PPerluk̂ē" =~ /^$char*?PERLuK/i       # }b`ij
"QPerluk̂ē" =~ /^$char*?((?i)PERL)uK/  # }b`Ȃiǂj
"RPerluK̂ē" =~ /^$char*?((?i)PERL)uK/  # }b`iǂj

SpQoCgAt@xbg̃P[X́AIɂł܂iAςρjB'`'̑QoCg '`' Ȃ̂Aƒӂłim`` Ȃǂ̂ƂvIG[ɂȂBobNNH[ggӖ͓ɂȂjBIɂ̓e}b`ZquZqɒږߍނ͔̂łB
TvR[h 
/(?:o|)(?:d|)(?:q|)(?:k|)/;

̑ɂȃTu[`Ă݂Ă悢܂B
TvR[h 
$CharRE = '(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';
 
$pat = make_regexp_ignorecase("odqkuK");
print "TouK" =~ /^$char*?$pat/ ? "OK": "NOT";

sub make_regexp_ignorecase {
  my $str = $_[0];
  $str =~ s/\G([A-Za-z]+|$CharRE)/
    my $c = ord $1;
    if($c == 0x82) {
      my $v = vec($1,1,8);
      0x81 <= $v && $v <= 0x9A ? sprintf('\\x82[\\x%2x\\x%2x]', $v, $v-33) :
      0x60 <= $v && $v <= 0x79 ? sprintf('\\x82[\\x%2x\\x%2x]', $v, $v+33) :
      quotemeta($1);
    } 
    elsif(0x41 <= $c && $c <= 0x5A || 0x61 <= $c && $c <= 0x7A) {"(?:(?i)$1)"}
    else {quotemeta($1)}
  /geo;
  $str;
}

ɑ΂鐳K\
K\́APerl ɂƂČȂ݂Ƃ܂BK\̐ƂāA*, +, {min,max} Ȃǂ̗ʎwq}b`JԂ񐔂̏Ƃ肪܂B(ڍׂ perlre QƂ̂)B̂߁A$char*? ƂK\ɂ́A댯܂B
Ⴆ΁Â悤ȃ}b`OlČ܂傤B$stŕAuv10AƂɁAuACABCvAꂽłB̂悤ȕiAuwx10AvƂƂ͕炸ACӂ Shift-JIS eLXgł낤ƂƂɂ܂jApAt@xbgAƂ܂傤BƁA܂ł̍l炷ƁÂ悤ɂ΂悢Ǝv܂B
TvR[h 
my $char = '(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';
my $str = ('' x 100000) . 'ACABC';
$str =~ /^$char*?([A-Z]+)/o;
print $1;

ÁAɂẮA傫ȃG[N܂BႦ΁AWindows 98 Active Perl 522 pꍇAError: Runtime exception Ƃ Perl ̃G[ɂȂ܂B܂AWindows 98VC++ 6.0ŃRpCꂽ Perl 5.6.1 ƁAũvO͕sȏŝŋI܂B`vȂǂƂG[ɂȂ܂B
̂悤Ȗł邾h߂ɂ́Â悤ɂ܂B܂A̐擪璲ׂĂꍇAoCg̕EԈႦ̂́AoCg̑oCg̒𕶎EƌFłBShift-JISł́AoCg̑oCǵA[\x81-\x9F\xE0-\xFC] łB邢́AEUC-JP ɕϊ\ȗ̈悾l΁A[\x81-\x9F\xE0-\xEF] ƂƂł܂BȊÕoCg̒́AႦ΁A0x41 ̒́A'A' ̒ォA'A' ̒ォ͕܂񂪁AmɕEɂȂ܂B]āA[\x81-\x9F\xE0-\xFC]+ i܂ [\x81-\x9F\xE0-\xEF]+ j̃oCgioCgjAƂ낾ɒӂ΂悢ƂɂȂ܂B
̂߁Aȉ̂悤ɁA^$char*? ̑ $Apad gA\G$char*? ̑ $Gpad p΁AoCgAoCĝoCg [\x40-\x7E\x80\xA0-\xDF] ŏÎAȂƂKȊԊuŁiɒBȂɁjo΁AG[ɂȂ炸ɏ邱Ƃł܂BimIȖł̂ŁASł͂܂Bj
TvR[h 
# 񂾂}b`
my $Apad  = '(?:(?:\A|[\x00-\x80\xA0-\xDF])(?:[\x81-\x9F\xE0-\xFC]{2})*?)';
my $str1 = ('' x 100000) . 'ACABC';
$str1 =~ /$Apad([A-Z]+)/o;
print "$1\n"; # "ABC" ƕ\B

# O[o}b`
my $Gpad  = '(?:(?:\G|[\x00-\x80\xA0-\xDF])(?:[\x81-\x9F\xE0-\xFC]{2})*?)';

my $str2 = '' x 100000 . 'ACABC'. '' x 100000 . 'XYZ';
my @array = $str2 =~ /$Gpad([A-Z]+)/go;
print "@array\n"; # "ABC XYZ" ƕ\B

O̕ϊ
x_`⃆[U`܂ޕ𑼂̊łpł悤ɂɂ́AK؂ȕϊKvłi_A܂̗̂p͂قƂǖ]߂A炭͗ގ╶ɕϊ邱ƂɂȂł傤jBPerlł͒uZq s/// gΔrIeՂɎł܂B
炩߁Aǂ̊Oǂϊ邩`ϊe[upӂȂĂ͂Ȃ܂BPerlł̓nbVɂĂƂ̌̏yɂȂ܂Bł́A'w932_gai.txt'Œ`AWindows codepage-932R[hɊÂ@ˑ́iIjϊe[ugƂɂ܂B
̃R[hł́APÂ}b`A̕ϊnbṼL[ɂΑΉl̕ɒuAłȂ΂̂܂܎c܂B
TvR[h 
require 'w932_gai.txt'; # %table̒`isSIj

$char = '(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';

$str =~ s/($char)/exists $table{$1} ? $table{$1} : $1/geo;

lȏ́A̂悤ȏłł܂AOɃ}b`鐳K\ $gaijipӂKv܂Bꂽ}b`Ȃ߂ɁA̐K\ɂ \G KvłBႦ΁A$str = '@';̌QoCg "\x87\x40" łA΃}b`Sz܂B܂A~}b` ($char*?)g $char OɃ}b`Ȃ悤ύXKv͂܂B
TvR[h 
require 'w932_gai.txt'; # %table̒`isSIj

$char  = '(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';
$gaiji = '(?:[\x87][\x40-\x9c])';

$str =~ s/\G($char*?)($gaiji)/$1$table{$2}/g;

CP932d`̕ϊ
Microsoft Windows {łňʓIɎgpĂR[hy[W 932 (CP932) ł́A̕dĒ`ꂽԂɂȂĂ܂BŁAd`ĂƂ́AUnicode̓ʒuɑΉtĂ邱ƂƂ܂B
Ⴆ΁ACP932 -> Unicode -> CP932 ̏ŕϊƁAd`́Aǂꂩɑ܂B̗D揇ʂ JIS X 0208, NECꕶ (13)AIBMg (115`119)ANECIIBMg (89`92) ̏łBƂāA'' ̏ꍇANECꕶ "\x87\x9A"  IBMg "\xFA\x5B" ́AJIS X 0208  "\x81\xE6" ɂȂ܂B
ACP-932 ̃eLXgAd`ǂꂩɑĂȂƂ܂BႦ "\x87\x9A"  "\xFA\x5B" ܂܂ĂƁAeLXgڂŌƈႢȂ̂ɁA"\x81\xE6" ŌĂȂƂɂȂ܂B
d`𑵂郂W[ƂāAShiftJIS/CP932/Correct.pm ܂BƎgPerl̃y[Wɖ߂Ό܂B
܂AShiftJIS/String.pm  strtr() ܂ trclosure() g@܂BƎgPerl̃y[Wɖ߂Ό܂B
TvR[h 

# (1) $necJIS -> $jisNEC (9)
   $necJIS = "\x87\x90\x87\x91\x87\x92\x87\x95\x87\x96\x87\x97\x87\x9A\x87\x9B\x87\x9C";
      # NECꕶ̂AJISɕϊׂ񊿎
   $jisNEC = "\x81\xE0\x81\xDF\x81\xE7\x81\xE3\x81\xDB\x81\xDA\x81\xE6\x81\xBF\x81\xBE";
      # JIŜANECꕶɏd`Ă񊿎

# (2) $necibmJIS -> $jisNECIBM (1)
   $necibmJIS = "\xEE\xF9";
      # NECIIBMĝAJISɕϊׂ񊿎
   $jisNECIBM = "\x81\xCA";
      # JIŜANECIIBMgɏd`Ă񊿎

# (3) $ibmJIS -> $jisIBM (2)
   $ibmJIS = "\xFA\x54\xFA\x5B";
      # IBMĝAJISɕϊׂ񊿎
   $jisIBM = "\x81\xCA\x81\xE6";
      # JIŜAIBMgɏd`Ă񊿎

# (4) $ibmNEC -> $necIBM (13)
   $ibmNEC = "\xFA\x4A-\xFA\x53\xFA\x58\xFA\x59\xFA\x5A";
      # IBMĝANECꕶɕϊׂ񊿎
   $necIBM = "\x87\x54-\x87\x5D\x87\x8A\x87\x82\x87\x84";
      # NECꕶ̂AIBMgɏd`Ă񊿎

# (5) $necibmIBM -> $ibmNECIBM (13)
   $necibmIBM = "\xEE\xEF-\xEE\xF8\xEE\xFA\xEE\xFB\xEE\xFC";
      # NECIIBMĝAIBMgɕϊׂ񊿎
   $ibmNECIBM = "\xFA\x40-\xFA\x49\xFA\x55\xFA\x56\xFA\x57";
      # IBMĝANECIIBMgɏd`Ă񊿎

# (6) $necibmCJK -> $ibmCJK (360)
   $necibmCJK = "\xED\x40-\xEE\xEC";
      # NECIIBMg̊
   $ibmCJK    = "\xFA\x5C-\xFC\x4B";
      # IBMg̊

use ShiftJIS::String qw(trclosure);

# ϊpN[W̐
$correctCP932 = trclosure(
    $necJIS.$necibmJIS.$ibmJIS.$ibmNEC.$necibmIBM.$necibmCJK, # from
    $jisNEC.$jisNECIBM.$jisIBM.$necIBM.$ibmNECIBM.$ibmCJK     # to
);

$result = $correctCP932->($source); # $source ϊ $result 𓾂

𐔂
Shift-JIS̕𐔂ɂ́A}b`Zq𗘗pȂXJ[ReLXgŐ኱łBAuZq𗘗pقƂ킩܂B
ƂXSŏقƑłB܂AXSUB͖ɗpȂĂ悢ł傤B
TvR[h 
use Benchmark;

$char = '(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';
$s = "\0ACeXg -";

timethese (100000, {
  le => q{
    ($str = $s) =~ s/$char/0/go;
    $le = length $str;
  },
  sg => q{
    $sg = ($str = $s) =~ s/$char//go;
  },
  ab => q{
    $ab = 0;
    $ab++ while $s =~ /[^\x81-\x9F\xE0-\xFC]|../g;
  },
  ar => q{
    $ar = @{[ $s =~ /$char/go ]};
  },
  gr => q{
    $gr = grep defined, $s =~ /$char/go;
  },
  wh => q{
    $wh = 0;
    $wh++ while $s =~ /$char/go;
  },
  sj => q{
    $sj = sjslen($s);
  },
  xs => q{
    $xs = sjlength($s);
  },
});

sub sjslen {
  my($str,$len,$i,$c,$blen);
  $str = shift;
  $blen = length $str;
  while ($i < $blen) {
    $c = vec($str, $i, 8);
    if (0x81 <= $c && $c <= 0x9F || 0xE0 <= $c && $c <= 0xFC){ $i++ }
    $i++,$len++;
  }
  $len;
}

 
Benchmark: timing 100000 iterations of ab, ar, gr, le, sg, sj, wh, xs...
    ab:  4 wallclock secs ( 3.46 usr +  0.00 sys =  3.46 CPU) @ 28901.73/s
    ar:  6 wallclock secs ( 5.98 usr +  0.00 sys =  5.98 CPU) @ 16722.41/s
    gr:  6 wallclock secs ( 5.50 usr +  0.00 sys =  5.50 CPU) @ 18181.82/s
    le:  3 wallclock secs ( 2.09 usr +  0.00 sys =  2.09 CPU) @ 47846.89/s
    sg:  2 wallclock secs ( 1.92 usr +  0.00 sys =  1.92 CPU) @ 52083.33/s
    sj:  9 wallclock secs ( 8.57 usr +  0.00 sys =  8.57 CPU) @ 11668.61/s
    wh:  5 wallclock secs ( 4.78 usr +  0.00 sys =  4.78 CPU) @ 20920.50/s
    xs:  1 wallclock secs ( 0.38 usr +  0.00 sys =  0.38 CPU) @ 263157.89/s
        (warning: too few iterations for a reliable count)

XSUB 
int
sjlength(arg)
    SV* arg
  PROTOTYPE: $
  PREINIT:
    unsigned char *str, *p, *e;
    STRLEN byte, len = 0;
  CODE:
    p = str = (unsigned char *)SvPV(arg, byte);
    e = str + byte;
    while (p < e) {
        if (0x81 <= *p && *p <= 0x9F || 0xE0 <= *p && *p <= 0xFC)
            ++p;
        ++p, ++len;
    }
    RETVAL = len;
  OUTPUT:
    RETVAL

Pʂɕ
Shift-JIS𕶎Pʂɕ܂傤B̏ꍇ́AXS𗘗pĂ܂葬Ȃ܂łBԂl̃Xgpӂ̂ɎԂ̂A͂Perl̐K\̏͂Ȃ葬̂ƂƂł傤B
TvR[h 
use Benchmark;

$char = '(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';
$s = "{ݺ\0ABC" x 100;

timethese (1000, {
   re => q{
      @re = $s =~ /$char/go;
   },
   xs => q{
      @xs = sjsplit($s);
   },
});

 
Benchmark: timing 1000 iterations of re, xs...
    re:  7 wallclock secs ( 6.65 usr +  0.00 sys =  6.65 CPU) @ 150.38/s
    xs:  6 wallclock secs ( 5.33 usr +  0.00 sys =  5.33 CPU) @ 187.62/s

XSUB 
void
sjsplit(arg)
    SV* arg
  PROTOTYPE: $
  PREINIT:
    unsigned char *str, *p, *e;
    STRLEN ch, byte, len = 0;
  PPCODE:
    str = (unsigned char *)SvPV(arg,byte);
    e = str + byte;
    for (p = str; p < e; p++) {
        if (0x81 <= *p && *p <= 0x9F || 0xE0 <= *p && *p <= 0xFC) ++p;
        ++len;
    }
    EXTEND(SP,len);
    for (p = str; p < e; p += ch) {
        ch = (0x81 <= *p && *p <= 0x9F || 0xE0 < *p && *p <= 0xFC) ? 2 : 1;
        PUSHs(sv_2mortal(newSVpv(p,ch)));
    }

FXȕ
ŕł݂悤ɁA𕪊ɂ́Am//g֗łB
TvR[h 
$onebyte = '[\x00-\x7F\xA1-\xDF]';
$twobyte = '(?:[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])'; 
$char    = '(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';

#PoCg̉ƂQoCg̉ɕB
   while ($str =~ /\G($onebyte*)($twobyte*)/g) {
      push @one, $1 if $1 ne '';
      push @two, $2 if $2 ne '';
   }

#_Ō̕ƂȂ悤ɕB
# 'B' ł͂AɂĂ͒ӂKvB
   @sentences = $str =~ /\G$char*?(?:B|D|$)/g; 

̒Ő؂肻낦
̒ioCgjŐ؂肻낦ȂÂ悤ɂĂł܂B
TvR[h 
$char = '(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';

$str = '킴킴EUC-JPɕϊȂŁAShift-JIŜ܂܏'.
       'ł炢񂾂ǁAȂȂʓ|˂B';

print join "\n", bytebreak($str,15);

sub bytebreak{
   my($byte,$bmax,$ch,@lines);
   my $str = shift;
   $byte = $bmax = shift;
   foreach $ch ($str =~ /$char/go) {
      $byte += length $ch;  # ̕p
      if ($byte <= $bmax) {
         $lines[-1] .= $ch; # ȂΌp
      } else {
         $byte = length $ch;
         push @lines, $ch;  # ȂΎ̍s
      }
   }
   return @lines;
  # ȂꍇɁAEXy[XŖ߂΁B
  # return map {$_ .= ' ' x ($bmax - length)} @lines;
}

֑́AႦΎ̂悤ɂčs܂BPȍlł́Á֑A(i) s֑̒OŉsȂG(ii) s֑̒ŉsȂGƂƂɂȂ܂B܂A"(a)"̂悤ɁAs֑ƍs֑̊ԂɂPȂÁȂ̕ŜsɂȂ_ɂz܂B
̗ł͕̒oCg length ŋK肵Ă܂AƃoCg͕KႵ܂̂ŁAꍇɂẮiMVA͔pɂƂA܂̓v|[VȉꍇƂAUTF-8̏ꍇƂjԂ width ̂悤Ȋ֐`Kvł傤B
܂Â̗ł́A֑ɂ閳sňs蒷Ȃꍇ́A݂͂h܂BꂪȂA֑̗OƂčs𕪂iႦ$next̒$bmax𒴂Ȃ悤ɂjuKvł傤B
TvR[h 
$CharRE = '(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';

# s֑iꕔj
$NotAtBegin = q/)]}fhvxjnp!,.:;?ABXJKICDFGH/;
# s֑iꕔj
$NotAtEnd   = q/([{eguwimo/;

# nbV
@NotAtBegin{$NotAtBegin =~ m/$CharRE/g} = ();
@NotAtEnd{  $NotAtEnd   =~ m/$CharRE/g} = ();

$Str = '킴킴EUC-JPɕϊȂŁAShift-JIŜ܂܏'.
       'ł炢񂾂ǁAȂȂʓ|˂B';

print join "\n", linebreak($Str,16);

sub linebreak{
   my($byte,$i,@chars,$next,@lines);
   my($str, $bmax, $pad) = @_;

   # $byte͎̕pƂ̒
   $byte = $bmax; # sł邽߂̏lB

   # Pʂɂ΂炷
   @chars = $str =~ /$CharRE/go; 

   for ($i=0; $i<@chars; $i++) {
      $next .= $chars[$i];         # ̕
      $byte += length $chars[$i];  # ̕p

      # ̕ŝ֑Ƃ
      next if $i+1 < @chars && exists $NotAtEnd{ $chars[$i] };
      # ̎̕ŝ֑Ƃ
      next if $i+1 < @chars && exists $NotAtBegin{ $chars[$i+1] };

      # s̐U蕪
     # ȂΌp
      if ($byte <= $bmax) {
         $lines[-1] .= $next;
      }
     # ȂΎ̍s
      else {
         push @lines, $next;
         $byte = length $next;# Vs̒
      }
      $next = '';
   }
   return defined $pad && 1 == length $pad # lߕ
    ? map {$_ .= $pad x ($bmax - length)} @lines
    : @lines;
}

Ԃ牺֑̏ꍇi$bmin  $bmax͈̔͂jB 
      $bmin = $bmax - 2; # Ⴆ΁B

      # s̐U蕪
     # ȂΌp
      if ($byte <= $bmax && @lines && length $lines[-1] < $bmin){
         $lines[-1] .= $next;
      }
     # ȂΎ̍s
      else {
         push @lines, $next;
         $byte = length $next;# Vs̒
      }

{ꕶёւ
܏\Ƀ\[g郂W[ƂāAShiftJIS/Collate.pm ܂BƎgPerl̃y[Wɖ߂Ό܂B
uǂ݁E\Lƍv͎̂悤ɂčs܂BsortYomi\bh̎󂯎郊Xg̊evf́A[ \L, ǂݗ ]Ƃz񃊃t@XłȂ΂Ȃ܂B
TvR[h 
use ShiftJIS::Collate;

my @data = (
  [qw/ R  /],
  [qw/ c Ȃ /],
  [qw/ c Ȃ /],
  [qw/   /],
  [qw/   /],
  [qw/   /],
  [qw/ R  /],
  [qw/   /],
  [qw/   /],
  [qw/ Rc ܂ /],
  [qw/ ic Ȃ /],
);

@sort = ShiftJIS::Collate->new()->sortYomi(@data);

uȈՑ\ǂݏƍv͎̂悤ɂčs܂BsortDaihyo\bh̎󂯎郊Xg̊evf́A[ \L, ǂݗ ]Ƃz񃊃t@XłȂ΂Ȃ܂B
TvR[h 

#!perl
use ShiftJIS::Collate;

my @data = (
  [qw/ ɌvZ   ނ /],
  [qw/ JISԍ  ΂񂲂   /],
  [qw/ B              /],
  [qw/      ǂ       /],
  [qw/ ͐              /],
  [qw/ ͓     킿         /],
  [qw/ pc              /],
  [qw/ pc     ǂ         /],
  [qw/ @     炬       /],
  [qw/ ͓              /],
  [qw/ KR            /],
  [qw/ KR            /],
  [qw/      Ƃ         /],
  [qw/ ac   킾         /],
  [qw/      킵       /],
  [qw/ c     킾         /],
  [qw/ Vc     킾         /],
  [qw/ pc     ̂         /],
  [qw/ ƈ              /],
  [qw/ y              /],
  [qw/ y              /],
  [qw/ ˈ     Ƃ           /],
  [qw/ ˓c     Ƃ           /],
  [qw/ y     ǂ           /],
  [qw/ y     ǂ           /],
  [qw/ y     Ƃ           /],
  [qw/ c     ₷         /],
);

@sort = ShiftJIS::Collate->new()->sortDaihyo(@data);


Shift-JIS̊܂ރt@C/pX
{ڂ́A̍ڂɑāAs[̂܂܋LqĂ܂̂ŁAQlɂ悤ƎvꍇA\ɒӂ̏A[ł܂ł̍ƊŃeXgĂB
Windows (95/98/NT/2000Ȃ) ŁAt@CpXił͓oCg̈ӖŎgĂ܂̂ŁALȂǂ܂݂܂Bj܂ޏꍇAPerlňۂɖ肪\܂B
oCg "\x5C" ̊t@C/pX
fBNg֐imkdir, rmdir, opendir, -d ȂǁjAt@C֐iopen, unlink, -f ȂǁjŁAANZXłȂƂ܂B
t@C̏ꍇ́AɔpXy[XYƃANZXłꍇ܂iႦ΁A-f '\ ' ܂ -f "\x95\x5C\x20" ȂǁjB
fBNg̏ꍇ́A /  \ YƃANZXłꍇ܂iႦ΁A-d '\/' ܂ -d "\x95\x5C/" ȂǁjBɓY镶𔼊pXy[XƂĂA܂ANZXłꍇ܂BY镶̌ƂāAOނ̕iXbVA~LA󔒁j܂Aǂ̕悢́A֐ɂĈقȂꍇ悤łBgpOɏ\ɃeXgĂB
ȂAfBNg̖ /  \ YꍇAƂƖ /  \ tĂꍇɂ́AdɕtƂ܂sȂꂪ܂̂ŁAȂOɌق悢ł傤B
ǂĂsŐMłȂꍇ́A`` ܂ qx//  system()֐ȂǂʂWindows̃R}hĂԂ̂ǂƎv܂B
܂
 Shift-JIS ŏꂽ POD  Perl 5.8.1, 5.8.2  Pod::Html  HTML ɕϊꍇAAJ[̖ÓA pƉ [0xA6..0xDF] A ̊eoCg͉i'_'jɕϊ悤łB ̓Iɂ́Ause locale; ŁAlc  s/\W/_/g s (cf. Pod::Html::anchorify) ɂȂ܂B 
[2003-11-18]
Perl̃y[W
