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

Platformunabhängigen code UNIX/Win32

Leser: 1


<< >> 8 Einträge, 1 Seite
Schnullux
 2008-07-24 18:04
#112617 #112617
User since
2008-07-24
3 Artikel
BenutzerIn
[default_avatar]
Moin Wissende dieser Welt!
Ich "darf" nun auch code für Win32 basteln der aber in dem gleichen file ( modul ) wie der "richtige :-) " stehen soll. Kurz; das Modul soll für den Benutzer platformunabhängig nutzbar sein. Mein Wunsch wäre also etwas wie eine generische log Funktion:
Code (perl): (dl )
1
2
3
use magrathea::generic;
# use a generic log function like
xlog(LOG_DEBUG,"This is a debug log");


Nun stoße ich natürlich auf ein paar Hindernisse die Ihr sicher schon laaaange gelöst habt. Und weil Ihr ja nett seid, könnt Ihr einem armen unwissenden bitte aufschlauen:

1) Wird die interpreterZeile
Code: (dl )
#! /usr/bin/perl -w
bei Win tatsächlich ignoriert wenn ich die *.pl Endung registriert habe und mit dem entsprechenden perl binary verküpft habe?


2) Wie kann ich System unterschiedliche module einbinden UND im code verwenden ohne das diese auf dem jeweils "falschen" System zu Problemen führen ( sowas wie #ifdef )? Hierzu mal ein Beispiel das SO NICHT funktioniert aber in etwa zeigt was ich möchte:

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
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
54
#! /usr/bin/perl

# load libs
use strict;
use warnings;
use POSIX 'uname';
use Unix::Syslog;
use Unix::Syslog qw(:macros);
require Win32::EventLog;

# global vars ( arrrghhh, like an undeath mattress ;-)
my $handle = undef;
my ($sys) = &uname;

# some lines later....
if($sys =~ /window/i)   {

        #init win32 event log
        $handle = Win32::EventLog->new("Zaphod");

} else {

        # init UNIX syslog
        &openlog("Trillian","pid, ndelay, nowait",LOG_LOCAL4);
}

# some functions/lines later part of generic xlog() function... :-)
if($sys =~ /window/i)   {

        my %win;

        $win{'Computer'} = "Eddy";
        $win{'Source'} = "Hard of Gold";
        $win{'Category'} = undef;
        $win{'EventID'} = 42;
        $win{'Data'} = undef;
        $win{'Strings'} = "Dont interrupt me, I computing real earth Tee!"

        $handle->Report(\%win);

} else {

        &syslog(LOG_DEBUG,"Where is Marvin??");
}

# And now close all...
if($sys =~ /window/i)   {

        $handle->Close;

} else {

        &closelog();
}


Wäre toll wenn Ihr mir anhand des Beispieles Tipps geben könntet :-)

Gruß
Karsten
--
//// Never forget your towel \\\\
***********************************************************
renee
 2008-07-24 18:12
#112620 #112620
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Zu 1) Ja, das ist tatsächlich der Fall

Zu 2) Was funktioniert daran nicht? Angaben zum Betriebssystem sind auch in $^O gespeichert...

Ich würde vielleicht auch "richtige" Module daraus machen, dass die Funktionalität vor dem User versteckt.
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/
Schnullux
 2008-07-24 18:37
#112628 #112628
User since
2008-07-24
3 Artikel
BenutzerIn
[default_avatar]
[quote="renee+2008-07-24 16:12:35--"]
Zu 1) Ja, das ist tatsächlich der Fall
Gut, etwas das bin Win dann funst. Danke :-)

Zu 2) Was funktioniert daran nicht? Angaben zum Betriebssystem sind auch in $^O gespeichert...

Das Problem liegt zunächst an der use oder require definition für Module die nicht auf dem System liegen. Nach meinem dafürhalten wird mit require das referenzieren zu einem Modul erst zur Laufzeit ausgeführt.
Code (perl): (dl )
1
2
3
require Unix::Syslog;
require Unix::Syslog qw(:macros);
require Win32::EventLog;

Dieser code führt aber zu einem Syntax-error bei require Unix::Syslog qw(:macros);

Ein weiteres Problem ( wenn dann das require funktioniert ) ist, dass sobald im code auf eine funktion des modules definiert ist ( nicht mal benutzt ), dann gibt es dort ebenfalls einen syntax error.

Der Code oben ist auch nur ein Beispiel um es einfach zu machen. Natürlich wird das alles nachher ein "richtiges" modul :-)

Gruß
Karsten

--
//// Never forget your towel \\\\
***********************************************************
renee
 2008-07-24 18:57
#112635 #112635
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package MyLogger;

use strict;
use warnings;

sub new {
    
    if( $^O =~ /win32/i ){
        require MyLogger::Win32;
        return MyLogger::Win32->new;
    }
    else{
        require MyLogger::Default;
        return MyLogger::Default->new;
    }

}

1;


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
25
26
27
28
29
package MyLogger::Win32;

use strict;
use warnings;

use all_Win32_stuff;

sub new{
    my ($class) = @_;

    my $self = bless {}, $class;
    $self->{handle} = Win32::EventLog->new("Zaphod");
}

sub log {
      my ($self) = @_;
      my %win;

      $win{'Computer'} = "Eddy";
      $win{'Source'} = "Hard of Gold";
      $win{'Category'} = undef;
      $win{'EventID'} = 42;
      $win{'Data'} = undef;
      $win{'Strings'} = "Dont interrupt me, I computing real earth Tee!"

      $self->{handle}->Report(\%win);
}

...


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

use strict;
use warnings;

use all_Unix_stuff;

sub new{
    my ($class) = @_;

    return bless {}, $class;
}

sub log {
         &syslog(LOG_DEBUG,"Where is Marvin??");
}

...
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/
renee
 2008-07-24 18:59
#112636 #112636
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Schnullux+2008-07-24 16:37:18--
Code (perl): (dl )
1
2
3
require Unix::Syslog;
require Unix::Syslog qw(:macros);
require Win32::EventLog;

Dieser code führt aber zu einem Syntax-error bei require Unix::Syslog qw(:macros);


Die Imports muss man bei so etwas extra machen:

Code (perl): (dl )
1
2
require Unix::Syslog;
Unix::Syslog->import( ':macros' );
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/
Schnullux
 2008-07-25 10:35
#112681 #112681
User since
2008-07-24
3 Artikel
BenutzerIn
[default_avatar]
Ahhhhh!
Renee, DAS hilft! Sorry für die verzögerte Antwort.
Wir machen also ein paar "sub-module" und "verlinken" diese. Ja, logisch ...( wünsche mir öfters einen automatischen "Brett-vorm-Kopf-Entferner" ) :-)

Allerbesten Dank für die großartige und schnelle Hilfe!

Gruß
Karsten
--
//// Never forget your towel \\\\
***********************************************************
defun
 2008-07-26 00:39
#112768 #112768
User since
2008-07-18
28 Artikel
BenutzerIn
[default_avatar]
Schnullux+2008-07-24 16:04:35--
1) Wird die interpreterZeile
Code: (dl )
#! /usr/bin/perl -w
bei Win tatsächlich ignoriert wenn ich die *.pl Endung registriert habe und mit dem entsprechenden perl binary verküpft habe?

Ich dachte immer, Perl beachtet unter Windows dann die Switches, geht in diesem Fall also in den Warning-Modus. Kannst ja einfach ausprobieren, ob das stimmt.
Linuxer
 2008-07-26 00:52
#112770 #112770
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
aus perlrun:
Quote
The #! line is always examined for switches as the line is being parsed. Thus, if you're on a machine that allows only one argument with the #! line, or worse, doesn't even recognize the #! line, you still can get consistent switch behavior
regardless of how Perl was invoked, even if -x was used to find the beginning of the program.
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!
<< >> 8 Einträge, 1 Seite



View all threads created 2008-07-24 18:04.