застрял в понимании "$ worksheet-> add_write_handler (qr [\ w], \ & store_string_widths);"строка в следующем фрагменте кода - PullRequest
0 голосов
/ 20 октября 2018

Моя последняя цель для моей первой программы на Perl: создать лист Excel для отчета и отправить по электронной почте лист в виде вложения.

Я достиг до создания файла CSV.Теперь я хотел преобразовать это в лист Excel и автоматически подогнать содержимое.

У меня есть пример кода в нашей среде, может кто-то потратит время на объяснение каждой строки в приведенном ниже коде, это было бы очень признательно.

outputfile, urloutputfile, scomoutputfile - это файлы csv, которые теперь преобразуются в листы Excel.

Пожалуйста, объясните, как элемент передается и другой функции.

my $parser = Text::CSV::Simple->new;
my $workbook = Excel::Writer::XLSX->new($auditxl);
my @totcsvlist;
push(@totcsvlist,$outputfile);
push(@totcsvlist,$urloutputfile);
push(@totcsvlist,$scomoutputfile);
my @data;
my $subject = 'worksheet';
foreach my $totcsvlis (@totcsvlist)
{
    undef @data;
    chomp($totcsvlis);
    if ($totcsvlis eq $outputfile) { $subject="Service Status"; }
    if ($totcsvlis eq $urloutputfile) { $subject="URL Status"; }
    if ($totcsvlis eq $scomoutputfile) { $subject="SCOM Agent Status"; }
    @data = $parser->read_file($totcsvlis);
    my $headers = shift @data;
    import_data($workbook, $subject, $headers, \@data);
}
$workbook->close();


sub autofit_columns {
    my $worksheet = shift;
    my $col       = 0;
    for my $width (@{$worksheet->{__col_widths}}) {
        $worksheet->set_column($col, $col, $width) if $width;
        $col++;
    }
}

sub import_data {
    my $workbook  = shift;
    my $base_name = shift;
    my $colums    = shift;
    my $data      = shift;
    my $limit     = shift || 50_000;
    my $start_row = shift || 1;
    my $bold = $workbook->add_format();
    $bold->set_bold(1);
    $bold->set_bg_color('gray');
    $bold->set_border();
    my $celbor = $workbook->add_format();
    $celbor->set_border();
    my $worksheet = $workbook->add_worksheet($base_name);
    $worksheet->add_write_handler(qr[\w], \&store_string_widths);
    my $w = 1;
    $worksheet->write('A' . $start_row, $colums, $bold);
    my $i = $start_row;
    my $qty = 0;
    for my $row (@$data) {
        $qty++;

        $worksheet->write($i++, 0, $row,$celbor);
    }
    autofit_columns($worksheet);
    warn "Convereted $qty rows.";
    return $worksheet;
}

sub autofit_columns {

    my $worksheet = shift;
    my $col       = 0;

    for my $width (@{$worksheet->{__col_widths}}) {

        $worksheet->set_column($col, $col, $width + 5) if $width;
        $col++;
    }
}

sub store_string_widths {

    my $worksheet = shift;
    my $col       = $_[1];
    my $token     = $_[2];

    return if not defined $token;       # Ignore undefs.
    return if $token eq '';             # Ignore blank cells.
    return if ref $token eq 'ARRAY';    # Ignore array refs.
    return if $token =~ /^=/;           # Ignore formula

    return if $token =~ m{^[fh]tt?ps?://};
    return if $token =~ m{^mailto:};
    return if $token =~ m{^(?:in|ex)ternal:};


    my $old_width    = $worksheet->{__col_widths}->[$col];
    my $string_width = string_width($token);

    if (not defined $old_width or $string_width > $old_width) {

        $worksheet->{__col_widths}->[$col] = $string_width;
    }

    return undef;
}


sub string_width {

    return length $_[0];
}

Я пытался искать и читать модули, использованные в приведенном выше коде, но накладные расходы.https://github.com/jmcnamara/spreadsheet-writeexcel/blob/master/examples/autofit.pl - имеет аналогичный код и предоставил базовый вид.но я хотел бы понять в деталях.

Большое спасибо заранее.С уважением, Каушик КМ

1 Ответ

0 голосов
/ 20 октября 2018

Вот документация для вызова метода add_write_handler().Там написано:

add_write_handler ($ re, $ code_ref)

Этот метод используется для расширения метода write () Excel :: Writer :: XLSXдля обработки пользовательских данных.

И позже он говорит:

Метод add_write_handler() принимает два аргумента, $re, регулярное выражение для сопоставления входящих данныхи $code_ref функция обратного вызова для обработки сопоставленных данных

Итак, здесь у вас есть вызов метода, который принимает два аргумента.Первый - это регулярное выражение, которое сообщает объекту, для какого типа данных используется этот новый обработчик записи.Вторая - это ссылка на подпрограмму, которая должна использоваться в качестве обработчика записи для данных, соответствующих регулярному выражению.

Имеется регулярное выражение qr[\w].Фактический бит регулярного выражения это \w.И это просто означает «соответствовать символу слова».qr предназначен для компиляции строки в регулярное выражение, а [ ... ] - просто разделитель для строки регулярного выражения (qr/.../ - это один из классов операторов Perl, который позволяет вам использовать практически любой символ, который вы хотите использовать в качестве разделителя.).

Итак, если ваш объект вызывается для записи некоторых данных, содержащих хотя бы один символ слова, используется подпрограмма, заданная в качестве второго аргумента.Но мы берем ссылку на подпрограмму.

В другом месте вашего кода вы определяете подпрограмму store_string_widths().Подпрограммы в Perl очень похожи на переменные, и это означает, что у них есть собственный сигил.Символ для подпрограммы - & (например, $ для скаляра и @ для массивов).Вам очень редко нужен & в современном Perl-коде, поэтому вы не увидите, чтобы он использовался очень часто.Одно из мест, где он все еще используется, - это когда мы берем ссылку на подпрограмму.Вы берете ссылку на любую переменную, помещая косую черту перед полным именем переменной (например, \@array или \%hash), и подпрограммы ничем не отличаются.Так что \&store_string_widths означает «получить ссылку на подпрограмму с именем store_string_widths()».

Вы говорите, что это ваша первая Perl-программа.Я должен сказать, что это кажется немного амбициозным для вашего первого кода Perl.Я вообще не рассматриваю ссылки в моем двухдневном курсе для начинающих, а на своем промежуточном курсе я охватываю большинство ссылок, но упоминания о подпрограммах упоминаются попутно.Если вы можете понять ссылки достаточно, чтобы все это заработало, то, я думаю, у вас все хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...