chomp -> spinn ich?
Dietmar
- perl
Guten Abend zusammen,
ich stehe gerade vor einem seltsamen Problem und ich schaffe es einfach nicht es zu lösen obwohl es eigentlich sehr einfach ist.
Scheinbar seh ich den Wald vor lauter Bäumen nicht.
Folgendes: ich möchte eine html Datei auslesen und mir alles zwischen <head> und </head> ausgeben lassen.
Der aufbau der html-Datei sieht gefolgt aus:
<html>
<head>
<title>Seitennamen</title>
</head>
<body>
Text
</body>
Ich habe es mir gedacht es so auszulesen:
open my $htmldatei, '<', 'seite.html';
while (<htmldatei>)
{
if ($_ =~ m/<head>(.*)<\/head>/i)
{
print $1
}
}
Das geht zwar aber nur wenn die html-Datei keine Zeilenumbrüche hat, sprich wenn alles in einer Zeile steht.
Egal wann wo wie ich chomp einsetze der reguläre ausdruck wertet das chomp nicht.
Ich habe auch versucht die Datei in ein Array zu lesen und dort nötige anweisungen zu geben aber das will auch nicht?
Über einen kleinen Hinweis wäre ich dankbar ich verzweifel gerade an dem kleinen problemchen.
Mfg Dietmar.
Moin Moin!
HTML mit RegExp zu bearbeiten ist bestenfalls ein schneller Hack. Benutze HTML::Parser o.ä.
Wenn Du unbedingt RegExps einsetzen willst, lies die gesamte Datei per Slurp-Mode in einen Skalar und benutze dann eine RegExp, die auch über Zeilenenden hinaus matcht.
Alexander
Über einen kleinen Hinweis wäre ich dankbar ich verzweifel gerade an dem kleinen problemchen.
while(<FH>){}
bewirkt, dass eine Zeile durch \n erkannt wird, da das Filehandle im Listenkontext steht.
Du konntest mit grep() das Resultat des Filehandles in einem Scalarkontext zuweisen.
mfg Beat
Guten Abend,
danke für die wirklich rasche Antwort.
Jetzt bin ich wahrlich erleichtert ich dachte es ist wirklich etwas leichtes aber scheinbar doch nicht.
Ich möchte keine Module benutzen aber grep hört sich gut an ich wüsste aber nur wie man grep auf eine liste anwendet und wüsste jetzt nicht wie ich es für diesen zweck nutzen könnte. Könnt ihr mir da noch schnell helfen?
Wenn euch langweilig sein sollte beantowrtet auch meine anderen zwei fragen hehe.
1. Angenommen ich schreibe ein text der gefolgt aussieht:
print "Hallo
mein
Name
ist
Dietmar";
Wird es auch genauso ausgegeben ich möchte aber das die leerzeichen oder absätze nicht dazugezählt werden, es soll folglich so aussehen:
HallomeinNameistDietmar
Wie könnte ich das folgende Problem lösen?
2. In einem Programm soll am ende gefragt werden ob man das Programm beenden will wenn ja dann muss man eine eingabe tätigen wenn nein soll das Programm automatisch nach so und soviel sekunden beenden.
Vielleicht hilft euch das weiter zu verstehen:
print "Um das Programm zu beenden geben sie exit ein\n";
my $eingabe = <STDIN>;
chomp $eingabe;
if ($eingabe) #<- hier soll überprüft werden ob der User eine Eingabe gemacht hat
{
exit;
}
else #<- wenn nicht
{
sleep 20;
exit;
}
Das Problem ist das Programm wird solange nicht weiter ausgeführt bis eine eingabe getätigt wurden ist
Hoffentlich ist klar was ich meine? Wenn nicht gerne nachhaken!
Mfg Dietmar.
Ich möchte keine Module benutzen aber grep hört sich gut an ich wüsste aber nur wie man grep auf eine liste anwendet und wüsste jetzt nicht wie ich es für diesen zweck nutzen könnte. Könnt ihr mir da noch schnell helfen?
Ich habe hier mal eine andere Lösung:
#!C:/Programme/Perl/bin/perl.exe -w
#
use strict;
my ( $string ) = ( join('',<DATA>) =~ /<head>(.*?)<\/head>/sm );
print $string, "\n";
sleep(10);
exit(1);
__DATA__
<html>
<head>
<title>hallo</title>
</head>
<body>
</body>
</html>
Ich würde sie aber bei grösseren Files nicht anwenden, sondern anders einlesen( Startpunkt bis Endpunkt in while Schleife.)
Wird es auch genauso ausgegeben ich möchte aber das die leerzeichen oder absätze nicht dazugezählt werden, es soll folglich so aussehen:
HallomeinNameistDietmar
Wie könnte ich das folgende Problem lösen?
$string = s/\s//g;
Dein 3.Problem lässt sich so nicht lösen
Wenn du Input verlangst, wird das Programm unterbrochen, bis Input vorliegt.
mfg Beat
Guten Abend und danke Beat es klappt hervorragend nur weiss ich leider nicht "warum"
Könntest du mir diese Zeile bitte grob erklären:
my ( $string ) = ( join('',<DATA>) =~ /<head>(.*?)<\/head>/sm );
Mfg Dietmar
Guten Abend und danke Beat es klappt hervorragend nur weiss ich leider nicht "warum"
Könntest du mir diese Zeile bitte grob erklären:
my ( $string ) = ( join('',<DATA>) =~ /<head>(.*?)<\/head>/sm );
Zuerst konstruiere ich einen List Context in der Zuweisung
my ( ) = ( );
Der Grund ist, dass ein captured $1 so zugewiesen wird, statt die Anzahl der Treffer.
join('',<DATA>)
erzeugt einen String, auf welchen ich m// anwende
m//sm
beinhaltet zwei Modifier
für multiline und für das matchen von newlines für . (den Punkt)
mfg Beat