• Как победить кракозябры при вставке в бд PERL?

    @gangabass
    В самом начале после подключения к БД:
    $dbh->do(qq{SET NAMES 'utf8'}) or die $dbh->errstr;
    Ответ написан
    Комментировать
  • Perl + Win32::GUI - Как отменить стандартное поведение обработчика события?

    @gangabass
    sub tf_Update {
    
        if ( $w->tf->Text() !~ m/^([0-9]{0,8}(?:[\.,][0-9]{0,2})?)$/ ) {
    
            $w->tf->Text("");
        }
    }


    Этот код очищает поле полностью. Если нужно удалять только последний введённый символ, то можно отсекать его от текущего значения поля...
    Ответ написан
    Комментировать
  • Почему пропадает текст при склейке Excel файлов в Perl?

    @gangabass
    Возможно дело в Excel::Reader::XLSX. Мой код работает:
    use Excel::Writer::XLSX;
    use Spreadsheet::ParseXLSX;
    use threads;
    use feature qw(say);
    use Encode qw(decode);
    
    my $target_workbook = Excel::Writer::XLSX->new("Result.xlsx");
    
    #Обрабатываю два файла "Sample_Сентябрь_2014.xlsx" и "Sample_Октябрь_2014.xlsx")
    my @source_files = glob("Sample_*.xlsx");
    
    
    my $thread = threads->create(
        sub {
            foreach my $source_file (@source_files) {
    
                my $reader          = Spreadsheet::ParseXLSX->new();
                my $source_workbook = $reader->parse($source_file);
    
                my ($target_worksheet_name) = $source_file =~ m/Sample_(.+)\.xlsx$/;
    
                $target_worksheet_name =
                  decode( 'windows-1251', $target_worksheet_name );
                my $target_worksheet =
                  $target_workbook->add_worksheet($target_worksheet_name);
    
                my ($worksheet) = $source_workbook->worksheets();
    
                my ( $row_min, $row_max ) = $worksheet->row_range();
                my ( $col_min, $col_max ) = $worksheet->col_range();
    
                foreach my $row ( $row_min .. $row_max ) {
    
                    foreach my $col ( $col_min .. $col_max ) {
    
                        my $cell = $worksheet->get_cell( $row, $col );
                        my $value = $cell->value();
                        $target_worksheet->write( $row, $col, $value );
                    }
                }
            }
    
            $target_workbook->close();
            exit;
        }
    );
    
    $thread->join();
    Ответ написан
    Комментировать
  • Текстовый файл открывается одной строкой, как парсить?

    @gangabass
    Правильнее использовать парсер. Например, XML::LibXML:

    use XML::LibXML;
    use feature qw(say);
    
    my $filename = "Sample.xml";
    
    my $parser = XML::LibXML->new();
    my $doc    = $parser->parse_file($filename);
    my $root   = $doc->getDocumentElement;
    
    foreach my $node ( $doc->findnodes('//ip') ) {
        my $value = $node->textContent();
    
        say $value;
    }


    По поводу XML::Simple
    Создатель XML::Simple сам предлагает использовать XML::LibXML:
    STATUS OF THIS MODULE

    The use of this module in new code is discouraged. Other modules are available which provide more straightforward and consistent interfaces. In particular, XML::LibXML is highly recommended.

    The major problems with this module are the large number of options and the arbitrary ways in which these options interact - often with unexpected results.

    Patches with bug fixes and documentation fixes are welcome, but new features are unlikely to be added.
    Ответ написан
    Комментировать