Schrift
[thread]12986[/thread]

Werte in Subroutine und zurück mit Modulen (Seite 2)



<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten
Linuxer
 2009-01-14 13:36
#117937 #117937
User since
2006-01-27
3876 Artikel
HausmeisterIn

user image
Was heisst denn nun "leider nicht geladen"? Die Seiten sind für mich problemlos erreichbar. Irgendwelche Fehlermeldungen, etc.?

Schau vielleicht mal hier im Wiki nach: http://wiki.perl-community.de/bin/view/Perldoc/Web...

Dort solltest Du die von mir aufgeführten Tutorials (perlboot und perltoot) wiederfinden.

http://wiki.perl-community.de/bin/view/Perldoc/Web...
Dort gibt es die perlfunc ...


Wenn Du Perl installiert hast, solltest Du die Perl-Dokumentation auch in Deinem System wiederfinden.

Öffne mal ein Terminal (DOS-Box) und versuche mal das Kommando:

Code: (dl )
perldoc perlboot


(Wenn es funktioniert, kannst Du die Ausgabe mit 'Q' beenden)

Analog dann perlboot durch perltoot, bzw. perlfunc ersetzen.


Die Syntax passt, sonst hätte Perl bereits gemeckert.

- Ich würde das Modul nochmal umbenennen auf Modul::Errorcode.
- Das Modul wird so erstmal nur geladen. Es passiert noch nicht mehr.
Dadurch ist es egal, ob die Textdatei vorhanden ist oder nicht, weil die entsprechende Methode errormap nicht aufgerufen wird.

- Solange Du nur den @INC modifizieren willst, würde ich den BEGIN Block rauswerfen und durch

Code: (dl )
1
2
3
use lib qw(
Z:/work/errorhandling/test02
);


ersetzen.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Brenner
 2009-01-14 13:49
#117944 #117944
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Anscheinend gabs hier ein DNS Problem, das Forum ging bei mir danach auch nicht mehr. Jetzt wird aber wieder alles geladen....


Das mit dem BEGIN... soll ich so machen



perldoc perlboot klappt. In deutsch gibts sowas ähnliches sicher nicht!? Hab ja schon mit den Perl Ausdrücken zu kämpfen ;-)


Dann werde ich nach dem Mittag mal versuchen aus dem tut was sinnvolles rauszuziehen. Danke euch erst Mal an dieser Stelle.
renee
 2009-01-14 13:51
#117945 #117945
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Warum sollte es eine Fehlermeldung ausgeben. Du lädst ja nur das Modul, führst aber die Subroutine "errormap" nie aus!

Mach im Skript nach dem Laden Deines Moduls ein MODUL::ERRORCODE::errormap();
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/
Brenner
 2009-01-14 15:11
#117961 #117961
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
Das klappt wunderbar. Wenn die Liste da ist, werden alle Werte in der Konsole ausgegeben. Ist die Liste weg kommt die Fehelrmeldung das sie nicht da ist.


Und wie kann ich jetzt vom Hauptprogramm nur eine spezielle Zeile/Fehler aufrufen ohne die ganze Liste präsentiert zu bekommen?
renee
 2009-01-14 15:24
#117963 #117963
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Du musst der Subroutine einen Parameter übergeben und dem Parameter entsprechend das Element ausgeben.

Code: (dl )
1
2
3
4
5
6
test(3);

sub test {
my ($parameter) = @_;
print "Mir wurde der Index 3 uebergeben\n";
}


Der Rest ist Deine Arbeit ;-)
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/
Linuxer
 2009-01-14 15:24
#117964 #117964
User since
2006-01-27
3876 Artikel
HausmeisterIn

user image
Du könntest den Array in der Moduldatei global deklarieren und mit innerhalb von errormap() füllen.

dann definierst Du eine weitere Routine, die als Argument die Fehlernummer entgegen nimmt und dann den entsprechenden Eintrag des Array zurück liefert.

Aufrufen müsstest Du es vermutlich ähnlich wie es renee bereits für errormap() aufgezeigt hat.

Wenn Du das dann hast, können wir uns mal anschauen, dass Du es auf "objektorientiert" umgewandelt kriegst.
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Brenner
 2009-01-14 16:06
#117969 #117969
User since
2009-01-13
87 Artikel
BenutzerIn
[default_avatar]
renee+2009-01-14 14:24:06--
Du musst der Subroutine einen Parameter übergeben und dem Parameter entsprechend das Element ausgeben.

Code: (dl )
1
2
3
4
5
6
test(3);

sub test {
my ($parameter) = @_;
print "Mir wurde der Index 3 uebergeben\n";
}


Der Rest ist Deine Arbeit ;-)




Ich versteht das einfach nicht :-( Hab hier zusätzlich noch das o´reily "Einführung in Perl" liegen und hab eben versucht so einen Wert des arrays auszugeben, wieso geht das denn nicht?

Die Zahl 3 habe ich per Hauptprogramm
MODUL::ERRORCODE::errormap(3);
übergeben. Sie wird auch so angenommen und ich kann die Variable $parameter ausgeben und es steht die 3 drin.

Ich weiß ja das ich nur durch selber machen lerne, aber warum funktioniert meine Zeile:
Code (perl): (dl )
1
2
$line = $errormaplist[$parameter];
print $line;

nicht? Müsste $line nicht die dritte Zeile des Arrays zugewiesen bekommen und mit print ausgeben?



Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package MODUL::ERRORCODE;

use strict;
use warnings;


sub errormap
{
        open( my $errormaplist, '<', 'errormap.txt' ) or die "Fehler: $!";
        #while( my $line = <$errormaplist> )
        #{
        #       print $line;
        #}
        my ($parameter) = @_;
        print "Index: ".$parameter."\n";
        $line = $errormaplist[$parameter];
        print $line;
        close $errormaplist;
}
1;
renee
 2009-01-14 16:27
#117972 #117972
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
$errormaplist ist kein Array sondern ein Filehandle. Du kannst jetzt entweder alles in ein Array lesen und dann das Element ausgeben oder aber - was besser ist - Du durchläufst die while-Schleife und gibst die Zeile aus, wenn es die gewünschte Zeile ist:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub errorcode {
my ($linenr) = @_;

open my $errormap, '<', 'errormap.txt' or die $!;
while( my $line = <$errormap> ){
# in $. steht die Zeilennummer (siehe perldoc perlvar)
if( $. == $linenr ){
print $line;
last; # springe aus der Schleife raus
}
}
close $errormap;
}


vs.

Code: (dl )
1
2
3
4
5
6
7
8
9
sub errorcode {
my ($linenr) = @_;

open my $errormap, '<', 'errormap.txt' or die $!;
my @lines = <$errormap>;
close $errormap;

print $lines[ $linenr-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/
FoolAck
 2009-01-14 16:28
#117973 #117973
User since
2008-05-02
69 Artikel
BenutzerIn
[default_avatar]
Erstmal: $foo[3] gibt nicht das dritte, sondern das vierte Element des Arrays @foo zurück..

Dann: (das macht mich schon die ganze Zeit kirre) wieso läuft dein Modul? Ich verstehs nicht. Sollte strict dem nicht einen Strich durch die Rechnung machen?
Wo deklarierst du das array @errormaplist?
murphy
 2009-01-14 16:39
#117975 #117975
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@Brenner: Mir scheint, in Deiner Subroutine greifst Du auf @errormaplist zu, ohne jemals diese Variable zu deklarieren, geschweige denn etwas darin zu speichern.

Es ist ja loeblich, dass Du use strict; use warnings; verwendest. Aber wenn Du auch noch die Warnungen und Kompilerfehler lesen und beheben wuerdest, waer's noch besser ;-)

Spass beiseite, ich wuerde das wohl so machen:
Code (perl): (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
package Modul::Errorcode;

use strict;
use warnings;

use Tie::File;
use Fcntl qw/O_RDONLY/;

use Exporter qw/import/;
our @EXPORT = qw/errormap/;


sub errormap ($) {
        my ($parameter) = @_;

        tie
                my @errormaplist, 'Tie::File' => 'errormap.txt',
                mode => O_RDONLY or
                die "Konnte Fehlerbeschreibungen nicht laden: $!";

        return $errormaplist[$parameter] || 'Unbekannter Fehler';
}

1;
When C++ is your hammer, every problem looks like your thumb.
<< |< 1 2 3 4 >| >> 37 Einträge, 4 Seiten



View all threads created 2009-01-13 17:30.