Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8930[/thread]

Hash in Sub dereferenzieren (Seite 2)

Leser: 2


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Opaxtl
 2007-04-19 17:28
#76048 #76048
User since
2007-03-21
12 Artikel
BenutzerIn
[default_avatar]
Also hat im Grunde nur das @_ hinter shift gefehlt? Na gut.

Danke euch!

@docsnyder: Ich war etwas ungenau, ich muss mehrere Hashes übergeben. Und das scheint dann wirklich nur über Referenzen zu gehen, oder?
docsnyder
 2007-04-19 17:35
#76049 #76049
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Quote
@docsnyder: Ich war etwas ungenau, ich muss mehrere Hashes übergeben. Und das scheint dann wirklich nur über Referenzen zu gehen, oder?

Ja! ;o)

Gruß, Doc
renee
 2007-04-19 17:45
#76050 #76050
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=Ronnie,19.04.2007, 15:27][quote=renee,19.04.2007, 15:02]Muss
Code: (dl )
warn Dumper(\%hash);
heißen...[/quote]
merkwürdig, bei mir geht es ohne Klammer problemlos mit perl v5.8.6[/quote]
Keine Ahnung, aber die Fehlermeldung hat nur diesen einen Schluss zugelassen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bloonix
 2007-04-20 13:16
#76051 #76051
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Ronnie,19.04.2007, 15:27][quote=renee,19.04.2007, 15:02]Muss
Code: (dl )
warn Dumper(\%hash);
heißen...[/quote]
merkwürdig, bei mir geht es ohne Klammer problemlos mit perl v5.8.6[/quote]
Man sollte die Klammern aber nicht hinter print oder warn vergessen.
Es gab hier schonmal einen Thread, wo Dumper für ein Filehandle gehalten
wurde und dementsprechend eine Meldung ausgegeben wurde. Deshalb
würde ich das erste ungequotete Argument hinter print oder warn
nach Möglichkeit eindeutig kennzeichnen.\n\n

<!--EDIT|opi|1177060667-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
pq
 2007-04-20 17:01
#76052 #76052
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
die fehlermeldung kann eigentlich *nur* zustandekommen, wenn perl an der
stelle die funktion 'Dumper' noch nicht kennt. wenn also vorher ein
use Data::Dumper erfolgt ist, kann die fehlermeldung eigentlich nicht
kommen.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ perl -wle'
my %x = (42,23);
warn Dumper \%x'
Backslash found where operator expected at -e line 3, near "Dumper \"
(Do you need to predeclare Dumper?)
Missing comma after first argument to warn function at -e line 3, at EOF
Execution of -e aborted due to compilation errors.

$ perl -wle'
use Data::Dumper;
my %x = (42,23);
warn Dumper \%x'
$VAR1 = {
         '42' => 23
       };

klammern drumherumsetzen finde ich unsinnig, denn es muss auch
so gehen, und es kann nicht sein, dass es bei dem einen ohne klammern
läuft und bei dem andern nicht.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
sid burn
 2007-04-20 17:27
#76053 #76053
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
[quote=Opaxtl,19.April.2007, 15:28]Also hat im Grunde nur das @_ hinter shift gefehlt? Na gut.[/quote]
Nein,
wenn du lediglich folgendes Schreibst:

Code: (dl )
my %hash = %{shift};


Dann versuchst er %shift nach %hash zu Kopieren! %shift gibt es aber bei dir nicht. Ohne "use strict;" wird dann an der Stelle einfach eine neue leere Package variable %shift angelegt die dann nach %hash kopiert wird.


Das was du aber möchtest ist, das "shift" innerhalb der Klammern nicht als Variablennamen angesehen wird, sondern Code ist der Ausgeführt werden soll.

Um das zu verdeutlichen reicht aber auch schon ein '+' Zeichen davor.

Code: (dl )
my %hash = %{+shift};


Variablen kann man halt wie gesagt immer durch Zusätzliche geschweifte Klammern angeben.

Code: (dl )
1
2
3
4
5
6
#!/usr/bin/perl
use strict;
use warnings;

my ${variable} = "Motor";
print "${variable}rad\n"


Genau so funktioniert ja auch das Derefernzieren...\n\n

<!--EDIT|sid burn|1177075695-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Opaxtl
 2007-04-20 23:16
#76054 #76054
User since
2007-03-21
12 Artikel
BenutzerIn
[default_avatar]
Gut, vielen Dank für die Erklärung. Ich habe es jetzt verstanden und es funktioniert prächtig.

Euren Informationen entnehme ich außerdem, dass ich in dem Modul, in dem meine Subs stehen, auch noch mal use strict; usw. angeben muss?

Ich hatte nämlich use Data::Dumper; auch im CGI-Script notiert und nicht im Modul. Daher hat Perl wohl auch die fehlende Klammern gemeldet.

Werde das auch noch beheben. Nochmals vielen Dank, ihr wart eine tolle und schnelle Hilfe!!

Patrick
renee
 2007-04-21 01:46
#76055 #76055
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
use strict hat nur lexikalische Gültigkeit, d.h. es gilt nur in dem Block, in dem es aktiviert wurde. Wenn Du es an den Anfang der Datei schreibst, ist es halt für die Datei gültig...

Code (perl): (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl

{
use strict;
use warnings;
}

print ">>$test<<";


Ausgabe:
Code: (dl )
1
2
3
C:\>perl strict.pl
>><<
C:\>
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
betterworld
 2007-04-21 05:12
#76056 #76056
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=Opaxtl,20.04.2007, 21:16]Ich hatte nämlich use Data::Dumper; auch im CGI-Script notiert und nicht im Modul. Daher hat Perl wohl auch die fehlende Klammern gemeldet.[/quote]
Du musst es aber auch in dem Modul schreiben. Es macht nichts, wenn dann zwei mal "use Data::Dumper;" steht, denn der Code wird dadurch nicht doppelt geladen. In Deinem Fall war die Funktionalitaet von Data::Dumper zwar verfuegbar, aber der "Kurzname" Dumper (kurz fuer die Funktion Data::Dumper::Dumper) war in dem Modul nicht verfuegbar.
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2007-04-19 16:24.