1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
|
Shift-JISeLXg𐳂
ŋ߂̍XV
2005-03-26: uŏɁvAXML{vt@C2łɊÂANjLB
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ɕϊƂʓ|łBfobÔƂAu̒iKł͂̕ϐɂ͉Ă̂vo͂ē_̂͂悭s܂ÂƂEUC-JPƂĎ߂ĂAƂ͎Ԃǂł傤B͂o͂Shift-JISōsȂȂŜShift-JIŜ܂܈炫ƕ֗ł傤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-JIŜ悤ȃ}`oCg܂ޕ͂̂܂܂ł͒ڗł܂B
ƂAShift-JIS '' Ƃ́A16i82 A0ƂQoCgŕ\܂B "\x82\xA0" ƏĂperlɂƂĂ͓łBꂪ{́icountryj{́ilanguagejłƂAShift-JISŏĂicharsetjƂ͂ǂɂ܂܂Ă܂B
̂߁AShift-JISŏƂɂ́AperľȂ悤ɏĂȂȂ܂B̔źAvO}ĂȂȂ܂B̋̕Lq́Â悤ȎԂĂAShift-JISp邱ƂɈӋ`ƍlĂlɂ͎QlɂȂ邩܂B
ȎԂ|ȂĺA
Perl 5.8.xȍ~gB
_Fperl5-porters@perl.org ŃT|[gĂB
_FƓ̍lA]̓{ꏈƂ͑eȂƂ낪iƂÂċ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قLjȂɂĂA}`oCgVOoCgƋʂAƂɈꕶƂď͖̂ʓ|łB
ƂΏƂق悢ł傤B̃vO͗LȂ̂ŁATł傤A͂ɂ͎܂B
ȂA̕ɏĂ鎖Ał߂Ȃ@Ȃ̂ŁÁÂłǂ݉B̕@ɂĉ^₪ƂĂAɂđ̂ƂŎ₷ƁAłȂĂ̂ƁAƔł傤BƂāAɂuȂʼnB
Shift-JISgƂɂ肪ȁiHjG[
Shift-JISɂ́AQoCg [@-~]iASCII 10i64-126j͈̔͂ɓ̂܂BASCIÍAperlɂƂēʂȈӖƂ邽߁AG[̌ƂȂ܂BShift-JISł́AQoCg̑QoCǵ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-JIŜƂɂ͋N悤ȎɌ܂B
G[ɂ͂ȂȂǕiPj
ႦA"\" Ƃ "\" ƂeN܂B "" Ƃ "" ɂȂ܂B́A"\" "\"̑̕QoCg \ ł邽߁A_uNI[g̒ł͎̃̕GXP[v邱ƂɂȂ̂ŁA\ 0x955C8EA6 łĂANI[ǧʂ "\" 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[vtNI[g̏I[ł͂ȂÄꕔƂ݂Ȃ܂B̂߁A\\ \ ̕\GXP[vɂȂ܂B̓NI[g̎n[EI[ɂĂƂłB
G[ɂ͂ȂȂǕiRj
ႦA"ۏ\net" ƂeN܂B "ۥ
et" ̂悤ɓrʼnsĂ܂܂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 WĴŁ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̂perĺA " ̓NI[g̏I[Ƃ݂͂ȂɁAɑƍlĂ܂܂Bȍ~AXNvg̒ " ̕S܂܂ȂÂ悤ɃG[܂B
qq{ "{" }̂悤ȏꍇɂӂȂȂ܂B"{" ̑oCg { Ȃ̂ŁÂ܂܂ł { }̃lXgĂ܂Al̃G[܂B
Bareword found where operator expected
ǔꂪZqĂقʒuɌv
ႦAprint "<img alt=\"Ή\\" height=115 width=150>"; ̂悤ȏꍇA\" ɂp̃GXP[v́A\ ̑QoCg\̂߁A\\ " Ƃgݍ킹ɂȂAGXP[vłĂ܂B̂߁ÃéAperl猩ƁA"<img alt=\"Ή\\" ŏIĂ܂B̂߁AěɁAheight ƂǔviNI[gň͂܂ĂȂj悤ɂ݂āAɂ͗̌ł͂ȂAZqׂł͂ȂHperl͍l܂B
Unrecognized character \x82
uFȂ \x82v
́AASCII₻̑̕ǔvɂƂɏo郁bZ[WłB"Ή\" ̂悤ȃeāÂƂ "Ȃł" ̂悤ȃ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̒uIȂv
uZq s/PATTERN/REPLACEMENT/̌`Ƃ˂Ȃ܂B s/\//; ̂悤ɁAoCg \ ł镶PATTERNI点悤ƂƂɂ̃G[N܂B}b`Zq̏I[ / GXP[vĂ܂̂ŁAPATTERNɐɑ悤ɉ߂܂B̂perĺ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-JIŜQoCg̒ɂ́AQoCgASCIIʼnpɓ̂܂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ɂʼnɂȂƎv܂BÂ悤Ȑlɂ́Aȃy[WɂKvq}Ȃł傤B
ŁÂ悤ȃy[W킴킴ɂ悤ȐĺAR[h\ׂȂЂƂƉ肵܂BʂɂƂĔ邱Ƃ͂܂BAԂɂނ܂ԈvOCōĂẮAɃN[pCԂĂd܂B
e̍
悭mĂ˂ȂȂƂ́A\ ƂGXP[vṕ̕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[ȉꍇ "\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
ȌɏAA\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 ǵ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 \\ Ȇ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\͗ႦÂ悤ɂ܂BShift-JIŜ݂ɗ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
oCgASCIÏ̗ɓ镶̂Ł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*) Ƃ͂łȂĵŁA擪當Pʂł炵Ă珈̂Aǂ͊ȕւȂ̂܂B
O[o}b`
O[o}b` /g ̏ꍇ́A\Gg܂傤B\G͑O}b`̖w܂B
̗ł́AuȂ̂]܂̂łA\GȂ̂ŁA擪JnĕŜ܂ʼnтă}b`ȂƁA߂Đ擪PoCgiʒuXLĊĴŁ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߁Aperĺ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-JIŜQoCg̒ɂ́AQoCgASCIIʼnpɓ̂܂B̂߁A uc, lc A^ \U, \LQoCg̈ꕔϊĂ܂i ucfirst, lcfirst ^ \u, \l ͖ƂȂȂjAm//i s///iȂǂ /iCqɂĈႤȂ̂Ƀ}b`Ă܂肷邱Ƃ܂B
Shift-JISɊ܂܂ASCIỈp啶܂͏ɑȂ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
ႦÂ悤ȃ}b`OlČ܂傤B$stŕAuv10AƂɁAuACABCvAꂽłB̂悤ȕiAuwx10AvƂƂ͕炸ACӂ Shift-JIS eLXgł낤ƂƂɂ܂jApAt@xbgAƂ܂傤BƁA܂ł̍l炷ƁÂ悤ɂ悢Ǝ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傫ȃG[N܂BႦAWindows 98 Active Perl 522 pꍇAError: Runtime exception Ƃ Perl ̃G[ɂȂ܂B܂AWindows 98VC++ 6.0ŃRpCꂽ Perl 5.6.1 ƁAũvO͕sȏŝŋI܂B`vȂǂƂG[ɂȂ܂B
̂悤Ȗł邾h߂ɂ́Â悤ɂ܂B܂A̐擪璲ׂĂꍇAoCg̕EԈႦ̂́AoCg̑oCg̒EƌFłBShift-JISł́AoCg̑oCǵA[\x81-\x9F\xE0-\xFC] łB邢́AEUC-JP ɕϊ\ȗ̈悾lA[\x81-\x9F\xE0-\xEF] ƂƂł܂BȊÕ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 pAoCgAoCĝoCg [\x40-\x7E\x80\xA0-\xDF] ŏÎAȂƂKȊԊuŁiɒBȂɁjoAG[ɂȂ炸ɏ邱Ƃł܂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̕ϊnbṼ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ȏ́Â悤ȏłł܂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";
# JIŜANECꕶɏd`Ă
# (2) $necibmJIS -> $jisNECIBM (1)
$necibmJIS = "\xEE\xF9";
# NECIIBMĝAJISɕϊׂ
$jisNECIBM = "\x81\xCA";
# JIŜANECIIBMgɏd`Ă
# (3) $ibmJIS -> $jisIBM (2)
$ibmJIS = "\xFA\x54\xFA\x5B";
# IBMĝAJISɕϊׂ
$jisIBM = "\x81\xCA\x81\xE6";
# JIŜAIBMgɏd`Ă
# (4) $ibmNEC -> $necIBM (13)
$ibmNEC = "\xFA\x4A-\xFA\x53\xFA\x58\xFA\x59\xFA\x5A";
# IBMĝ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";
# NECIIBMĝAIBMgɕϊׂ
$ibmNECIBM = "\xFA\x40-\xFA\x49\xFA\x55\xFA\x56\xFA\x57";
# IBMĝ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-JISPʂɕ܂傤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Ő肻낦ȂÂ悤ɂĂł܂B
TvR[h
$char = '(?:[\x00-\x7F\xA1-\xDF]|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC])';
$str = '킴킴EUC-JPɕϊȂŁAShift-JIŜ܂'.
'ł炢ǁ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(i) s֑̒OʼnsȂG(ii) s֑̒ʼnsȂGƂƂɂȂ܂B܂A"(a)"̂悤ɁAs֑ƍs֑̊ԂɂPȂÁȂ̕ŜsɂȂ_ɂz܂B
̗ł͕̒oCg length ŋK肵Ă܂AƃoCg͕KႵ܂̂ŁAꍇɂẮiMVA͔pɂƂA܂̓v|[VȉꍇƂAUTF-8̏ꍇƂjԂ width ̂悤Ȋ`Kvł傤B
܂Â̗ł́A֑ɂ閳sňs蒷Ȃꍇ́A݂͂h܂BꂪȂA֑̗OƂčsiႦ$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-JIŜ܂'.
'ł炢ǁ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
# ̕ŝ֑Ƃ
next if $i+1 < @chars && exists $NotAtEnd{ $chars[$i] };
# ̎̕ŝ֑Ƃ
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, ǂݗ ]Ƃzt@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, ǂݗ ]Ƃzt@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
fBNgimkdir, rmdir, opendir, -d ȂǁjAt@Ciopen, 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~LAj܂Aǂ̕悢́AɂĈقȂꍇ悤łBgpOɏ\ɃeXgĂB
ȂAfBNg̖ / \ YꍇAƂƖ / \ tĂꍇɂ́AdɕtƂ܂sȂꂪ܂̂ŁAȂ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[̖Ó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
|