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

Filehandle globalisieren: aus sub heraus



<< >> 7 Einträge, 1 Seite
styx-cc
 2006-12-10 16:49
#72448 #72448
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Hallo, ich hab schon im Perl-Kochbuch und bei google.de geschaut, konnt aber so ncihts finden was mir weiterhiflt,
ich versuchen ein file Handle global zu machen, so klappt das wunderbar, aber in dem grossem Script nicht mehr:

Das klappt:
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
#!/usr/bin/perl
use strict;
use warnings;

my $LOG;

open_log();
bla();
close_log();

sub open_log {
my $logfile = 'logfile.txt';
open LOG, '>>', $logfile or die("Can't open logfile: $!\n");
$LOG = *LOG;
}
sub bla {
fill_log();
}

sub fill_log {
print $LOG "$_\n" for (1..100);
}

sub close_log {
close $LOG or die $!;
}


Das nicht:
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
54
55
56
57
58
59
#!/usr/bin/perl -w
use strict;

use IO::Socket::INET;
use Encode;

#login data
my $nick = 'stefan@berlin';
my $pw = '12345';
my $channel = '12345';
my $SPIN; #socket
my $LOG; #filehandle

main_connection("Versuche einzuloggen..");

#### SUBS ####
sub main_connection {
my $text = shift;
print "$text\n\n";
$SPIN = shake_hands();
login();
$LOG = open_log();
#main
#while socket, hold it
my $line;
while (defined($line = <$SPIN>)) {
start($line);
}
main_connection("Versuche neu einzuloggen..") unless($line);
}

sub shake_hands {
my $host = 'www.hostname.com';
my $port = '0000';
#open the socket to chatserver
my $SPIN = IO::Socket::INET->new(
#socketdaten
return $SPIN;
}

sub login {
#sending logindata to chatserver
#serverlogin
}

sub start ($) {
my $line = shift;
#get first char, cause it means a affair wich happening, like op, deop, join and so on
my $cmd = substr($line, 0,1);
print $LOG "test\n";
}

sub open_log {
my $logfile = 'logfile2.txt';
open LOG, '>>', $logfile or die("Can't open logfile: $!\n");
return *LOG;
}

sub close_log {close $LOG or die $!}


Ich versteh das nicht :(
Sieht einer von euch meinen Fehler?

MfG

Edit: Beim 2. laeuft das Script zwar ohne Fehler und Warnundgen, schreibt aber nichts in das File..\n\n

<!--EDIT|styx-cc|1165762533-->
Pörl.
renee
 2006-12-10 17:37
#72449 #72449
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Arbeite mal mit CPAN:FileHandle:

(ungetestet)
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
54
55
56
57
58
59
#!/usr/bin/perl -w
use strict;

use IO::Socket::INET;
use Encode;
use FileHandle;

#login data
my $nick = 'stefan@berlin';
my $pw = '12345';
my $channel = '12345';
my $SPIN; #socket
my $LOG; #filehandle

main_connection("Versuche einzuloggen..");

#### SUBS ####
sub main_connection {
my $text = shift;
print "$text\n\n";
$SPIN = shake_hands();
login();
$open_log();
#main
#while socket, hold it
my $line;
while (defined($line = <$SPIN>)) {
start($line);
}
main_connection("Versuche neu einzuloggen..") unless($line);
}

sub shake_hands {
my $host = 'www.hostname.com';
my $port = '0000';
#open the socket to chatserver
my $SPIN = IO::Socket::INET->new(
#socketdaten
return $SPIN;
}

sub login {
#sending logindata to chatserver
#serverlogin
}

sub start ($) {
my $line = shift;
#get first char, cause it means a affair wich happening, like op, deop, join and so on
my $cmd = substr($line, 0,1);
print $LOG "test\n";
}

sub open_log {
my $logfile = 'logfile2.txt';
$LOG = FileHandle->new(">>$logfile");
}

sub close_log {$LOG->close or die $!}
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/
styx-cc
 2006-12-10 17:46
#72450 #72450
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Habs bestimmt schon mal erwaehnt, aber du bist n Schatz ;-)
Hat wunderbar geklappt, wobei ich vorhin auch schon mal versucht habe das mit FileHandle zu loesen..

Danke!
MfG

Edit: Kannst du mir auch erklaeren wo der Unterschied liegt, oder sagen wonach ich suchen muss um das zu verstehen?\n\n

<!--EDIT|styx-cc|1165765720-->
Pörl.
styx-cc
 2006-12-10 18:10
#72451 #72451
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Hmm... hab mich scheinbar zu frueh gefreut, jetzt klappts nicht mehr...

Der Code:
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
54
55
56
57
58
59
60
#!/usr/bin/perl -w
use strict;

use IO::Socket::INET;
use FileHandle;
use Encode;

#login data
my $nick = 'stefan@berlin';
my $pw = '12345';
my $channel = '12345';
my $SPIN; #socket
my $LOG; #filehandle

main_connection("Versuche einzuloggen..");

#### SUBS ####
sub main_connection {
my $text = shift;
print "$text\n\n";
$SPIN = shake_hands();
login();
&open_log();
#main
#while socket, hold it
my $line;
while (defined($line = <$SPIN>)) {
start($line);
}
main_connection("Versuche neu einzuloggen..") unless($line);
}

sub shake_hands {
my $host = 'www.hostname.com';
my $port = '0000';
#open the socket to chatserver
my $SPIN = IO::Socket::INET->new(

return $SPIN;
}

sub login {
#sending logindata to chatserver
}

sub start ($) {
my $line = shift;
#get first char, cause it means an affair wich happening, like op, deop, join and so on
my $cmd = substr($line, 0,1);

print $LOG $line or die $!; #klappt nicht
print $line; #klappt
}

sub open_log {
my $logfile = 'logfile2.txt';
$LOG = FileHandle->new(">>$logfile");
}

sub close_log {$LOG->close or die $!}

Vielleicht sieht ja wer noch was, ich versteht das immer noch nicht, jetzt schon gar nicht, wo er 3 Minuten gemacht hat was er soll und dann auf ein mal nicht mehr...

MfG
Pörl.
renee
 2006-12-10 18:21
#72452 #72452
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
ruf mal das open_log vor der main_connection auf...

Aber so gut kenne ich mich mit Sockets nicht aus...
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/
styx-cc
 2006-12-10 18:31
#72453 #72453
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Ne, klappt auch nicht..
Hab auch mal $|++; versucht, auch nicht
Is ja doof, jetzt muss ich das File bei jedem print $LOG; oeffnen, allerdings werden da in der minute bestimmt 50 Zeilen gechattet...
Jemand vielleicht ne Idee fuer nen Workaround?

MfG
Pörl.
styx-cc
 2006-12-10 21:52
#72454 #72454
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Hab mein Buch "Netzwerkprogrammierung in Perl" ausgequetscht, so klappt es jetzt einwandfrei in Echtzeit :)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sub start ($) {
my $line = shift;
#get first char, cause it means an affair wich happening, like op, deop, join and so on
my $cmd = substr($line, 0,1);

flock($LOG, 'LOCK_EX');
print $LOG $line;
flock($LOG, 'LOCK_UN');

print $line;
}

sub open_log {
my $logfile = 'logfile2.txt';
$LOG = IO::File->
new($logfile,'0_WRONLY|0_APPEND|0_CREAT,0664') || return;
$LOG->autoflush(1); #das is wichtig!
return 1;
}


MfG und danke fuer die Hilfe :-)
Pörl.
<< >> 7 Einträge, 1 Seite



View all threads created 2006-12-10 16:49.