#!/usr/bin/perl
######################################################################
# eg/ne/mb_regexp.pl - mb::qr द्वारा मल्टिबाइट-सचेत मिलान
#
# के देखाउँछ:
#   mb::qr(PATTERN) ले यस्तो regexp कम्पाइल गर्छ जसको ".", वर्ण-वर्ग र
#   क्याप्चर छानिएको स्क्रिप्ट एन्कोडिङमा पूरा अक्षर एकाइमा चल्छन्।
#
# CORE भन्दा फरक:
#   CORE "." ले एक बाइट मिलाउँछ, त्यसैले तीन हिरागानामा /(.)/g ले 6
#   टुक्रा दिन्छ; mb::qr मार्फत 3 (प्रति अक्षर एक)। वर्ग-दायरा र क्याप्चरले
#   पूरा अक्षर फर्काउँछन्।
#
# द्रष्टव्य: स्रोत कोड र \xHH डेटा US-ASCII मै रहन्छ; यो फाइल UTF-8 हो (टिप्पणी मात्र नेपालीमा)।
#
#     perl eg/ne/mb_regexp.pl
#
######################################################################
use strict;
use vars qw($aiu @core @mbcs $dot $range $cap @found);

use FindBin;
use lib "$FindBin::Bin/../../lib";
use mb;
mb::set_script_encoding('sjis');

# Shift_JIS का तीन हिरागाना: a(\x82\xA0) i(\x82\xA2) u(\x82\xA4)।
$aiu = "\x82\xA0\x82\xA2\x82\xA4";

# CORE "." एक बाइट हो -- छ बाइटका लागि छ टुक्रा।
@core = ($aiu =~ /(.)/g);
print "CORE /(.)/g      : ", scalar(@core), " pieces (bytes)\n";   # 6

# mb::qr("(.)") ले "." लाई एक पूरा अक्षर बनाउँछ -- तीन टुक्रा। एकपटक
# कम्पाइल गरी, कम्पाइल भएको प्याटर्न मिलानमा राख्नुहोस्।
$dot  = mb::qr("(.)");
@mbcs = ($aiu =~ /$dot/g);
print "mb::qr /(.)/g    : ", scalar(@mbcs), " pieces (chars)\n";   # 3

# हिरागाना खण्ड a..n (\x82\xA0-\x82\xF1) माथि वर्ग-दायरा। दायराले पूरा
# अक्षर तुलना गर्छ, त्यसैले u भित्र छ र ASCII "A" छैन।
$range = mb::qr("[\x82\xA0-\x82\xF1]");
print "u in [a-n]       : ", ("\x82\xA4" =~ /$range/ ? 1 : 0), "\n";   # 1
print "A in [a-n]       : ", ("A"         =~ /$range/ ? 1 : 0), "\n";   # 0

# क्याप्चरले पूरा मल्टिबाइट अक्षर (यहाँ दुई बाइट) फर्काउँछ, कहिल्यै आधा
# अक्षर होइन।
$cap = mb::qr("([\x82\xA0-\x82\xF1])");
if ("X\x82\xA2Y" =~ /$cap/) {
    print "captured char    : ", length($1), " bytes\n";   # 2
}

# मिश्रित स्ट्रिङमा हरेक हिरागाना, अक्षर एकाइमा खोज्नुहोस्।
@found = ("a\x82\xA0b\x82\xA2c" =~ /$cap/g);
print "hiragana found   : ", scalar(@found), "\n";   # 2

exit 0;
