Schrift
[thread]315[/thread]

Mit RegEx suchen und bei Erfolg Datei ausgeben.



<< >> 6 Einträge, 1 Seite
cbxk1xg
 2004-07-05 19:33
#3038 #3038
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Hallo Freunde der Sonne,

ich quäle mich nun schon seit einiger Zeit mit einem Schleifen und RegEx Problem. Ich habe ein Array das in irgendeiner Zeile [include=meinedatei.htm] enthält. Wärend ich nun in einer Schleife danach suche, möchte ich die Datei meinedatei.htm einlesen und an die Stelle setzen wo vorher [include=meinedatei.htm] stand.

Bitte sagt mir jetzt nicht, dass ich HTML:Template benutzen soll. Das ist mir viel zu kryptisch.

Meine eigentliche Frage ziehlt darauf ab, ob ich innerhalb einer Regex eine SUB oder ähnliches aufrufen kann. Ich habe diesbezüglich leider keine passende Doku gefunden.

Hier ein Teil des Codes:
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
sub printhtml
{
 print "Content-type: text/html\n\n";

 my (@TEMPLATE) = @_;

 foreach $line (@TEMPLATE)
 {
   $line =~ s-\[include\=(.*?)\]-@INCLUDE = &getInclude( "$path$1" )-g;
   print "$line\n";
 }
}


# Die SUB soll die gesamte Datei in einen String einlesen.
sub getInclude
{
 my ($filename) = @_;
 my (@INCLUDE) = ();
 if ((-e "$filename") && (-f $filename))
 {
   @INCLUDE = ();
   open( INCLUDE, "$filename" );
   foreach $line (<INCLUDE>)
   { $line =~ tr-\n\r--d;
     push( @INCLUDE, $line ); }
   close( INCLUDE );
   return @INCLUDE;
 }
 else { return; }
}


Momentan bekomme ich als Ausgabe nur:
Code: (dl )
= &getInclude( "/123/htdocs/includes/meinedatei.htm" )


Das heißt ich bekomme nur den Text raus, den ich auch reingegeben habe.
pq
 2004-07-05 20:07
#3039 #3039
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
also wenn dir HTML::Template, ein meiner meinung nach echt einfaches
modul, schon zu 'kryptisch' ist, dann... tja dann weiß ich auch nicht.
naja.
wenn du in der ersetzung bei s/// etwas ausführen willst,
brauchst du den modifier /e. da ssteht aber auch in perlre.pod.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
cbxk1xg
 2004-07-06 04:15
#3040 #3040
User since
2003-10-20
496 Artikel
BenutzerIn
[default_avatar]
Das es nun nicht das anspruchsvolslte Modul ist, ist mir auch klar. Ich mag nur keine Module benutzen, wo man mit ein paar Zeilen das gleiche Ergebnis erzielen kann. Oft muss ich meine Skripte auch auf Webservern einsetzen wo man keine Module nachinstallieren kann. Normale Module ja, aber keine Module die man erst kompilieren muss. Daher lebe ich gerne modulfrei wenn es die Kompatibiltät erhöht, der Code nicht zu lang wird und die Performance stimmt.

Danke für den Hinweiss auf den Modifier. Da ich Perl nicht auf einem meiner Rechner installiert habe, sondern nur mit entfernten Webservern arbeite, kann ich leider auch nicht auf perldoc oder perlre.pod zugreifen. Manchmal hilft es mir aber schon wenn ich wenigstens weiss wonach ich in meinen Büchern (O'Reily und Co.) suchen muss.

Ich habe das Problem auch (fast) gelöst. Es gibt nur noch einen kleinen Fehler, der sich aber an anderer Stelle in meinem Skript befindet. Hier meine Lösung (falls es überhaupt jemanden gibt, den das interessiert).

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
sub printhtml
{
print "Content-type: text/html\n\n";

my (@TEMPLATE) = @_;

foreach $line (@TEMPLATE)
{
  $line =~ s-\[include\=(.*?)\]-my $IncludeFile = &getIncludeFile( "$path$1" )-ge;
  print "$line\n";
}
}


sub getIncludeFile
{
# ließt die gesamte Datei in einen String ein.
# undef $/ sorgt dafür, dass kein Trennzeichen
# für die einzelnen Zeilen akzeptiert werden.

my ($filename) = @_;
open (FILE, "<$filename") or return( "Unable to get include-file." );
undef $/;
my $IncludeFile = <FILE>;
close(FILE);
return $IncludeFile;
}
renee
 2004-07-06 09:45
#3041 #3041
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
unter http://perldoc.com kannst Du die perldocs auch lesen...

Lösungen sind immer interessant...
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/
Taulmarill
 2004-07-06 10:47
#3042 #3042
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
einen tip noch zum code.
wenn man aus subroutinen werte zurückgibt, macht es sich immer gut, keine werte sondern referenzen zurückzugeben. besonders wenn es sich bei den rückgabewerten um grosse daten/datenstrukturen handelt.
mit return \$IncludeFile; gibst du also in deinem bespiel eine referenz auf die variable $IncludeFile zurück. das hat den vorteil, dass die daten der variable nicht kopiert werden müssen sondern nur eine art zeiger auf die daten erzeugt wird.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
pq
 2004-07-06 12:23
#3043 #3043
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=cbxk1xg,06.07.2004, 02:15]Das es nun nicht das anspruchsvolslte Modul ist, ist mir auch klar. Ich mag nur keine Module benutzen, wo man mit ein paar Zeilen das gleiche Ergebnis erzielen kann.[/quote]
ich will jetzt nicht deine gefühle verletzen, aber man sieht doch, dass es
eben nicht in ein paar zeilen geht, sonst müsstest du ja nicht hier fragen...
Quote
Oft muss ich meine Skripte auch auf Webservern einsetzen wo man keine Module nachinstallieren kann.

gilt nicht, HTML::Template ist pures perl.
Quote
Daher lebe ich gerne modulfrei wenn es die Kompatibiltät erhöht, der Code nicht zu lang wird und die Performance stimmt.

drei unbekannte.
wenn du das ganze als lernprojekt bezeichnest, ist das natürlich ok, dann
solltest du aber auch die perldocs lesen. renee hat dir ja jetzt gesagt,
wo's die gibt, d.h. ab sofort keine ausreden mehr... =)
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< >> 6 Einträge, 1 Seite



View all threads created 2004-07-05 19:33.