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

Modul übergreifend auf variablen zugreifen?

Leser: 1


<< |< 1 2 >| >> 15 Einträge, 2 Seiten
BratHering
 2006-05-13 01:08
#66057 #66057
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Hallo,

ein kleines Verständnis Problem macht mir zu schaffen:
In meinem Perl-Skript im main Package habe ich ein globales Objekt und eine globale 2D Liste etwa so...
Code: (dl )
1
2
3
4
use strict;
use Bla; #eine Klasse das ist
our $objBla = Bla->new();
our @bla = ([], [], [], ...);

...aus einer Funktion eines anderen Package heraus greife ich auf das Objekt so zu...
Code: (dl )
1
2
3
4
5
6
7
8
package SomePackage;

sub someFunction
{
$main::objBla->Methode();
}

1;

...und das Funktioniert so wie ich es mir denke.
Leider aber kann ich das gleiche nicht mit der 2D liste machen...
Code: (dl )
1
2
3
print "@main::bla\n";
# oder
print $main::bla[1][0];

...und ich weiss nicht warum? :(
Mir wird nur Use of uninitialized value gesagt.

Ich befürchte mir fehlt etwas an Wissen, was das package übergreifende Variablen nutzen angeht? - Kann mich vielleicht jemand aufklären?


MfG
Brathering\n\n

<!--EDIT|BratHering|1147638087-->
murphy
 2006-05-13 02:18
#66058 #66058
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Ich habe zwar meine Glaskugel nicht zur Hand, aber ich denke das Problem liegt vermutlich in Dingen, die du nicht gepostet hast.

Jedenfalls sieht es bei mir so aus, dass our $objBla->new(); einen Can't call method "new" on an undefined value [...] Fehler erzeugt, was ja auch irgendwie logisch ist. Ich wüsste gerne, wie du diese Codezeile zum Laufen bekommen hast.

Andererseits funktioniert ein our @bla = ([11, 12], [21, 22]); package foo; print $bla[1][0]; oder ähnliches einwandfrei. Versuchst du vielleicht aus Arrayelementen zu lesen, die es nicht gibt?
When C++ is your hammer, every problem looks like your thumb.
murphy
 2006-05-13 02:48
#66059 #66059
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
(edit: Komisch, warum mein Browser den Beitrag verdoppelt hat, ist mir ein Rätsel)\n\n

<!--EDIT|murphy|1147474349-->
When C++ is your hammer, every problem looks like your thumb.
BratHering
 2006-05-15 00:27
#66060 #66060
User since
2005-04-28
155 Artikel
BenutzerIn
[default_avatar]
Oh nein, ich habe im code meines oberen Postings etwas wesentliches vergessen, das habeich jetzt nachgetragen.

Aber im Prinzip lautet meine Frage: "Wie greift man auf korrekte Art und Weise in einem Package x auf Variablen des Packages y zu?"
Ich kriegs irgendwie nicht immer hin, vielleicht vergesse ich etwas... :(
Strat
 2006-05-15 22:28
#66061 #66061
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ueber methoden. direkt auf die referenz, die das objekt ist, zuzugreifen ist nicht so toll; ein wichtiger aspekt von OOP ist ja, die daten und die methoden, ueber die auf diese daten zugegriffen wird, in einer klasse zu kapseln. und man sollte sich nicht von aussen darauf verlassen, dass ein objekt z.B. eine hash- oder arrayreferenz ist.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Matze
 2006-05-15 23:50
#66062 #66062
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Was mich wundert ist, dass folgendes bei mir auch nicht '1 2 3 4 5
6 7 8 9' ausgibt, sondern anscheinend gar nichts:
Code: (dl )
1
2
3
@bla = qw(1 2 3 4 5 6 7 8 9);
package foo;
print "@main::bla";
:(
Kann mir das nochmal jemand erklären ?

MfG. Matze
Mit freundlichen Grüßen: Matze
Dubu
 2006-05-16 01:10
#66063 #66063
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
@Matze: Unter Windows/DOS-Shell? Dann mach mal einen Zeilenumbruch am Ende.
ptk
 2006-05-16 01:15
#66064 #66064
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Und was noch schockierender ist: das gleiche Problem gibt es mit der zsh. Das lässt sich aber mit einer geeigneten Konfigurationsvariablen abstellen.
ptk
 2006-05-16 01:17
#66065 #66065
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Übrigens ein Grund mehr, für Debugausgaben warn statt print zu verwenden. Ein Buchstabe kürzer, kein Buffering und das Newline bekommt man umsonst.
renee
 2006-05-16 09:52
#66066 #66066
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@Matze: Bei dem print-Aufruf im packagefoo ist das Array noch nicht bekannt. Die ganzen uses werden vor dem eigentlichen Skript abgearbeitet., so dass beim Parsen folgendes passiert:

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

use foo;

@array = qw(1 2 3 4);


foo.pm
Code: (dl )
1
2
3
4
5
package foo;

print "@main::array";

1;


Parsen:

1.) Shebang
2.) Suche nach foo.pm
3.) Führe den Code von foo.pm aus
4.) fülle das Array mit den Zahlen


Du kannst das folgendermaßen umgehen:

Methode 1:

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

use strict;
use warnings;

our @array = qw(1 2 3 4);

require foo;


foo.pm
Code: (dl )
1
2
3
4
5
package foo;

print "@main::array";

1;



Methode 2:

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

use strict;
use warnings;
use foo;

our @array = qw(1 2 3 4);
foor::print_array();


foo.pm:
Code: (dl )
1
2
3
4
5
6
7
package foo;

sub print_array{
print "@main::array";
}

1;
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/
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2006-05-13 01:08.