1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#!/usr/bin/perl use strict; # Datei on the fly erstellen (hier allerdings ohne mysqldump) open(my $file, ">backup.txt"); for (my $i=1;$i<10000000;$i++) { print $file "Hello World\r\n"; } close($file); # Datei zum Download anbieten print qq(Content-Type: text/plain\n); print qq(Content-Disposition: attachment; filename="backup.txt"\n\n); open(my $file, "<backup.txt"); binmode($file); while (read($file,my $bytes,1024)) { print $bytes; } close($file); unlink('backup.txt');
Quoteedit: ach ja, und um das zu testen, kannst du den download auch mit LWP simulieren, es gibt da eine optionen, dem request einen callback mitzugeben. so kannst du mitten im download abbrechen.
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 use strict; $SIG{PIPE}=\&remove; # test PIPE signal open(my $file, ">backup.txt"); for (my $i=1;$i<10000000;$i++) { print $file "Hello World\r\n"; } close($file); my $filedestruct=new SQLDump('backup.txt'); # test destruction object print qq(Content-Type: text/plain\n); print qq(Content-Disposition: attachment; filename="backup.txt"\n\n); open(my $file, "<backup.txt"); binmode($file); eval { # test eval while (read($file,my $bytes,1024)) { print $bytes or die 'STDOUT closed'; } 1; } or do { &remove("eval $@"); }; close($file); &remove('normal'); # simple remove file before normal end of script # -------------------------- sub remove { &log; my $filename='backup.txt'; if (-e $filename) {unlink($filename);} } sub log { open(my $file, ">>log.txt"); print $file time.": @_\n"; close($file); } # ============================== package SQLDump; sub new { my $self={filename=>$_[1]}; bless $self; return $self; } sub DESTROY { my $self=shift; my $filename=$$self{filename}; &main::remove('destroy'); }
$SIG{PIPE} = sub { exit; };
open (my $file, "<", "backup.txt");
2012-10-25T12:16:33 MuffiDu hast dir ja richtig Mühe gemacht.
QuoteDen Open am besten mit 3 Parametern
Quotedas & bei Funktionen ist recht veraltet.
2012-10-25T12:40:19 siriusQuotedas & bei Funktionen ist recht veraltet.
Hmm, ich fand das grad beim Einstieg recht praktisch um den Aufruf von eigenen Funktionen mit denen fremder (bzw. perl-) funktionen zu unterscheiden.
2012-10-25T12:40:19 siriusHmm, ich fand das grad beim Einstieg recht praktisch um den Aufruf von eigenen Funktionen mit denen fremder (bzw. perl-) funktionen zu unterscheiden. Ist also mehr so ein Spleen, mir ist bewusst, dass ich das nicht brauche.
2012-10-25T12:53:31 pq&foo übergibt das aktuelle @_ weiter an foo. könnte zu unerwarteten effekten führen.
2012-10-25T14:36:26 RaubtierDas führt aber zu reichlich unlesbarem Code! Wenn du wirklich @_ übergeben willst, dann übergib es explizit!
QuoteAußerdem sieht man dem remove so überhaupt nicht an, dass es Parameter annimmt.
my ($alle, $meine, $Parameter) =@_;
QuoteRat: Benutze das & nicht.
&log;
log @_;
2012-10-25T21:14:15 siriusPerl bietet ja dahingehend extrem große Freiheiten. Lesbarkeit scheint zumindest nicht das Ziel gewesen zu sein.
1 2 3 4
open (my $dump, '-|', 'mysqldump ...') || die "Ohoh $!" while (my $line = <$dump>) { print $line; }