Schrift
[thread]11994[/thread]

lesen aus DATA: Wie resetten?



<< >> 8 Einträge, 1 Seite
FIFO
 2008-06-08 22:59
#110892 #110892
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Hallo allerseits, stehe grad irgendwie auf dem Schlauch:

hab in einem Modul eine sub 'print_helpscreen', die mir Hilfetexte aus html-artig gekennzeichneten Abschnitten in source::DATA ausgibt, so lassen sich die Texte schön im selben File getrennt vom Code pflegen, finde ich angenehmer als lange here-docs ...

Meine Probleme:
1. wie schaffe ich es, dass Dinge wie \t aus der Quelle interpoliert werden?
2. wie 'resette' ich das DATA-Handle, so dass ich bei mehrfachen Aufrufen wieder am Start des DATA-Segments bin? Ein close $handle hilft da nicht weiter.

Danke ...

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
#----------------------------------------------------------------------------#
# sub print_helpscreen
# Aufruf: print_helpscreen(*HANDLE, 'section')
# Gibt Helpscreen aus angegebenen Sektion in <$HANDLE> aus.
# Beispiel: print_helpscreen(*DATA, 'hilfetext')   # DATA-Handle des Aufrufers
# 'Sektion' bezeichnet einen in HTML-artige Tags gefassten Abschnitt,
# im Beispiel: <hilfetext> ... </hilfetext> (case-insensitive)

sub print_helpscreen {
    croak 'print_helpscreen: Missing argument' if @_ < 2;
    my ($handle, $section) = @_;

    LOOKUP_SECTION:
    while (my $line = <$handle>) {
        last LOOKUP_SECTION if $line =~ m{<$section>}i;
    }

    PRINT_LINE:
    while (my $line = <$handle>) {

        last PRINT_LINE if $line =~ m{</$section>}i;
        print $line;
    }
}
#----------------------------------------------------------------------------#
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
Linuxer
 2008-06-09 00:09
#110893 #110893
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
zu 2.:

perldoc -f tell
perldoc -f seek
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!
moritz
 2008-06-09 00:11
#110894 #110894
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Da du sowohl interpolation als auch reset haben willst, würde ich dir ein HERE-Dokument empfehlen:

Code (perl): (dl )
1
2
3
4
5
6
my $str = <<"HELP";
This is a help text.
Usage: $1 [options]
\tOption 1
\tOption 2
HELP
FIFO
 2008-06-09 01:39
#110895 #110895
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Linuxer+2008-06-08 22:09:37--
zu 2.:
perldoc -f tell
perldoc -f seek


Danke, seek funktioniert, hatte das bislang nur bei "echten" Filehandles und byteorientiertem Lesen verwendet.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#----------------------------------------------------------------------------#
sub print_helpscreen {
    my ($handle, $section) = @_;

    seek $handle, 0, 0; # zum Anfang des DATA-Bereichs

    LOOKUP_SECTION:
    while (my $line = <$handle>) {
        last LOOKUP_SECTION if $line =~ m{<$section>}i;
    }
    ...
}
#----------------------------------------------------------------------------#


@moritz: HERE-docs wollte ich ja gerade vermeiden (s.o.). Die Frage, wie man interpolierbare Strings aus dem Handle liest, ist unabhängig davon. Ich probier mal weiter ...
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
Linuxer
 2008-06-09 11:56
#110897 #110897
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hallo FIFO,

es hatte seinen Grund, warum ich tell ebenfalls nannte.

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

my $position = tell DATA;

while ( my $line = <DATA> ) {
  print $line;
}

print "\n--8<-- ( seek DATA, 0,0 ) -->8--\n\n";

# mal schauen, was er nun ausgibt:
seek DATA, 0, 0;

while ( my $line = <DATA> ) {
  print $line;
}


print "\n--8<-- ( seek DATA, $position, 0 ) -->8--\n\n";

# mal schauen, was er nun ausgibt:
seek DATA, $position, 0;

while ( my $line = <DATA> ) {
  print $line;
}

__DATA__
Dies ist
mein Datenbereich,
den ich später
auslesen werde.


Mit seek DATA, 0, 0; setzt Du den Zeiger innerhalb des Dateihandles auf den Anfang des Handles und somit auf den Anfang des Skriptes, nicht auf den Punkt, wo der DATA-Bereich beginnt.
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!
FIFO
 2008-06-09 23:51
#110921 #110921
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Linuxer+2008-06-09 09:56:20--
es hatte seinen Grund, warum ich tell ebenfalls nannte.
...
Mit seek DATA, 0, 0; setzt Du den Zeiger innerhalb des Dateihandles auf den Anfang des Handles und somit auf den Anfang des Skriptes, nicht auf den Punkt, wo der DATA-Bereich beginnt.


Danke, das war mir schon klar, kannst Du aber nicht riechen ;-)
[edit]und oben hab ich es auch falsch kommentiert: ... zum Anfang des DATA-Bereichs ...[/edit]
Was mir immer noch nicht klar ist, ist die Sache mit der Interpolation, und nebenan singt der Kirchenchor ("Fallallala!"), die Konzentration geht zum Teufel, muss mich zuhause nochmal dransetzen.
Gruß FIFO
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
styx-cc
 2008-06-10 13:23
#110931 #110931
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Interpolieren:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
#!/usr/bin/perl -w
use strict;
use String::Interpolate qw( interpolate );

my $string = <DATA>;
print interpolate($string);

__DATA__
Hallo\ndu da
Pörl.
FIFO
 2008-06-10 18:54
#110951 #110951
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Danke, das scheint es zu sein :-)
Gruß FIFO
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
<< >> 8 Einträge, 1 Seite



View all threads created 2008-06-08 22:59.