uninitialized value in string

uninitialized value in string

am 27.04.2006 08:13:58 von Heiko Rompel

Moin,

ich habe in %diff folgendes:
file_1143893435.jpg
Kopie von file_1143893435.jpg

Warum kommt es dann bei einem
2 use warnings;
3 use diagnostics;
4 use strict;
....
19 my $f = '';
....
50 foreach $f (%diff) {
51 if (-e "$f"){

in der if - Zeile zu folgender Warnung:
Use of uninitialized value in string at del_test.pl line 51 (#1)
(W uninitialized) An undefined value was used as if it were already
defined. It was interpreted as a "" or a 0, but maybe it was a mistake.
To suppress this warning assign a defined value to your variables.


Die Schleife darf doch nur zweimal laufen und hat beidesmal einen Wert.

Ich weiß das es sich nicht um eine Fehlermeldung sondern um eine Warnung
handelt, aber auch diese möchte ich beseitigen.

MfG
Heiko

Re: uninitialized value in string

am 27.04.2006 09:08:34 von f.ballandt

Heiko Rompel schrieb:
> Moin,
>
> ich habe in %diff folgendes:
> file_1143893435.jpg
> Kopie von file_1143893435.jpg
>
> Warum kommt es dann bei einem
> 2 use warnings;
> 3 use diagnostics;
> 4 use strict;
> ...
> 19 my $f = '';
> ...
> 50 foreach $f (%diff) {
> 51 if (-e "$f"){
>


geht es hier um einen hash oder ein array?

frank

Re: uninitialized value in string

am 27.04.2006 09:37:45 von Heiko Rompel

Hallo,

"f.ballandt" schrieb:

>> ich habe in %diff folgendes:
>> file_1143893435.jpg
>> Kopie von file_1143893435.jpg
>>
>> Warum kommt es dann bei einem
>> 2 use warnings;
>> 3 use diagnostics;
>> 4 use strict;
>> ...
>> 19 my $f = '';
>> ...
>> 50 foreach $f (%diff) {
>> 51 if (-e "$f"){
>>
>
>
> geht es hier um einen hash oder ein array?

44 ### Zu löschende Dateien ermitteln
=======================================
45 @diff{ @dateien } = ();
46 s/newsbilder/dateien/ for @newsbilder;
47 delete @diff{ @newsbilder };

Tja, da bin ich mir aufgrund von Zeile 45 nicht so sicher ....
Was macht das denn in meinem Fall füre Zeile 51 für einen
Unterschied?

MfG
Heiko

Re: uninitialized value in string

am 27.04.2006 09:50:05 von Arne Ruhnau

Heiko Rompel wrote:
> Hallo,
>
> "f.ballandt" schrieb:
>
>>> ich habe in %diff folgendes:
>>> file_1143893435.jpg
>>> Kopie von file_1143893435.jpg
>>>
>>> Warum kommt es dann bei einem
>>> 2 use warnings;
>>> 3 use diagnostics;
>>> 4 use strict;
>>> ...
>>> 19 my $f = '';
>>> ...
>>> 50 foreach $f (%diff) {
>>> 51 if (-e "$f"){
>>>
>>
>>
>> geht es hier um einen hash oder ein array?
>
>
> 45 @diff{ @dateien } = ();
> 46 s/newsbilder/dateien/ for @newsbilder;
> 47 delete @diff{ @newsbilder };
>
> Tja, da bin ich mir aufgrund von Zeile 45 nicht so sicher ....
> Was macht das denn in meinem Fall füre Zeile 51 für einen
> Unterschied?

In Zeile 50 wird der %diff-Hash "abgeflacht" zu einer Liste der Form
(Key1, Wert1, Key2, Wert2, ...). läuft also viermal. Was du willst ist

foreach $f (keys %diff) { nur über die Schlüssel iterieren
if (-e $f) { # die Anführungszeichen sind überflüssig

Den Unterschied machen übrigens die Klammern bei der Indizierung: {}
bei Hashes, [] bei Arrays. Das @ vor diff (in 45) weist darauf hin,
dass du eine Liste zurückgibst.

hth,

Arne Ruhnau

Re: uninitialized value in string

am 27.04.2006 09:54:33 von Christian Winter

Heiko Rompel schrieb:
> Hallo,
>
> "f.ballandt" schrieb:
>
>>> ich habe in %diff folgendes:
>>> file_1143893435.jpg
>>> Kopie von file_1143893435.jpg
>>>
>>> Warum kommt es dann bei einem
>>> 2 use warnings;
>>> 3 use diagnostics;
>>> 4 use strict;
>>> ...
>>> 19 my $f = '';
>>> ...
>>> 50 foreach $f (%diff) {
>>> 51 if (-e "$f"){
>>>
>>
>>
>> geht es hier um einen hash oder ein array?
>
>
> 44 ### Zu löschende Dateien ermitteln
> =======================================
> 45 @diff{ @dateien } = ();
> 46 s/newsbilder/dateien/ for @newsbilder;
> 47 delete @diff{ @newsbilder };
>
> Tja, da bin ich mir aufgrund von Zeile 45 nicht so sicher ....
> Was macht das denn in meinem Fall füre Zeile 51 für einen
> Unterschied?

foreach( %hash )
behandelt den Hash wie eine Liste, das heißt es werden sowohl
die Schlüssel als auch die Werte zurückgeliefert.

In Deinem Beispiel werden nur die Schlüssel besetzt, die
Werte sind aber für jeden Key undef, also sieht Perl etwas in
der Art
foreach $f ( "dateiname1", undef, "dateiname2", undef, ...)
und wirft dementsprechend bei jedem undef einen Fehler aus.

Du willst definitiv in Zeile 50 schreiben
foreach $f ( keys %diff )

HTH
-Christian

Re: uninitialized value in string

am 27.04.2006 10:46:58 von Heiko Rompel

Hallo,

> In Zeile 50 wird der %diff-Hash "abgeflacht" zu einer Liste der Form
> (Key1, Wert1, Key2, Wert2, ...). läuft also viermal. Was du willst ist

Aja, das ist also das Problem.

> foreach $f (keys %diff) { nur über die Schlüssel iterieren

Jupp, das wars.
Jetzt habe ich die letzten Tage schon so viel gelesen,
aber es gibt immer wieder Teile die in den Beispielen nicht
auftauchen.

> if (-e $f) { # die Anführungszeichen sind überflüssig

Okay, sind raus.

> Den Unterschied machen übrigens die Klammern bei der Indizierung: {} bei
> Hashes, [] bei Arrays. Das @ vor diff (in 45) weist darauf hin, dass du
> eine Liste zurückgibst.

Danke.

MfG
Heiko

Re: uninitialized value in string

am 27.04.2006 10:49:05 von Heiko Rompel

Hallo,

"Christian Winter" schrieb:

> foreach( %hash )
> behandelt den Hash wie eine Liste, das heißt es werden sowohl
> die Schlüssel als auch die Werte zurückgeliefert.

Also nicht 2 sondern 4 Durchläufe.

> In Deinem Beispiel werden nur die Schlüssel besetzt, die
> Werte sind aber für jeden Key undef, also sieht Perl etwas in
> der Art
> foreach $f ( "dateiname1", undef, "dateiname2", undef, ...)
> und wirft dementsprechend bei jedem undef einen Fehler aus.

Da hätte ich ohne diese super ng lage suchen können.

> Du willst definitiv in Zeile 50 schreiben
> foreach $f ( keys %diff )

kleine Ursache - große Wirkung.

Und wiedermal Danke.

MfG
Heiko