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