Как правильно писать однострочные символы Unicode в Perl? Очевидный способ:
$ echo 'フーバー' | perl -lne 'print if /フ/'
フーバー
... вроде бы работает на первый взгляд, но это просто случайность: Unicode интерпретируется как байты, как показывает следующий пример:
$ echo 'フーバー != フウバー' | perl -mString::Diff=diff -lne 'print join(" ", diff($1, $2)) if /(.*)!=(.*)/' => 29
フ?[??]バー[ ] { }フ?{??}バー
Просто используя -C
, чтобы установить STDIN
/ STDOUT
и т. д. в UTF ‑ 8 недостаточно:
$ echo 'フーバー' | perl -C -lne 'print if /フ/'
[no output]
... потому что теперь текст в -e
не интерпретируется как Unicode.
Итак, это путь (при условии, что LOCALE вменяется, то есть в форме "*. UTF ‑ 8"
) следующим образом:
$ perl -C -Mutf8 [...]