англійськафранцузькаіспанська

Значок OnWorks

perlunicook - Інтернет у хмарі

Запустіть perlunicook у безкоштовному хостинг-провайдері OnWorks через Ubuntu Online, Fedora Online, онлайн-емулятор Windows або онлайн-емулятор MAC OS

Це команда perlunicook, яку можна запустити в безкоштовному хостинг-провайдері OnWorks за допомогою однієї з наших безкоштовних онлайн-робочих станцій, таких як Ubuntu Online, Fedora Online, онлайн-емулятор Windows або онлайн-емулятор MAC OS

ПРОГРАМА:

ІМ'Я


perlunicook - кулінарні приклади обробки Unicode в Perl

ОПИС


Ця довідкова сторінка містить короткі рецепти, які демонструють, як виконувати типові операції Unicode
на Perl, плюс одна повна програма в кінці. Будь-які неоголошені змінні в індивідуальному
передбачається, що рецепти мають попереднє відповідне значення.

ПРИКЛАДИ


X 0: стандарт преамбула
Якщо не зазначено інше, для роботи всіх прикладів нижче потрібна ця стандартна преамбула
правильно, з "#!" налаштований для роботи у вашій системі:

#!/usr/bin/env Perl

використовувати utf8; # тому літерали та ідентифікатори можуть бути в UTF-8
використовувати v5.12; # або новішої версії, щоб отримати функцію "unicode_strings".
використовувати строгий; # цитати рядки, оголосити змінні
використовувати попередження; # увімкнено за замовчуванням
використовувати попередження qw(FATAL utf8); # фаталізуйте збої кодування
використовуйте open qw(:std :utf8); # неоголошених потоків у UTF-8
використовувати charnames qw(:full :short); # непотрібний у v5.16

це робить зробіть навіть програмістів Unix "binmode" ваших бінарних потоків або відкривайте їх за допомогою
":raw", але це єдиний спосіб отримати їх портативно.

УВАГА: "use autodie" (до 2.26) і "use open" не поєднуються одне з одним.

X 1: Загальний Розуміння Unicode фільтрувати
Завжди розкладайте на вході, а потім знову складайте на виході.

використовуйте Unicode::Normalize;

поки (<>) {
$_ = NFD($_); # розкласти + перевпорядкувати канонічно
...
} продовжити {
надрукувати NFC($_); # перекомпонувати (де можливо) + канонічно змінити порядок
}

X 2: Тонка настройка Unicode попередження
Починаючи з версії 5.14, Perl розрізняє три підкласи попереджень UTFX8.

використовувати v5.14; # підпопередження недоступні раніше
відсутність попереджень "nonchar"; # 66 заборонених не символів
відсутність попереджень «сурогат»; # UTF-16/CESU-8 нісенітниця
немає попереджень "non_unicode"; # для кодових точок понад 0x10_FFFF

X 3: Декларуйте джерело in utf8 та цінності ідентифікатори та літерали
Без критично важливої ​​декларації «використовувати utf8», поміщаючи UTFX8 у ваші літерали та
ідентифікатори не працюватимуть правильно. Якщо ви використовували стандартну преамбулу, наведену вище, це
вже сталося. Якщо ви це зробили, ви можете зробити ось що:

використовувати utf8;

my $measure = "Aangstroem";
мій @Xsoft = qw( cp852 cp1251 cp1252);
мій @XXXXXXXXX = qw( XXXX XXXXX );
my @X = qw( koi8-f koi8-u koi8-r );
мій $motto = "XXX"; # СІМ'Я, ЗРОСТАЄ СЕРЦЕ, ДРОМЕДЕР ВЕРБЛЮД

Якщо ви забудете «використовувати utf8», старші байти будуть неправильно сприйняті як окремі символи
нічого не буде працювати правильно.

X 4: Персонажі та їх номера
Функції "ord" і "chr" працюють прозоро на всіх кодових точках, а не лише на ASCII
ні лише X, ні фактично, навіть не лише в Unicode.

# символи ASCII
ord("A")
хр(65)

# символів базової багатомовної площини
ord("X")
хр(0x3A3)

# поза BMP
ord("X") # МАТЕМАТИЧНИЙ КУРСИВ МАЛИЙ N
хр(0x1D45B)

# поза Unicode! (до MAXINT)
ord("\x{20_0000}")
хр(0x20_0000)

X 5: Unicode літерали by характер номер
В інтерпольованому літералі, будь то рядок у подвійних лапках чи регулярний вираз, ви можете вказати a
символ за його номером за допомогою "\x{HHHHHH}" Втеча.

Рядок: "\x{3a3}"
Регулярний вираз: /\x{3a3}/

Рядок: "\x{1d45b}"
Регулярний вираз: /\x{1d45b}/

# навіть не-BMP діапазони в регулярному виразі працюють добре
/[\x{1D434}-\x{1D467}]/

X 6: отримати характер ім'я by номер
використовувати charnames ();
моє $name = charnames::віакод(0x03A3);

X 7: отримати характер номер by ім'я
використовувати charnames ();
my $number = charnames::vianame("ВЕЛИКА ГРЕЦЬКА ЛІТЕРА СИГМА");

X 8: Unicode названий символи
Використовуйте "\N{charname}" нотація, щоб отримати символ із таким іменем для використання в інтерполяції
літерали (рядки в подвійних лапках і регулярні вирази). У v5.16 є неявний

використовувати charnames qw(:full :short);

Але до версії 5.16 ви повинні чітко вказати, який набір charname вам потрібен. The
Імена «:full» — це офіційне ім’я символу Unicode, псевдонім або послідовність, які всі спільні
простір імен.

використовуйте charnames qw(:full :short latin greek);

"\N{МАТЕМАТИЧНИЙ КУРСИВ SMALL N}" # :повний
"\N{ГРЕЦЬКА ВЕЛИКА БУКВА SIGMA}" # :повний

Усе інше є спеціальною абревіатурою Perl. Укажіть один або кілька сценаріїв за допомогою
імена, якщо вам потрібні короткі назви, які залежать від сценарію.

"\N{Greek:Sigma}" # :короткий
"\N{ae}" # лат
"\N{epsilon}" # грецький

Випуск v5.16 також підтримує імпорт ":loose" для вільного збігу імен символів,
який працює так само, як вільне зіставлення назв властивостей: тобто не враховує регістр,
пробіл і підкреслення:

"\N{знак євро}" # :вільний (з v5.16)

X 9: Unicode названий послідовності
Вони виглядають так само, як імена символів, але повертають кілька кодових точок. Зверніть увагу на %vx
Функція векторного друку в "printf".

використовувати charnames qw(:full);
my $seq = "\N{ВЕЛИКА ЛАТИНСЬКА БУКВА A З МАКРОНОМ І МОГИЛОЮ}";
printf "U+%v04X\n", $seq;
U + 0100.0300

X 10: виготовлений на замовлення названий символи
Використовуйте ":alias", щоб дати власні псевдоніми з лексичною областю існуючим персонажам або навіть
щоб дати безіменним символам приватного використання корисні імена.

використовувати charnames ":full", ":alias" => {
ecute => "МАЛА ЛАТИНСЬКА ЛІТЕРА E З АКУТОМ",
"ЛОГОТИП APPLE" => 0xF8FF, # символ приватного використання
};

"\N{ecute}"
"\N{ЛОГОТИП APPLE}"

X 11: імен of CJK кодові точки
Синограми на зразок XXXX повертаються з назвами символів "CJK UNIFIED IDEOGRAPH-6771" та
"CJK UNIFIED IDEOGRAPH-4EAC", тому що їхні імена X відрізняються. CPAN "Unicode::Unihan"
модуль має велику базу даних для їх декодування (і багато іншого), якщо ви знаєте
як зрозуміти його вихід.

# cpan -i Unicode::Unihan
використовуйте Unicode::Unihan;
мій $str = "XX";
мій $unhan = Unicode::Unihan->новий;
для мого $lang (qw(мандарин кантонська корейська японська на японський кун)) {
printf "CJK $str в %-12s це ", $lang;
сказати $unhan->$lang($str);
}

відбитки:

CJK XX китайською – DONG1JING1
CJK XX кантонською – dung1ging1
CJK XX корейською – TONGKYENG
CJK XX японською мовою On означає TOUKYOU KEI KIN
CJK XX в японському куні — ХІГАШІ АЗУМАМІЯКО

Якщо ви маєте на увазі певну схему романізації, використовуйте конкретний модуль:

# cpan -i Lingua::JA::Romanize::Japanese
використовувати Lingua::JA::Romanize::Japanese;
мій $k2r = Lingua::JA::Romanize::Japanese->new;
мій $str = "XX";
сказати "Японська для $str це ", $k2r->chars($str);

друк

Японська для XX - toukyou

X 12: Явне кодувати/декодувати
У рідкісних випадках, наприклад під час читання бази даних, вам можуть надати необхідний кодований текст
декодувати.

використовуйте Encode qw(encode decode);

мій $chars = decode("shiftjis", $bytes, 1);
# АБО
my $bytes = encode("MIME-Header-ISO_2022_JP", $chars, 1);

Для потоків, які мають однакове кодування, не використовуйте encode/decode; замість цього встановіть файл
кодування, коли ви відкриваєте файл або одразу після цього за допомогою «binmode», як описано далі
нижче.

X 13: Декодувати програма аргументація as utf8
$perl -CA ...
or
$ експорт PERL_UNICODE=A
or
використовуйте Encode qw(decode_utf8);
@ARGV = map { decode_utf8($_, 1) } @ARGV;

X 14: Декодувати програма аргументація as місце дії кодування
# cpan -i Encode::Locale
використовуйте Encode qw(locale);
використовувати Encode::Locale;

# використовуйте "locale" як аргумент для кодування/декодування
@ARGV = map { decode(locale => $_, 1) } @ARGV;

X 15: Декларуйте STD{IN,OUT,ERR} до be utf8
Використовуйте параметр командного рядка, змінну середовища або явно викликайте "binmode":

$ perl -CS ...
or
$ експорт PERL_UNICODE=S
or
використовуйте open qw(:std :utf8);
or
binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");

X 16: Декларуйте STD{IN,OUT,ERR} до be in місце дії кодування
# cpan -i Encode::Locale
використовувати Encode;
використовувати Encode::Locale;

# або як потік для binmode або open
binmode STDIN, ":encoding(console_in)" if -t STDIN;
binmode STDOUT, ":encoding(console_out)" if -t STDOUT;
binmode STDERR, ":encoding(console_out)" if -t STDERR;

X 17: зробити файл I / O дефолт до utf8
Файли, відкриті без аргументу кодування, будуть у UTF-8:

$ perl -CD ...
or
$ експорт PERL_UNICODE=D
or
використовуйте open qw(:utf8);

X 18: зробити всі I / O та аргументи дефолт до utf8
$perl -CSDA...
or
$ експорт PERL_UNICODE=SDA
or
використовуйте open qw(:std :utf8);
використовуйте Encode qw(decode_utf8);
@ARGV = map { decode_utf8($_, 1) } @ARGV;

X 19: відкритий файл з конкретний кодування
Вкажіть кодування потоку. Це звичайний спосіб обробки закодованого тексту, а не виклик
функції низького рівня.

# вхідний файл
open(my $in_file, "< :encoding(UTF-16)", "wintext");
OR
open(my $in_file, "<", "wintext");
binmode($in_file, ":кодування(UTF-16)");
ТОДІ
my $line = <$in_file>;

# вихідний файл
open($out_file, ">:encoding(cp1252)", "wintext");
OR
open(my $out_file, ">", "wintext");
binmode($out_file, ":encoding(cp1252)");
ТОДІ
print $out_file "деякий текст\n";

Тут можна вказати більше шарів, ніж просто кодування. Наприклад, заклинання
":raw :encoding(UTF-16LE) :crlf" включає неявну обробку CRLF.

X 20: Unicode корпус
Регістр Unicode дуже відрізняється від регістру ASCII.

uc("henry X") # "HENRY X"
uc("tschuess") # "TSCHUeSS" повідомлення ss => SS

# обидва вірні:
"tschuess" =~ /TSCHUeSS/i # повідомлення ss => SS
"XXXXXXX" =~ /XXXXXXX/i # помітити однаковість X,X,X

X 21: Unicode нечутливий до регістру порівняння
Також доступна в модулі CPAN Unicode::CaseFold нова функція "fc" XfoldcaseX від
v5.16 надає доступ до того самого Unicode casefolding, що й модифікатор шаблону "/i"
завжди використовується:

використовувати функцію "fc"; # Функція fc() з v5.16

# сортувати без урахування регістру
my @sorted = sort { fc($a) cmp fc($b) } @list;

# обидва вірні:
fc("tschuess") eq fc("TSCHUeSS")
fc("XXXXXXX") eq fc("XXXXXXX")

X 22: матч Unicode розрив рядка послідовність in regex
Розрив рядка Unicode відповідає графемі CRLF із двох символів або будь-якій із семи вертикальних
пробіли. Добре підходить для роботи з текстовими файлами, що надходять з різних операційних систем
систем.

\R

s/\R/\n/g; # нормалізувати всі розриви рядків до \n

X 23: отримати характер категорія
Знайдіть загальну категорію числової кодової точки.

використовуйте Unicode::UCD qw(charinfo);
мій $кіт = charinfo(0x3A3)->{категорія}; # "Лу"

X 24: Відключення Unicode-обізнаність in вбудований класи символів
Вимкніть "\w", "\b", "\s", "\d" і класи POSIX від правильної роботи в Unicode
або в цій області, або лише в одному регулярному виразі.

використовувати v5.14;
використовуйте re "/a";

# АБО

my($num) = $str =~ /(\d+)/a;

Або використовуйте спеціальні властивості, що не належать до Юнікоду, як-от "\p{ahex}" і "\p{POSIX_Digit"}. Властивості
все ще працює нормально, незалежно від того, які модифікатори кодування ("/d /u /l /a /aa") повинні мати ефект.

X 25: матч Unicode властивості in regex з \p, \P
Усі вони відповідають одній кодовій точці з заданою властивістю. Використовуйте "\P" замість "\p", щоб
відповідати одній кодовій точці, яка не має цієї властивості.

\pL, \pN, \pS, \pP, \pM, \pZ, \pC
\p{Sk}, \p{Ps}, \p{Lt}
\p{alpha}, \p{верхній}, \p{нижній}
\p{латиниця}, \p{грецька}
\p{script=латиниця}, \p{script=грецька}
\p{East_Asian_Width=Wide}, \p{EA=W}
\p{Line_Break=Дифіс}, \p{LB=HY}
\p{Numeric_Value=4}, \p{NV=4}

X 26: виготовлений на замовлення характер властивості
Визначте під час компіляції власні власні властивості символів для використання в регулярних виразах.

# з використанням символів приватного використання
sub In_Tengwar { "E000\tE07F\n" }

if (/\p{In_Tengwar}/) { ... }

# змішування існуючих властивостей
sub Is_GraecoRoman_Title {<<'END_OF_SET'}
+utf8::IsLatin
+utf8::IsGreek
&utf8::IsTitle
END_OF_SET

якщо (/\p{греко-римський_назва}/ { ... }

X 27: Unicode нормалізація
Зазвичай візуалізація в NFD на вході та NFC на виході. Використання функцій NFKC або NFKD
покращує запам’ятовування під час пошуку, припускаючи, що ви вже робили це з тим самим текстом для пошуку.
Зауважте, що це набагато більше, ніж просто попередньо об’єднані гліфи сумісності; він також
змінює порядок позначок відповідно до їх канонічних класів об’єднання та відсіює одиночні елементи.

використовуйте Unicode::Normalize;
мій $nfd = NFD($orig);
мій $nfc = NFC($orig);
мій $nfkd = NFKD($orig);
мій $nfkc = NFKC($orig);

X 28: Конвертувати не ASCII Unicode числові
Якщо ви не використовували "/a" або "/aa", "\d" відповідає лише цифрам ASCII, але PerlXs
неявне перетворення рядка в число наразі не розпізнає їх. Ось як це зробити
конвертувати такі рядки вручну.

використовувати v5.14; # необхідний для функції num().
використовуйте Unicode::UCD qw(num);
my $str = "отримав X і XXXX і X і тут";
мої @nums = ();
while ($str =~ /(\d+|\N)/g) { # не тільки ASCII!
push @nums, num($1);
}
скажіть "@nums"; # 12 4567 0.875

використовувати charnames qw(:full);
my $nv = num("\N{РУМІ ЦИФРА ОДИН}\N{РУМІ ЦИФРА ДВА}");

X 29: матч Unicode графема кластер in regex
Видимі програмістом XcharactersX є кодовими точками, які відповідають "/./s", але видимі користувачеві
XсимволиX — це графеми, які відповідають "/\X/".

# Знайдіть голосний *плюс* будь-які комбіновані діакритичні знаки, підкреслення тощо.
мій $nfd = NFD($orig);
$nfd =~ / (?=[aeiou]) \X /xi

X 30: Витяг by графема замість of by кодова точка (регулярний вираз)
# зіставте та візьміть п’ять перших графем
my($first_five) = $str =~ /^ ( \X{5} ) /x;

X 31: Витяг by графема замість of by кодова точка (підряд)
# cpan -i Unicode::GCString
використовуйте Unicode::GCString;
my $gcs = Unicode::GCString->new($str);
мій $first_five = $gcs->substr(0, 5);

X 32: Зворотній рядок by графема
Зміна коду псує діакритику, помилково перетворюючи «крем-брюле» на
"eelXurb emXerc" замість "eelurb emerc"; тому замість цього змініть графемою. Обидва
ці підходи працюють правильно незалежно від нормалізації рядка:

$str = приєднання("", зворотний $str =~ /\X/g);

# АБО: cpan -i Unicode::GCString
використовуйте Unicode::GCString;
$str = зворотний Unicode::GCString->new($str);

X 33: рядок in графеми
Рядок "brulee" має шість графем, але до восьми кодових точок. Це розраховується на
графема, а не за кодовою точкою:

my $str = "brulee";
мій $count = 0;
while ($str =~ /\X/g) { $count++ }

# АБО: cpan -i Unicode::GCString
використовуйте Unicode::GCString;
my $gcs = Unicode::GCString->new($str);
мій $count = $gcs->length;

X 34: Unicode ширина стовпця та цінності друк
"printf", "sprintf" і "format" PerlX вважають, що всі кодові точки займають 1 стовпець друку, але
багато хто приймає 0 або 2. Тут, щоб показати, що нормалізація не має значення, ми друкуємо обидва
форми:

використовуйте Unicode::GCString;
використовуйте Unicode::Normalize;

мої @words = qw/creme brulee/;
@words = map { NFC($_), NFD($_) } @words;

для мого $str (@words) {
my $gcs = Unicode::GCString->new($str);
мої $cols = $gcs->columns;
my $pad = " " x (10 - $cols);
скажіть str, $pad, " |";
}

генерує це, щоб показати, що він правильно наповнюється незалежно від нормалізації:

крем |
creXme |
брюле |
bruXleXe |

X 35: Unicode звірення
Текст, відсортований за цифровим кодом, не дотримується розумного алфавітного порядку; використовувати UCA для
сортування тексту.

використовуйте Unicode::Collate;
мій $col = Unicode::Collate->new();
мій @list = $col->sort(@old_list);

Див ucsort програма з модуля Unicode::Tussle CPAN для зручного командного рядка
інтерфейс до цього модуля.

X 36: Справа- та нечутливий до наголосу Unicode сортувати
Укажіть ступінь зіставлення рівня 1, щоб ігнорувати регістр і діакритичні знаки, дивлячись лише на
основний характер.

використовуйте Unicode::Collate;
мій $col = Unicode::Collate->new(level => 1);
мій @list = $col->sort(@old_list);

X 37: Unicode місце дії звірення
Деякі локалі мають спеціальні правила сортування.

# або використовуйте v5.12, АБО: cpan -i Unicode::Collate::Locale
використовувати Unicode::Collate::Locale;
my $col = Unicode::Collate::Locale->new(locale => "de__phonebook");
мій @list = $col->sort(@old_list);

Команда ucsort згадана вище програма приймає параметр "--locale".

X 38: Робить "cmp" робота on текст замість of кодові точки
Замість цього:

@srecs = sort {
$b->{ВІК} <=> $a->{ВІК}
||
$a->{NAME} cmp $b->{NAME}
} @recs;

Використовуй це:

мій $coll = Unicode::Collate->new();
для мого $rec (@recs) {
$rec->{NAME_key} = $coll->getSortKey( $rec->{NAME});
}
@srecs = sort {
$b->{ВІК} <=> $a->{ВІК}
||
$a->{NAME_key} cmp $b->{NAME_key}
} @recs;

X 39: Справа- та нечутливий до наголосу порівняння
Використовуйте об’єкт сортування, щоб порівнювати текст Unicode за символом, а не за кодовою точкою.

використовуйте Unicode::Collate;
my $es = Unicode::Collate->new(
рівень => 1,
нормалізація => undef
);

# тепер обидва вірні:
$es->eq("Гарсія", "ГАРСІЯ");
$es->eq("Маркес", "МАРКЕС");

X 40: Справа- та нечутливий до наголосу місце дії порівняння
Те саме, але в певній локалі.

мій $de = Unicode::Collate::Locale->new(
locale => "de__phonebook",
);

# тепер це правда:
$de->eq("tschuess", "TSCHUESS"); # повідомлення ue => UE, ss => SS

X 41: Unicode розрив рядків
Розбийте текст на рядки відповідно до правил Unicode.

# cpan -i Unicode::LineBreak
використовуйте Unicode::LineBreak;
використовувати charnames qw(:full);

my $para = "Це над\N{ХИФІС}довгий рядок. " x 20;
my $fmt = Unicode::LineBreak->new;
надрукувати $fmt->break($para), "\n";

X 42: Unicode текст in DBM хеші, нудний шлях
Використання звичайного рядка Perl як ключа або значення для хешу DBM ініціює широкий символ
виняток, якщо будь-які кодові точки wonXt поміщаються в байт. Ось як вручну керувати
переклад:

використовувати DB_File;
використовуйте Encode qw(encode decode);
зв'язати %dbhash, "DB_File", "pathname";

# МАГАЗИН

# припустити, що $uni_key і $uni_value є абстрактними рядками Unicode
мій $enc_key = encode("UTF-8", $uni_key, 1);
мій $enc_value = encode("UTF-8", $uni_value, 1);
$dbhash{$enc_key} = $enc_value;

# ОТРИМАННЯ

# припустимо, що $uni_key містить звичайний рядок Perl (абстрактний Unicode)
мій $enc_key = encode("UTF-8", $uni_key, 1);
моє $enc_value = $dbhash{$enc_key};
мій $uni_value = decode("UTF-8", $enc_value, 1);

X 43: Unicode текст in DBM хеші, легко шлях
Ось як неявно керувати перекладом; все кодування та декодування зроблено
автоматично, як і з потоками, які мають певне кодування:

використовувати DB_File;
використовувати DBM_Filter;

my $dbobj = зв'язати %dbhash, "DB_File", "pathname";
$dbobj->Filter_Value("utf8"); # це магічний біт

# МАГАЗИН

# припустити, що $uni_key і $uni_value є абстрактними рядками Unicode
$dbhash{$uni_key} = $uni_value;

# ОТРИМАННЯ

# $uni_key містить звичайний рядок Perl (абстрактний Unicode)
моє $uni_value = $dbhash{$uni_key};

X 44: ПРОГРАМА: Демонстрація of Unicode звірення та друк
Тут є повна програма, яка показує, як використовувати сортування залежно від локалі, регістр Unicode,
і керування шириною друку, коли деякі символи займають нуль або два стовпці, ні
тільки один стовпець кожен раз. Під час запуску наступна програма виробляє це гарно вирівняним
вихід:

Крем-брюле....... X2.00
Еклер............. X1.60
Fideua............. X4.20
Гамбургер.......... X6.00
Хамон Серрано...... X4.45
Лінгвіка........... X7.00
Паштет............... Х4.15
Груші ............. Х2.00
Печі............. X2.25
Сморброд........... X5.75
Spaetzle ............ X5.50
Xorico............. X3.00
XXXXX............. X6.50
XXX............. X4.00
XXX............. X2.65
XXXXX......... X8.00
XXXXXXX..... X1.85
XX............... X9.99
XX............... X7.50

Ось ця програма; перевірено на v5.14.

#!/usr/bin/env Perl
# umenu - демонстраційне сортування та друк Unicode їжі
#
# (обов'язкова і дедалі довша преамбула)
#
використовувати utf8;
використовувати v5.14; # для сортування по локалі
використовувати суворий;
використовувати попередження;
використовувати попередження qw(FATAL utf8); # фаталізуйте помилки кодування
використовуйте open qw(:std :utf8); # неоголошених потоків у UTF-8
використовувати charnames qw(:full :short); # непотрібний у v5.16

# std модулі
використовуйте Unicode::Normalize; # стандартний дистрибутив perl від версії 5.8
використовуйте List::Util qw(макс.); # std perl дистрибутив версії 5.10
використовувати Unicode::Collate::Locale; # стандартний дистрибутив perl від версії 5.14

# модулі cpan
використовуйте Unicode::GCString; # від CPAN

# вперед деф
підкладка ($$$);
subcolwidth(_);
підзаголовок (_);

моя %ціна = (
"XXXXX" => 6.50, # гіроскопи
"груші" => 2.00, # як гм, груші
"linguica" => 7.00, # гостра ковбаска, португальська
"xorico" => 3.00, # ковбаса чорізо, каталонська
"hamburger" => 6.00, # burgermeister meisterburger
"еклер" => 1.60, # десерт, французька
"smorbrod" => 5.75, # сендвічі, норвезька
"spaetzle" => 5.50, # Bayerisch локшина, маленькі горобці
"XX" => 7.50, # bao1 zi5, свинячі булочки на пару, мандарин
"jamon serrano" => 4.45, # сільська шинка, іспанська
"peches" => 2.25, # персики, французька
"XXXXXXX" => 1.85, # випічка з кремовою начинкою, як еклер
"XXX" => 4.00, # makgeolli, корейське рисове вино
"XX" => 9.99, # суші, японська
"XXX" => 2.65, # omochi, рисові коржі, японська
"крем-брюле" => 2.00, # крем-каталана
"fideua" => 4.20, ще # локшина, валенсійська
# (каталонська=fideuada)
"pate" => 4.15, # паста з гусячої печінки, фр
"XXXXX" => 8.00, # окономіякі, японська
);

my $width = 5 + max map { colwidth } keys %price;

# Тож азіатські речі виходять у тому порядку, що хтось
# хто читає ці сценарії, не злякається; в
# Речі CJK будуть у порядку JIS X 0208 таким чином.
my $coll = Unicode::Collate::Locale->new(locale => "ja");

для мого $item ($coll->sort(keys %price)) {
блокнот для друку (entitle($item), $width, ".");
printf " X%.2f\n", $price{$item};
}

підкладка ($$$) {
my($str, $width, $padchar) = @_;
повернути $str. ($padchar x ($width - colwidth($str)));
}

sub colwidth(_) {
my($str) = @_;
повертає Unicode::GCString->new($str)->columns;
}

підзаголовок(_) {
my($str) = @_;
$str =~ s{ (?=\pL)(\S) (\S*) }
{ ucfirst($1) . lc($2) }xge;
повернути $str;
}

Використовуйте perlunicook онлайн за допомогою сервісів onworks.net


Безкоштовні сервери та робочі станції

Завантажте програми для Windows і Linux

Команди Linux

  • 1
    4g8
    4g8
    4g8 - захоплення та перехоплення пакетів
    для комутованих мереж...
    Запустіть 4g8
  • 2
    4s-adminJ
    4s-adminJ
    4s-admin � Управління кластером 4store
    інструмент...
    Запустіть 4s-adminJ
  • 3
    скорочення
    скорочення
    creduce - редуктор програм C і C++
    ОПИС: creduce 2.5.0 (невідомо) --
    програмний редактор C і C++ C-Reduce
    вимагає «тесту на цікавість» і
    один або...
    Запустіть creduce
  • 4
    плазуни
    плазуни
    CREEPY - інформація про геолокацію
    агрегатор ОПИС: creepy is an
    додаток, що дозволяє збирати
    інформація про геолокацію
    користувачі з...
    Біг моторошно
  • 5
    g.gisenvgrass
    g.gisenvgrass
    g.gisenv - Виводить і змінює
    поточні налаштування змінної GRASS користувача.
    Друкує всі визначені змінні GRASS, якщо ні
    надається варіант. КЛЮЧОВІ СЛОВА: загальні,
    налаштувати...
    Запустіть g.gisenvgrass
  • 6
    g.guigrass
    g.guigrass
    g.gui – запускає графічний користувач GRASS
    сеанс інтерфейсу (GUI). Додатково
    оновлює налаштування інтерфейсу користувача за замовчуванням.
    КЛЮЧОВІ СЛОВА: загальні, GUI, інтерфейс користувача ...
    Запустіть g.guigrass
  • Детальніше »

Ad