2013-09-20 2 views
4

Я объявляющий то же имя переменной с @ и $:

@ask=(1..9); 
$ask="insanity"; 
print ("Array @ask\n"); 
print ("Scalar $ask\n"); 

Без использования use strict Я правильно получать выход, но когда я использую use strict это дает мне ошибка компиляции.

Связаны ли эти две переменные с двумя разными ячейками памяти или это одна и та же переменная?

ответ

20

У вас есть две переменные:

@ask 
$ask 

Вы могли бы %ask (хэш) тоже, если вы хотите. Затем вы должны написать:

print $ask, $ask[0], $ask{0}; 

ссылка на скаляр, массив и хэш.

Как правило, вам следует избегать этого лечения, но переменные все очень разные, и Perl не будет путать.

Единственная причина, use strict; жалуется, потому что вы не префикс переменных с my:

#!/usr/bin/env perl 
use strict; 
use warnings; 

my @ask = (1..9); 
my $ask = "insanity"; 
my %ask = (0 => 'infinity', infinity => 0); 
print "Array @ask\n"; 
print "Scalar $ask\n"; 
print "Hash $ask{0}\n"; 
+0

«Возможно, вы тоже могли бы запросить (хэш), если хотите». также '&ask' ;) – msztolcman

+0

@MySZ: да, вы правы; также '* ask', который вы можете косвенно использовать:' open ask, '>', $ ask или die; print ask @ask; '- дескриптор файла старого стиля, другими словами. Это вызывает предупреждения о «голых словах» («Нековарная строка» спрашивает «может столкнуться с будущим зарезервированным словом»). Вы использовали 'local (* ask);' в функции для создания (грубо) эквивалента лексического дескриптора файла, но лексические файловые дескрипторы настолько чище. Я просто не хотел слишком усложнять ситуацию. –

15

с use strict; вам необходимо объявить переменные, прежде чем использовать его.

Например:

use strict; 
my @ask=(1..9); 
my $ask="insanity"; 
print ("Array @ask\n"); 
print ("Scalar $ask\n"); 
+0

Зачем голосовать на этом ответе? –

+0

@mpapec Я абсолютно не понимаю; может быть, это игра ... Я уже получил downvote для хорошего ответа в прошлом ... –

+2

Было бы очень нехорошо проголосовать, чтобы объяснить свое действие? –

1

@ask и $ask различные переменные - как %ask - и это не является ошибкой, чтобы сделать это. Это, однако, плохой стиль.

Поскольку изменения Sigil, когда вы используете их, например, когда вы используете $ask[1], чтобы получить второй элемент @ask, код становится все труднее читать и use strict также не будет в состоянии сказать, если вы получили запутаться. Таким образом, это хорошая идея использовать имена, которые отличаются больше, чем сигила, если вы не знаете, что делаете. Таким образом, вы можете использовать, например. @asks и $ask.

1

Ошибка, которую вы получаете с 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"; 
} 
Смежные вопросы