Schrift
[thread]7605[/thread]

Namespace/ Package Nervereien



<< |< 1 2 >| >> 17 Einträge, 2 Seiten
Gast Gast
 2006-01-10 17:12
#61620 #61620
So, nun nervt es mich endgültig. Ich bin jemand, der gern Sachen trennt, und auch deshalb gerne verschiedene Namensräume verwendet. In PERL geht das imho nur mit "package".

Was mich nervt  ist aber, dass die Variablenübergabe zwischen zwei Namensräumen so umständlich zu sein scheint. Grund ist, dass Argument im Fall des Aufrufs aus dem gleichen Namensraum der übergebene Parameter ist. Ruft man die Funktion ausserhalb des Namensraumes auf, so ist der erste Parameter aber der Paketname :(

KANN MAN DAS NET ABSTELLEN???  Der Paketname interessiert mich nun wirklich nicht. Ich weiss, welche Funktion ich aus welchem Paket aufgerufen habe ;)

Man nehme ein kurzes Stück Quellcode:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package hiermeinpaket;

# funktioniert nur innerhalb des Pakets korrekt.
sub printSth () {
 my $value=shift;
 print $value;
}

# Hm... selbes Problem...funktioniet nur innerhalb des Pakets korrekt
sub printSth2 () {
 print @_[0];
 #print @[1];
}

# Funktioniert immer, aber so umständlich. Negativvergleich aus Perfomanegründen (hier nicht wichtig).
sub printSthDefinitely () {
 my $value= shift;
 $value = shift unless ($value ne 'hiermeinpaket');
 print $value;
}

sub intern () {
 my $text = 'hello welt';
 &printSth1 ($text);
 &printSth2 ($text);
 &printSthDefinitely ($text);
}
&intern (); # läuft korrekt

##################################
package woanders;

sub extern () {
 my $text = 'hello welt';
 &hiermeinpaket::printSth1 ($text);  # pfui
 &hiermeinpaket::printSth2 ($text);  # pfui
 &hiermeinpaket::printSthDefinitely ($text);  #hui
}
&extern (); # das Problem wird sichtbar.

sub vonHintenDurchDieBrust () {
 my $text = 'hello welt';
 package hiermeinpaket; # HÖ-HÖ
 &printSth1 ($text);
 &printSth2 ($text);
 &printSthDefinitely ($text);
}
&vonHintenDurchDieBrust(); # TSE... alles fein?


Ich kann mir nicht vorstellen, dass man die Eingaben mit "if"s im Fall unterschiedlicher Namensräume immer abfragen muss. Im Netz suche ich seit Uhrzeiten, aber meine Suchbegriffe bringen mich nicht weiter.
Relais
 2006-01-10 17:52
#61621 #61621
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
Undefined subroutine &hiermeinpaket::printSth1 called at sosum.perl line 24.

Da empfehle ich die Routine doch einfach so zu benennen. Und Voila! Alles in Butter.

Auch Dein &intern kann gar nicht "korrekt laufen". Wenn Du den Fehler behoben hast, dann tut's auch &extern - kein Problem mehr sichtbar (außer der regelmäßigen Warnung Scalar value @_[0] better written as $_[0] at sosum.perl line 11. natürlich.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
sosum
 2006-01-10 18:46
#61622 #61622
User since
2006-01-10
11 Artikel
BenutzerIn
[default_avatar]
Ja... unfassbar... Ich quäle mich seit Monaten mit dem Zeugs herum, und mir fällt nicht einmal auf, dass es an der Schreibweise liegt....

hier der berichtigte lauffähige Code (mit sichtbarem Fehler bei "alternativer" (falscher) Schreibweise.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package hiermeinpaket;
# funktioniert nur innerhalb des Pakets korrekt.
sub printSth1 () {
my $value=shift;
print $value;
}

# Hm... selbes Problem...funktioniet nur innerhalb des Pakets korrekt
sub printSth2 () {
print $_[0];
#print $_[1];
}

# Funktioniert immer, aber so umständlich. Negativvergleich aus Perfomanegründen (hier nicht wichtig).
sub printSthDefinitely () {
my $value= shift;  
$value = shift unless ($value ne 'hiermeinpaket');
print $value;
}

sub intern () {  
print "interner Aufruf\n";
my $text = "hello welt\n";
&printSth1 ($text);
&printSth2 ($text);
&printSthDefinitely ($text);
}
&intern (); # läuft korrekt

##################################
package woanders;

sub extern () {
my $text = "hello welt\n";
print "\nexterner Aufruf\n";
&hiermeinpaket::printSth1 ($text);  # hui
&hiermeinpaket::printSth2 ($text);  # hui
&hiermeinpaket::printSthDefinitely ($text);  #hui

hiermeinpaket->printSth2 ($text);  # pfui
hiermeinpaket->printSthDefinitely ($text);  #hui
}
&extern (); # das Problem wird sichtbar.

sub vonHintenDurchDieBrust () {
print "\nBrustmethode\n";
my $text = "hello welt\n";
package hiermeinpaket; # HÖ-HÖ
&printSth1 ($text);
&printSth2 ($text);
&printSthDefinitely ($text);
}
&vonHintenDurchDieBrust(); # TSE... alles fein?


Schuld an meiner Misere war offensichtlich die Verwendung der objektorienten Schreibweise "->", vermute ich. Ich fand das schicker und dachte, sie sei äquivalent zu &abc::. Dem ist offensichtlich nicht so.

Danke für die Erleuchtung :)
betterworld
 2006-01-10 23:26
#61623 #61623
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Nein, die Schreibweise mit "->" bedeutet etwas anderes als die mit "::". Aber auch wenn Du es umstaendlich findest, bei der objektorientierten Variante immer die Klassennamen wegzushiften, hat das durchaus seine Vorzuege. Vererbung ist sonst schwer moeglich. Da trifft naemlich Deine Aussage "Ich weiss, welche Funktion ich aus welchem Paket aufgerufen habe" nicht mehr zu.

siehe perldoc perlmod und perldoc perlobj
murphy
 2006-01-11 00:53
#61624 #61624
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=betterworld,10.01.2006, 21:26][...] Vererbung ist sonst schwer moeglich. Da trifft naemlich Deine Aussage "Ich weiss, welche Funktion ich aus welchem Paket aufgerufen habe" nicht mehr zu. [...][/quote]
Aber eigentlich ist die Notwendigkeit, so einen Parameter explizit mit zu Übergeben, ein Anzeichen dafür, wie schlecht Objektorientierung in Perl implementiert ist... Naja, ist wahrscheinlich Geschmackssache.
When C++ is your hammer, every problem looks like your thumb.
Dubu
 2006-01-11 01:20
#61625 #61625
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Oder wie einfach. ;)
murphy
 2006-01-11 01:31
#61626 #61626
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
[quote=Dubu,10.01.2006, 23:20]Oder wie einfach. ;)[/quote]
Oh je, jetzt habe ich eine Glaubensdiskussion vom Zaun gebrochen...

Einfach finde ich die Objektorientierung in Perl 5 nun nicht besonders. Ich würde das ganze System eher als kreativ oder interessant bezeichnen. Es ist ungewöhnlich, man kann damit eine Menge machen und es passt irgendwie gut zu Perl -- aber es ist auch an einigen Stellen ein bischen unausgegoren.

Eben eine Geschmacksfrage :)
When C++ is your hammer, every problem looks like your thumb.
renee
 2006-01-11 04:25
#61627 #61627
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich finde OO in Perl sowohl einfach als auch interessant. Aber @murphy: Du darfst Dich auf Perl6 freuen, da wird einiges anders, weil - im Gegensatz zu frueher - OO gleich mit eingeplant ist...
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/
Crian
 2006-01-12 17:13
#61628 #61628
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
einfach... nun ja, vielleicht, aber dafür kann man mit Perl flexibler OO Programmieren als mit anderen mir bekannten OO-Sprachen (z.B. C++).
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2006-01-12 17:32
#61629 #61629
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=murphy,10.01.2006, 23:53]Aber eigentlich ist die Notwendigkeit, so einen Parameter explizit mit zu Übergeben, ein Anzeichen dafür, wie schlecht Objektorientierung in Perl implementiert ist... Naja, ist wahrscheinlich Geschmackssache.[/quote]
er wird nicht manuell explizit uebergeben, sondern automatisch, d.h. man bekommt ihn zur verfuegung gestellt. Mir ist lieber, ich kann mich entscheiden, wie ein parameter (d.h. objekt) bei mir heissen soll, als nur auf this oder self angewiesen zu sein. Denn manchmal ist es eine $connection, manchmal ein $databaseHandle und manchmal ein $guiObject. und da finde ich this oder self einfach nur platt.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2006-01-10 17:12.