Ошибка, которую вы получаете с strict не из-за имен переменных. Это происходит потому, что вы не объявляем переменные (с использованием одного из my, our, local или state Также вы с помощью vars прагму
Короткий ответ:.. Просунуть my
перед каждой переменной, и вы будете be strict
-compliant.
Для переменных пакета вы можете просмотреть записи в symbol table.$ask
и @ask
являются отдельными юридическими лицами:
#!/usr/bin/env perl
use Devel::Symdump;
use YAML;
@ask=(1..9);
$ask="insanity";
my $st = Devel::Symdump->new('main');
print Dump [ $st->$_ ] for qw(
scalars
arrays
);
Среди прочего, этот код выведет:
--
…
- main::ask
…
---
…
- main::ask
…
Будучи в состоянии использовать то же имя может помочь, когда, скажем, у вас есть массив рыбы и вы делаете что-то с каждой рыбой в массиве:
for my $fish (@fish) {
go($fish);
}
Обычно, более выразительный, чтобы использовать форму множественного числа для массивов и хэш, то singul ar form для элементов массива и что-то, основанное на единственной форме для ключей в хеше:
#!/usr/bin/env perl
use strict;
use warnings;
my @ships = ('Titanic', 'Costa Concordia');
my %ships = (
'Titanic' => {
maiden_voyage => '10 April 1912',
capacity => 3_327,
},
'Costa Concordia' => {
maiden_voyage => '14 July 2006',
capacity => 4_880,
},
);
for my $ship (@ships) {
print "$ship\n";
}
while (my ($ship_name, $ship_details) = each %ships) {
print "$ship_name capacity: $ship_details->{capacity}\n";
}
«Возможно, вы тоже могли бы запросить (хэш), если хотите». также '&ask' ;) – msztolcman
@MySZ: да, вы правы; также '* ask', который вы можете косвенно использовать:' open ask, '>', $ ask или die; print ask @ask; '- дескриптор файла старого стиля, другими словами. Это вызывает предупреждения о «голых словах» («Нековарная строка» спрашивает «может столкнуться с будущим зарезервированным словом»). Вы использовали 'local (* ask);' в функции для создания (грубо) эквивалента лексического дескриптора файла, но лексические файловые дескрипторы настолько чище. Я просто не хотел слишком усложнять ситуацию. –