Как я могу использовать функцию форматирования Perl?

#function #perl #format

#функция #perl #форматирование

Вопрос:

Я изучаю форматирование Perl, следуя руководству по Perl — Formats, но когда я ввожу их пример в свою среду разработки:

 format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<<
$name $age
@#####.##
$salary
===================================
.

select(STDOUT);
$~ = EMPLOYEE;

@n = ("Ali", "Raza", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);

$i = 0;
foreach (@n) {
   $name = $_;
   $age = $a[$i];
   $salary = $s[$i  ];
   write;
}
  

Я получаю сообщение об ошибке:

 Scalar found where operator expected at .qb.pl line 7, near "$name $age"
        (Missing operator before $age?)
syntax error at .qb.pl line 7, near "$name $age"
Execution of .qb.pl aborted due to compilation errors.
  

Я использую Perl 5, версию 30, Subversion 2 (v5.30.2), созданную для MSWin32-x64-multi-thread.

Ответ №1:

Когда я запускаю ваш код на 5.24, я вижу это предупреждающее сообщение:

Использование списка переменных без запятой устарело на…

которая также указывает на $name $age строку.

Когда я включаю диагностику, я получаю это объяснение:

 (D deprecated) The values you give to a format should be
separated by commas, not just aligned on a line.
  

Когда я добавляю запятую следующим образом:

 $name,$age
  

предупреждение исчезает, и я получаю этот вывод:

 ===================================
Ali                     20
  2000.00
===================================
===================================
Raza                    30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================
  

Это предупреждение стало ошибкой в версии 5.28, согласно perl5280delta.

Ответ №2:

Ваша первая ошибка заключалась в том, что вы думали, что форматы — это полезный инструмент, который решит вашу проблему. Форматы в основном игнорировались почти столько же, сколько я использую Perl. Вероятно, вы обнаружите, что использование Perl6::Form является лучшим подходом.

Ваша вторая ошибка заключалась в том, что вы думали, что Tutorials Point — это хорошее место для получения информации о чем угодно. Учебные пособия там написаны людьми, которые, кажется, почти ничего не знают о своем предмете, и (как вы видели здесь) примеры изобилуют опечатками, что делает их практически бесполезными.

Если вы твердо решили использовать форматы Perl, то страница руководства по perlform будет лучшим местом для начала.

Комментарии:

1. О, действительно? Почему они игнорируются? Кроме того, что было бы лучшим источником для изучения?

2. Они в основном игнорируются, поскольку они слишком сложны в использовании и не очень гибкие. Если вы ищете лучшие руководства по Perl, то learn.perl.org это хорошее место для начала.

3. Я не думаю, что форматы сложны в использовании, и они могут быть очень полезны при создании приятных печатных выходных данных, но, да, Perl6::Form более гибкий и имеет гораздо больше вариантов форматирования, доступных для разных типов данных, чем строки.

4. К сожалению, у Tutorials Point очень хороший SEO.

Ответ №3:

Возможно, следующий пример кода легче читать. Вывод также легче понять с первого взгляда:

 use strict;
use warnings;

my($name, $age, $salary);

while(<DATA>) {
    ($name, $age, $salary) = split;
    write;
}

format STDOUT_TOP =
 Employee               Age      Salary
----------------------------------------
.

format STDOUT =
 @<<<<<<<<<<<<<<<<<<<<<< @<<   @#####.##
$name, $age, $salary
.

__DATA__
Ali        20    2000.00
Raza       30    2500.00
Jaffer     40    4000.00
  

Вывод

  Employee               Age      Salary
----------------------------------------
 Ali                     20      2000.00
 Raza                    30      2500.00
 Jaffer                  40      4000.00
  

Существует много способов предоставления входных данных. Одним из них является хэш для хранения связанных данных.

 use strict;
use warnings;

my %employees = (
    Ali       => { age => 20, salary => 2000.00},
    Raza      => { age => 30, salary => 2500.00},
    Jaffer    => { age => 40, salary => 4000.00}
    );

my($name, $age, $salary);

for $name (sort keys %employees) {
    ($age, $salary) = @{$employees{$name}}{qw/age salary/};
    write;
}

format STDOUT_TOP =
 Employee               Age      Salary
----------------------------------------
.

format STDOUT =
 @<<<<<<<<<<<<<<<<<<<<<< @<<   @#####.##
$name, $age, $salary
.
  

Вывод

  Employee               Age      Salary
----------------------------------------
 Ali                     20      2000.00
 Jaffer                  40      4000.00
 Raza                    30      2500.00