#!/usr/bin/perl
######################################################################
# eg/bn/mb_regexp.pl - mb::qr দিয়ে মাল্টিবাইট-সচেতন ম্যাচিং
#
# কী দেখায়:
#   mb::qr(PATTERN) এমন regexp কম্পাইল করে যার ".", অক্ষর-শ্রেণী ও
#   ক্যাপচার নির্বাচিত স্ক্রিপ্ট এনকোডিংয়ে পুরো অক্ষর এককে কাজ করে।
#
# CORE থেকে পার্থক্য:
#   CORE "." এক বাইট ম্যাচ করে, তাই তিন হিরাগানায় /(.)/g দেয় 6 টুকরো;
#   mb::qr দিয়ে 3 (প্রতি অক্ষরে এক)। শ্রেণী-পরিসর ও ক্যাপচার পুরো
#   অক্ষর ফেরত দেয়।
#
# দ্রষ্টব্য: সোর্স কোড ও \xHH ডেটা US-ASCII থাকে; এই ফাইলটি UTF-8 (শুধু মন্তব্য বাংলায়)।
#
#     perl eg/bn/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;
