Проблема, которую вы описываете, представляет собой стандартное поведение в системах, на которых я тестировал. I
и O
влияют на stdin и stdout, поэтому это должно работать:
→ cat data | perl -CIO -pe 's/.*(..)$/$1/'
ρε
小红
В то время как это может не работать:
→ perl -CIO -pe 's/.*(..)$/$1/' data
ε
º¢
Есть еще два варианта для perl - C
, которые производят желаемое поведение.
i 8 UTF-8 is the default PerlIO layer for input streams
o 16 UTF-8 is the default PerlIO layer for output streams
Что в основном говорит perl: используйте открытую форму файла:
open(F, "<:utf8", "data");
или вы можете использовать perl -CSD
, что является сокращением для perl -CIOEio
S 7 I + O + E
D 24 i + o
Тогда вы получите
→ perl -CSD -pe 's/.*(..)$/$1/' data
ρε
小红
] Если переменная среды PERLIO
установлена и включает : utf8
, это поведение также будет включено.
Похоже, что поведение по умолчанию для perl
также нельзя изменить во время настройки / компиляции (комментарий cuonglm ниже). Arch определенно ничего не устанавливает . Я сомневаюсь, что пакеты debian perl изменят поведение по умолчанию.