Kdy Perl automatické inicializace proměnné?

hlasů
7

Zde jsou některé jednoduché Perl spočítat, kolikrát je hodnota vyskytuje v matici. To běží bez varování.

use warnings;
use strict;

my @data = qw(1 1 2 3 4 5 5 5 9);
my %histogram;
foreach (@data)
{
    $histogram{$_}++;
}

Když je tělo smyčky změněn na

$histogram{$_} = $histogram{$_} + 1;

Perl varuje „Použití neinicializovanou hodnoty navíc“.

To, co se děje pod kapotou? Proč je hodnota inicializuje když jsou dodávány jako operand pro operátor ++ a neinicializované s operátorem +?

Položena 04/11/2008 v 03:57
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
14

Operátor + vyhodnocuje jak formu doleva a formu vpravo, pak vrací součet obou. Vyhodnocení hash volání nevidí žádný zvláštní kontext.

Operátor ++ má nějaký zvláštní magie postavená v Cituji z perlop manuálové stránce, pokud jde o provozovatele ++.:

„UNDEF“ se vždy považují za číselné, a zejména je změněn na 0 ° C před postupně (tak, aby se po inkrement hodnotou UNDEF vrátí 0 spíše než „UNDEF“).

editovat : Vypracovat na rozdílu, ++ změní hodnotu na svém místě, zatímco + prostě vezme své argumenty jako vstup. Když + vidí nedefinovanou hodnotu, obvykle něco pokazilo, ale ++ vaše hash manipulace příklad je velmi typické - uživatel chce léčit UNDEF 0, namísto toho, aby musel kontrolovat a inicializovat pokaždé. Takže se zdá, že má smysl pro léčbu těchto operátorů tímto způsobem.

Odpovězeno 04/11/2008 v 04:05
zdroj uživatelem

hlasů
7

Někteří operátoři záměrně vynechat „neinicializované“ varování pro vaše pohodlí, protože jsou běžně používány v situacích, kde 0 nebo „“ Výchozí hodnota pro levou nebo jediný operand smysl.

Jedná se o: ++ a - (buď před nebo po) + =, - =, =, | =, ^ =, = &&, || =..

Všimněte si, že některé z nich chybně dát varování při použití na svázané proměnné: viz testy označené TODO v http://perl5.git.perl.org/perl.git/blob/HEAD:/t/op/assignwarn.t ,

Odpovězeno 04/11/2008 v 05:52
zdroj uživatelem

hlasů
7

To neznamená, že Perl nutně inicializuje hodnoty, ale že to není vždy upozorňovat na ně. Nesnažte se přemýšlet o pravidlo pro to, protože budete vždy najít výjimky, a ve chvíli, kdy si myslíte, že jste to zjistili, příští verze Perlu změnit upozornění na vás.

V tomto případě, jak bylo řečeno Harleqin provozovatelé auto-přírůstek mají zvláštní případ.

Odpovězeno 04/11/2008 v 04:22
zdroj uživatelem

hlasů
0

Jak je zmíněno Brian: je to stále dělá, že právě vás upozorní. Varování říct o určitých manipulace s efekty jste možná ještě určen.

Ty jsou speciálně žádat o hodnotu $histogram{$_}, přidáním 1 k němu a pak přiřazení do stejného slotu. Je to stejným způsobem, že bych nečekal autovivification pracovat tady:

my $hash_ref = $hash_for{$key_level_1};
$hash_ref->{$key_level_2} = $value;

jak to dělá tady:

$hash_for{$key_level_1}{$key_level_2} = $value;

Magie pravděpodobně nefunguje jako optimalizace. A optimalizace kompilátoru nevšimne, že a = a + 1je totéž jako a++tak, aby tam byly operátor přírůstek v jazyce sestavení, může použít tuto optimalizovanou instrukci namísto předstírat, že je potřeba, aby se zachovala první hodnotu, a pak přepsat, protože to není skutečně zapotřebí.

Optimalizace je zvýšený dohled a režii jednou pro zlepšení výkonu v každém běhu. Ale není tam žádná záruka, v dynamickém jazyku, že nejste přidání režie na stejné úrovni, kterou by jinak byly snaží se ho snížit.

Odpovězeno 04/11/2008 v 05:14
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more