| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Системное программирование > Как скопировать файл с кириллицей в названии? |
| Автор: ijin 10.6.2009, 12:45 | ||
| Здравствуйте. Помогите пожалуйста подружить перл с кириллицей под Виндой. Я хотел написать программу, которая скопирует файлы, содержащие в названии слово "результат" в файл "(номер)_русский.txt". Если использовать файлы с латинскими названиями, то все работает (см первая часть программы). С файлами называнными кирилицей - облом. В гугле искал, базовые танцы с бубном проводил (см результаты для разных кодировок). Использую Windows XP, ActiveState Perl 5.10. , Notepad (ASNI or utf8 or uincode) и обычный cmd.exe (в смысле без /u ) Что исправить в программе? В какой кодировке сохранять текст в блокноте? Использовать ли cmd.exe /u ? Какие модули нужно поставить? Заранее спасибо.
Результаты: зависят от кодировки, но программа никогда не работает Без кодировки => ш∙хь Ёхчєы№ЄрЄ (вместо "ищем результат") use encoding "ru_RU.CP1251"; || use encoding 'cp1251'; => "\x{00a8}" does not map to cp1251 at C:\test\copy.pl line 15. use encoding 'utf-8'; => Malformed UTF-8 character (unexpected non-continuation byte ter start byte 0xf0) at C:\test\copy.pl line 15. use encoding 'cp1251', STDOUT => 'cp866'; => "\x{00a8}" does not map to cp866 at C:\test\copy.pl line 15. ищем результат #результат не найден |
| Автор: ijin 12.6.2009, 22:01 |
| Товарищи, помогите пожалуйста решить эту проблему. Я честно честно пытался решить ее сам, но не смог. Где в программе ошибка? Без поддержки имен файлов кириллицей Перл Perl не позволяет сделать очень многое. Заранее спасибо. |
| Автор: shamber 13.6.2009, 00:12 | ||
| Кто ж Вас так учил код так жестко нечитабельно оформлять? Зачем в system используете? По поводу крякозябр, все очень просто используйте модуль Convert::Cyrillic Чуток поиздевался над кодом
да и еще в начале кода добавляйте use strict; |
| Автор: mvsgt 14.6.2009, 00:09 |
| Я бы ещё использовал модули File::Copy и File::Slurp, а то программа совершенно непонятная получается. И проверял на пробелы, директории, линки... |
| Автор: ijin 14.6.2009, 19:44 | ||
Огромное спасибо, сейчас поставлю модули!
Гуру или курса по Perl у меня не было. Единственный семинар был по Перлу под линуксом. Я учился у Google. Посоветуйте книгу на тему "Как создать читабельную программу на Перле". А то я в своей проге - "крестики-нолики" с трудом разбираюсь. И еще, под виндой выражение #!/usr/local/bin/perl не имеет смысла, но и не вредит. Верно? Спасибо за помощь. |
| Автор: shamber 14.6.2009, 22:06 |
| по оформлению посмотрите на http://perltidy.sourceforge.net/ |
| Автор: ijin 14.6.2009, 23:59 |
| Поискал Convert::Cyrillic; В репозиториях activestate Perl не нашел. Скачать отсюда http://www.neystadt.org/cyrillic/ в разделе download. Этот модуль просит unicode/Map8.pm Какой-то Map8.pm я скачал отсюда http://cpansearch.perl.org/src/GAAS/Unicode-Map8-0.12/Map8.pm Теперь прога говорит Can't locate loadable object for module Unicode::Map8 in @INC У меня такой вопрос. Как пройти этот квест? |
| Автор: shamber 15.6.2009, 00:01 |
| ppm не пробовали? Добавлено через 5 минут и 48 секунд Unicode::Map8 там точно есть |
| Автор: ijin 15.6.2009, 01:20 |
| Unicode:Map там есть. И Unicode-UTF8simple там есть. А вот Unicode:Map8 в 5.10 ActiveState Perl Package Manager нет. Какие репозитории нужно добавить? |
| Автор: ijin 15.6.2009, 08:04 | ||||||
| Новости с поля боя. Переставил Перл, нашел Map8. Строка my $dirname = "./b"; выдает Error in opening dir ./b . Но работает строка
Далее, т.к. "Спасение утопающих дело рук самих утопающих" отвечаю на мой вопрос. Для работы с русским языком Перлу нужен модуль перекодировки. Вариантов перекодировки* всего три: Не перекодировать, win - dos и dos - win. Нам понадобится а. Установить модуль Convert::Cyrillic и Map8. б. Объявить Convert::Cyrillic в начале проги в. Все запросы Перл->Система надо перекодировать по схеме $Запрос_Виндам = Convert::Cyrillic::cstocs ("WIN", "DOS", $Переменная_перла ); Все запросы Система->Перл надо перекодировать по схеме $Переменная_перла = Convert::Cyrillic::cstocs ("DOS", "WIN", $Ответ_Винды ); Пошаговая инструкция на приере ActiveState Perl 1. Пишем прогу (см ниже) и запускаем под cmd. Текст проги:
Если на экране появится hi , то у вас есть этот модуль, переходите к пункту 7 Если нет, то прога скажет Can't locate Convert/Cyrillic.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at .... Тогда запоминаем директории и идем к пункту 2. 2. В Perl Package Manager выбираем "все пакеты" и ищем Map8. Если не нашли - добавляем репозитории. 3. Скачиваем поддержку кириллицы (обычно файл cyrillic-1.xx.tar.gz), например отюда http://search.cpan.org/~jneystadt/cyrillic-1.05/Convert/Cyrillic.pm 4. Распаковываем архив и кладем папки и файлы (Convert, Lingua, Makefile.PL и т.д.) в директорию из пункта 1 (в примере в C:/Perl/site/lib). 5. В cmd идем в C:/Perl/site/lib и запускаем Makefile.PL Смотрим, все ли модули он поставил. 6. Опять запускаем прогу из пункта 1. Теперь она должна написать hi. 7. Создаем папку, в папке файлы-пустышки проверка.txt и dummy.txt . В ту же папку записываем прогу, текст которой приведен ниже. Смотрим как правильно кодировать для вывода на экран, в винду, и т.д. Внимание, Проге нужны файлы проверка.txt и dummy.txt (не важно с чем, хоть пустые) Прога создаст полдюжины текстовых файлов (удалите их). Стиль кода может травмировать слабонервных эстетов. Зато программа работает.
___ * В первом приближении, для работы с кириллицей |