Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > AtiveState Perl и файлы с русскими именами


Автор: dead_ricky 4.5.2006, 07:51
Код

@ARGV = `where /r c:\\temp *.*`;
foreach (@ARGV)
{
    chomp();
    if(-f)  
    {
        print($_ . "\n");
        print((stat($_))[7] . "\n");
    }
}


Данный код не проглатывает файлы с русскими именами и расширениями smile. Ни -f, ни (stat($_))[7]. Как заставить глотать?  smile)  

Автор: sharq 4.5.2006, 10:08
dead_ricky, я не знаю что за команда where, но догадываюсь, что она делает  smile 
ВОт тебе пример, русские имена файлов обрабатываются:

Код

use strict;

opendir my $dh, 'c:\\Documents and Settings\\sharq\\Рабочий стол\\';
foreach (readdir $dh) {
    printf "%15s %10d\n", $_, (stat($_))[7] if -f;
}


Результат:
Цитата

>perl твой_скрипт.pl
      DiskInfo.lnk           435
 RegCleaner.lnk          546
     CCleaner.lnk        1464
 твой_скрипт.pl          156
        Thumbs.db        4608


На платформах Windows у ActiveState проблем с локалью нет, по крайней мере, я первый раз об этом слышу.  smile 

Если все-таки какие-то проблемы возникают, а именно не обрабатываются русские имена, то попробуй это:
Код

use locale;
use POSIX qw (locale_h);
setlocale(LC_CTYPE, 'ru_RU.CP1251');
setlocale(LC_ALL, 'ru_RU.CP1251');


Иногда хватает только 
Код

use locale; 


 smile   

Автор: dead_ricky 4.5.2006, 13:17
спасибо за ответ, но у меня че-то не заработало:

Код

use strict;
use locale;
use POSIX qw (locale_h);    

setlocale(LC_CTYPE, 'ru_RU.CP1251');    
setlocale(LC_ALL, 'ru_RU.CP1251');
@ARGV = `dir /S/B`; # заносим в ARGV список файлов
foreach (@ARGV)
{
    chomp();
    print($_ . "\t" . (-s) . "\n");
}


результат:

Цитата

C:\Temp\test>test.pl
C:\Temp\test\rez        414
C:\Temp\test\test.pl    322
C:\Temp\test\test.pl~   322
C:\Temp\test\test.vbs   338
C:\Temp\test\зло


сделал так:

Код

use strict;
use Encode;

@ARGV = `dir /S/B`; # заносим в ARGV список файлов
foreach (@ARGV)
{
    chomp();
    Encode::from_to($_, "cp866", "windows-1251");
    print($_ . "\t" . (-s) . "\n");
}


результат:

Цитата

C:\Temp\test>test.pl
C:\Temp\test\rez        414
C:\Temp\test\test.pl    205
C:\Temp\test\test.pl~   322
C:\Temp\test\test.vbs   338
C:\Temp\test\чыю        4605   # главное файл видит smile


 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)