is_utf8
проверяет, включен флаг Perl utf8 или нет. Скаляр может содержать правильно сформированный utf-8 и не иметь включенного флага. Я думаю, что возможно сознательно включить флаг даже с искаженным utf-8, но я не уверен.
Чтобы проверить, содержит ли скаляр данные UTF-8, необходимо проверить флаг, а если нет, также попробовать что-то вроде
eval {
my $utf8 = decode_utf8 ($scalar);
}
, а затем проверьте наличие ошибок в $@
.
Чтобы проверить, содержит ли скаляр не UTF-8 данные не ASCII, ваша идея $scalar =~ m/\A [[:ascii:]]* \Z/xms
выглядит хорошо.