#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