Есть несколько (потенциальных) проблем с вашим кодом:
Ваш код отфильтровывает все папки документов, которые не соответствуют регулярному выражению в $_REQUEST{q}
, однако вопрос предполагает, что вы хотите сделать обратное.
У вас может быть проблема с кодировкой. Установка языкового стандарта (используя setlocale) изменяет обработку perl преобразований в верхнем и нижнем регистре, но не меняет никакой кодировки. Вы должны убедиться, что $_REQUEST{q}
интерпретируется правильно.
Для простоты вы можете предположить, что любая Perl-строка содержит Unicode-данные в некотором внутреннем представлении, о котором вам не нужно подробно знать. Только когда Perl делает ввод / вывод, происходит неявное или явное преобразование. При чтении из stdin, ARGV или окружения Perl предполагает, что байты кодируются с использованием текущей локали, и неявно преобразует.
Если у вас есть проблема с кодировкой, есть несколько способов ее исправить:
- Исправьте среду, в которой работает Perl, чтобы он знал о правильной локали с самого начала. Это исправит неявное преобразование.
- В маловероятном случае, когда
$_REQUEST
загружается из файлового дескриптора, вы можете явно указать Perl конвертировать, используя binmode($fh, ":encoding(cp1251)");
. Сделайте это до прочтения $_REQUEST
.
- Существует функция
$string = Encode::decode(Encoding, $octets)
, которая заставляет Perl забыть свое предположение о кодировке $octets
и вместо этого обрабатывать содержимое $octets
как поток байтов, который необходимо преобразовать в Unicode с помощью Encoding
. Это необходимо сделать перед тем, как дотронуться до содержимого $octets
, иначе могут произойти странные вещи.
- Поскольку
$_REQUEST
, вероятно, был загружен каким-то cgi-модулем и, вероятно, был кодирован в кодировке URL при передаче, вы можете просто сказать cgi-модулю, как правильно выполнять декодирование.