Schrift
[thread]5913[/thread]

Kontextproblem: Perl liest ja gerne zwischen den Zeilen



<< >> 4 Einträge, 1 Seite
GH@NDI
 2003-11-19 14:46
#72026 #72026
User since
2003-09-21
16 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo!

Ich habe da ein kleines Problem. Das an sich eigentlich kein Problem ist, da es sich über ein paar extra Zeilen Code einfach aus der Welt schaffen lässt.

Aber die mir aufgefallene Problematik, hat mich dann doch mal interessiert.

Man nehme folgenden Beispielcode:
Code (perl): (dl )
1
2
3
4
require "MeinModulpm";
my $modul = MeinModul->new();

my @daten = $modul->getData() || die $modul->getError();


das Modul "MeinModul.pm" sieht dann vereinfacht so aus:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
package MeinModul;

sub new {
        # Standart new-deklaration...
}

sub getData {
        my $self = shift;
        my @daten = ("daten", "und noch mehr daten", "daten, überall nur daten");
        return @daten;
}
1;


Bei diesem Versuchsaufbau, wird der Aufruf von "$modul->getData();" obwohl er eigentlich im Listen-Kontext ausgeführt werden sollte - zumindest hab ich mir das so gedacht - im Skalaren-Kontext ausgeführt. Somit bekomme ich die Anzahl der Einträge in der zurückgegebenen Liste, anstatt die Liste selber zurück.

Spontan sind mir dann 2 mögliche Lösungen in den Kopf gekommen:
1. Eine Listenreferenz zurück zu geben
2. Die Abfrage ob überhaupt etwas zurückgegeben wurde, in eine neue Zeile packen.

Beide Möglichkeiten wären soweit eigentlich ok, nur mag ich diese nachgestellte oder-Abfrage und frage mich jetzt, ob es keine Möglichkeit gibt, hier den Listen-Kontext zu erzwingen?

Sämtliche Versuche mit Klammern zu arbeiten sind bei mir fehlgeschlagen, also weis jemand einen Rat oder ist das schlicht und ergreifend so nicht lösbar?

Mit bestem Dank im vorraus,
Sven\n\n

<!--EDIT|GH@NDI|1069246188-->
pq
 2003-11-19 14:53
#72027 #72027
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Code: (dl )
1
2
3
4
#anstatt
#my @daten = $modul->getData() || die $modul->getError();

my @daten = $modul->getData() or die $modul->getError();

der || operator erzeugt skalaren kontext
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
Crian
 2003-11-20 11:41
#72028 #72028
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Jau, so ist es.

Außerdem heißt es Standard SCNR.
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
 2003-11-20 14:41
#72029 #72029
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
damit der aufruf der Methode getData funktioniert, musst du ein Objekt in den Namensraum (bzw besser: die Klasse) des Modules blessen. Ich vermute mal, dass deshalb der Aufruf schief geht
Code (perl): (dl )
1
2
3
4
5
6
sub new {
  my ($class) = @_;
  my $self = {}; # oder was auch immer du fuer eine Referenz willst
  bless ($self, $class); # hier erst wird $self zum Objekt
  return $self;
}
\n\n

<!--EDIT|Strat|1069332097-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 4 Einträge, 1 Seite



View all threads created 2003-11-19 14:46.