Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

vytvoreni polozky v hash

8 views
Skip to first unread message

Petr Vileta

unread,
Nov 24, 2005, 6:49:45 PM11/24/05
to
Mam hash, ktery je nejprve definovan globalne jako prazdny a ruzne rutiny k
nemu cosi pridavaji. Asi takto

our $hash->{klic}=undef;

&mysub1;
&mysub2;

sub mysub1 {
for my $i (0..3) {
$hash->{klic}->[@{$hash->{klic}} + 1] = $i;
}
}

sub mysub2 {
for my $i (4..9) {
$hash->{klic}->[@{$hash->{klic}} + 1] = $i;
}
}

No a pak jsem mel nekde v programu tohle
my $hodnota = $hash->{klic}->[$index];

ovsem $index mel v te dobe hodnotu 10, ale $hash->{klic} mel jen array
[0..9].
Predpokladal jsem, ze $hodnota bude undef, ale jake bylo moje prekvapeni,
kdyz krome tohoto predpokladu to jeste vytvorilo prazdnou (undef) bunku
$hash->{klic1}[10].

Je to normalni chovani, nebo je to bug? Nemuzu o tom nic najit.
--
Petr

Skype: callto://fidokomik

Na mail uvedeny v headeru zpravy nema cenu nic posilat, konci to v PR* :-)
Odpovidejte na petr na practisoft cz

Honza Pazdziora

unread,
Nov 26, 2005, 7:50:19 AM11/26/05
to
On Fri, Nov 25, 2005 at 12:49:45AM +0100, Petr Vileta wrote:
>
> No a pak jsem mel nekde v programu tohle
> my $hodnota = $hash->{klic}->[$index];
>
> ovsem $index mel v te dobe hodnotu 10, ale $hash->{klic} mel jen array
> [0..9].
> Predpokladal jsem, ze $hodnota bude undef, ale jake bylo moje prekvapeni,
> kdyz krome tohoto predpokladu to jeste vytvorilo prazdnou (undef) bunku
> $hash->{klic1}[10].

$ perl -v | head -2

This is perl, v5.8.6 built for i386-linux-thread-multi
$ perl
our $hash->{klic}=undef;
@{ $hash->{klic} }[ 0 .. 9 ] = ( 11 .. 20 );
my $len = @{ $hash->{klic} };
print "Len [$len]\n";
my $index = 10;


my $hodnota = $hash->{klic}->[$index];

my $len2 = @{ $hash->{klic} };
print "Len [$len2]\n";
__END__
Len [10]
Len [10]
$

--
------------------------------------------------------------------------
Honza Pazdziora | ade...@fi.muni.cz | http://www.fi.muni.cz/~adelton/
.project: Perl, mod_perl, DBI, Oracle, large Web systems, XML/XSL, ...
Only self-confident people can be simple.

Petr Vileta

unread,
Nov 26, 2005, 8:49:18 PM11/26/05
to
Honza Pazdziora wrote:
> On Fri, Nov 25, 2005 at 12:49:45AM +0100, Petr Vileta wrote:
>>
>> No a pak jsem mel nekde v programu tohle
>> my $hodnota = $hash->{klic}->[$index];
>>
>> ovsem $index mel v te dobe hodnotu 10, ale $hash->{klic} mel jen
>> array [0..9].
>> Predpokladal jsem, ze $hodnota bude undef, ale jake bylo moje
>> prekvapeni, kdyz krome tohoto predpokladu to jeste vytvorilo
>> prazdnou (undef) bunku $hash->{klic1}[10].
>
> $ perl -v | head -2
>
> This is perl, v5.8.6 built for i386-linux-thread-multi
> $ perl
> our $hash->{klic}=undef;
> @{ $hash->{klic} }[ 0 .. 9 ] = ( 11 .. 20 );
> my $len = @{ $hash->{klic} };
> print "Len [$len]\n";
> my $index = 10;
> my $hodnota = $hash->{klic}->[$index];
> my $len2 = @{ $hash->{klic} };
> print "Len [$len2]\n";
> __END__
> Len [10]
> Len [10]
> $

Omlouvam se, ale podcenil jsem proces zjednoduseni prikladu :-) Ve
skutecosti je to takhle

our $hash->{klic}->[1]->{a}=1;
my $index=2;
my $neco=$hash->{klic}->[$index]->{a};
print exists $hash->{klic}->[2];

no a to vypise 1, tedy existuje.

Pripadne:
print @{ $hash->{klic} };

vypise samozrejme 2.
Neco mi unika, ale co? :-)

Honza Pazdziora

unread,
Nov 27, 2005, 5:23:44 AM11/27/05
to
On Sun, Nov 27, 2005 at 02:49:18AM +0100, Petr Vileta wrote:
>
> our $hash->{klic}->[1]->{a}=1;
> my $index=2;
> my $neco=$hash->{klic}->[$index]->{a};
> print exists $hash->{klic}->[2];
>
> no a to vypise 1, tedy existuje.

Leva strana sipky je lvalue. Takze zafunguje autovivifikace, jinak by
to spadlo s tim, ze $hash->{klic}->[$index] neni reference.

Man perlvar(1) nebo perlfunc(1).

Petr Vileta

unread,
Nov 27, 2005, 10:19:37 AM11/27/05
to
Honza Pazdziora wrote:
> On Sun, Nov 27, 2005 at 02:49:18AM +0100, Petr Vileta wrote:
>>
>> our $hash->{klic}->[1]->{a}=1;
>> my $index=2;
>> my $neco=$hash->{klic}->[$index]->{a};
>> print exists $hash->{klic}->[2];
>>
>> no a to vypise 1, tedy existuje.
>
> Leva strana sipky je lvalue. Takze zafunguje autovivifikace, jinak by
> to spadlo s tim, ze $hash->{klic}->[$index] neni reference.
>
> Man perlvar(1) nebo perlfunc(1).
No jo, to jsem nejak prehledl a narazil jsem na to az ted. Ale stejne mi
vrta hlavou, proc to proste nemuze do skalaru vratit undef. Jako kdyz udelam
$a = $b;
a to $b neexistuje, tak $a=undef a Perl nehlasi zadnou chybu.
No nic, clovek se porad neco uci ;-)
0 new messages