Helpdesk
Menschen Wissenschaft Politik Mystery Kriminalfälle Spiritualität Verschwörungen Technologie Ufologie Natur Umfragen Unterhaltung
weitere Rubriken
PhilosophieTräumeOrteEsoterikLiteraturAstronomieHelpdeskGruppenGamingFilmeMusikClashVerbesserungenAllmysteryEnglish
Diskussions-Übersichten
BesuchtTeilgenommenAlleNeueGeschlossenLesenswertSchlüsselwörter
Schiebe oft benutzte Tabs in die Navigationsleiste (zurücksetzen).

Einstieg in Perl

38 Beiträge ▪ Schlüsselwörter: C, Coding, Perl ▪ Abonnieren: Feed E-Mail
---- Diskussionsleiter
ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Einstieg in Perl

17.10.2012 um 17:15
@the.smoker

Das wäre dann das Thema Eigeninitiative. Die Unterschiede sind erst mal geringfügig und die Syntax bleibt gleich. Kannst du Perlprogramme für Linux schreiben kannst du identisches auch für Windows komponieren.

Hier sollte es darum gehen dass überhaupt Programme geschrieben werden können. Die Plattform meines Progs ist halt Linux. Vll. portier ich es am Ende rüber zu Windows.

Ist dir eine liveCD oder eine Virtualbox mit einem Linux zu mühsam?


melden
---- Diskussionsleiter
ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Einstieg in Perl

17.10.2012 um 20:45
2a9942 perlOriginal anzeigen (0,4 MB)


melden
---- Diskussionsleiter
ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Einstieg in Perl

18.10.2012 um 01:14
Ich seh grad dass es Probleme gibt sofern die Datei mit .xxx.txt endet.

Prinzipiell läuft es natürlich aber:

Die Dateiendung wird abgesplittet.

Dazu wird das letzte "/" im Pfad genutzt. Danach kann eine Reihe beliebiger Zeichen in beliebiger Länge kommen. Der erste Punkt nach dem letzte / dient als Kriterium zum abtrennen der Dateiendung.


Egal ob nun .ext.txt oder nur .txt.

Es wird überprüft ob in der abgetrennten Endung das erlaubte Fileformat vorkommt.

Es wird aber nicht das Ende überprüft. Sondern ob der Suchstring (z.B. txt) in dem gesammten abgetrennten Bereich vorkommt.

Bedeutet:

Eine Datei mit der Bezeichnung file.txt.php würde sich durchmogeln da der String txt in der gemäß den Kriterien abgetrennten Endung vorkommt.


Kurze Erläuterung:

Es gibt drei Kernmöglichkeiten.

1. Es wurde etwas in der Variablen für Endung gespeichert. Die Variable ist also nicht leer. Es handelt sich also um eine einzelne Datei. Dies wird dann weiter überprüft und validiert.

2. Es gibt eine Endung aber sie beinhaltet weder das Suchkriterium txt oder lst.

- Im hier eingestellten Skript wird an dieser Stelle ebenfalls im ganzen Extension String gesucht. Nicht am expliziten Ende.

3. Keine Dateiendung in der Variablen gespeichert, was bedeutet dass es sich um eine Pfad zu einem Ordner handeln muss. Dabei wird geprüft ob der Ordner existiert etc.


Um das zu beheben wurden die Suchkriterien verschärft und es wird ausdrücklich am absoluten Ende des abgesplitteten Strings gesucht.

Als erstes wird Option 1 verschärft. Die Endung muss .txt oder .lst am absoluten Ende lauten.

Die Datei file.txt.php scheitert hier und es wird Kondition zwei geprüft.

- handelt es sich um einen Typo? Bzw. ist der String "txt" bzw. "lst" in der Endung NICHT vorhanden. Es folgt , sofern dass Kriterium zutrifft eine Aufforderung einen neuen Pfad einzugeben.

Die Endung ist nach wie vor .txt.php. Es wird der Suchstring txt gefunden was bedeutet dass die Kriterien nicht erfüllt wurden und das Skript zu Punkt drei springt und überprüft ob es sich um einen Pfad zu mehreren Dateien handelt. Hier ist das Hauptkriterium dass die Variable mit der Endung leer ist. Dies ist aber nicht der Fall.

Eine weitere Möglichkeit steht nicht zur Option und das Skript läuft weiter. Die Datei mit unerlaubter Endung kam durch.


Also verschärfen wir auch hier und suchen hier ebenfalls explizit am Ende nach .txt bzw. .lst.

Das erfolgt innerhalb der Regexs, normalerweise mit dem $ Zeichen. Wobei hier der newlinecharacter, in Linux "/n" als Ende gewertet werden. Das würde uns erlauben die Datei wie folgt zu nennen:

.txt\n.php

Das \n wird als Ende interpretiert(ähnlich dem bekannten Nullbyte) und es wird natürlich .txt am Ende gefunden. Die Validierung springt zur nächsten Möglichkeit. Da auch diese nicht greift läuft das Skript ebenfalls weiter und die Datei kommt immer noch durch.

Man kann die Dateiendung von \n` s befreien bevor wir sie validieren:
$ext =~ s/\n*//g;

Ein simples:

else{print"Sorry. Could not validate the given extension";exit;}

beugt in Zukunft vor. Greift keine der gegebenen Optionen greift diese und stoppt das Skript


Das wäre ein Workaround. Der korrekte Weg wäre natürlich alles nach dem letzten Punkt hinter dem letzten "/" als Endung zu nehmen und \n miteinzubeziehen bzw. zu entfernen:)


Sicherheit spielt hier zwar keine Rolle aber wenn ich sag "nur bestimmte Dateien" dann sollen auch nur die definierten Dateien durchkommen.


1x zitiertmelden
---- Diskussionsleiter
ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Einstieg in Perl

18.10.2012 um 01:24
Betroffene Zeile:
Zitat von -------- schrieb:$ext =~m/\btxt\b|\blst\b/i)
wird:
$ext =~m/txt$|lst$/i)
Darüberhinaus kann die Zeile raus:
Zitat von -------- schrieb:$ext =~ s/(\.?[^.?]*)?\?.*?$/$1/;
und das hier:
Zitat von -------- schrieb:$conf[2] =~ m{([^\\/.]+([^\\/]*)$)};our ($fil) = $1; our @dir_S=split($fil,$conf[2]);
Ließe sich kürzen.
Zitat von -------- schrieb:$conf[2] =~ m{([^\\/.]+([^\\/]*)$)};our ($fil) = $1; our @dir_S=$\';
Dadurch könnte man auch auf das array verzichten:
Zitat von -------- schrieb:$conf[2] =~ m{([^\\/.]+([^\\/]*)$)};our ($fil) = $1; our $dir_S=$\';



melden
---- Diskussionsleiter
ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Einstieg in Perl

18.10.2012 um 01:27
Und ums noch kürzer zu machen (nicht getestet):

$conf[2] =~ m{([^\\/.]+([^\\/]*)$)};our ($fil,$$dir) = "$1","$\'";


melden

Einstieg in Perl

18.10.2012 um 01:31
@----
Könntest du evtl. noch einmal kurz erklären _was_ dieses Script überhaupt machen soll (bzw. speziell die letzten 3 posts von dir), denn ich kann dir jetzt nicht wirklich folgen.


melden
---- Diskussionsleiter
ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Einstieg in Perl

18.10.2012 um 01:50
Das Skript sucht nach Schlüsselwörtern auf deinen Lieblingsseiten.:)

Eine private Suchmaschine die nicht das ganze Web durchsucht sondern sich auf die definierten Seiten beschränkt.

URLs mit positiven Ergebnissen werden auf Wunsch in einer Datei gespeichert und bei Auswahl im Terminal zu lynx gepiped.

Prinzipiell nutzlos aber super zum lernen der essentiellen Dinge.


melden
---- Diskussionsleiter
ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Einstieg in Perl

18.10.2012 um 02:01
PS: Wird das Skript ohne Paramter aufgerufen startet ein ConfigWizard. -h bzw. --help öffnen das kleine Nutzerhandbuch.


melden

Einstieg in Perl

18.10.2012 um 02:04
@----
O.K. das leuchtet ein (hättest du vll.t gleich am Anfang erwähnen sollen ;) ).
Wozu genau dient dann aber:
Zitat von -------- schrieb:Ich seh grad dass es Probleme gibt sofern die Datei mit .xxx.txt endet.
Sind das die "config-Dateien", also die mit den Schlüsselwörtern?


melden
---- Diskussionsleiter
ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Einstieg in Perl

18.10.2012 um 02:08
Ja.

Wenn du ein Thema recherchierst oder Tutorials suchst einfach alle Schlagwörter in eine Datei packen oder wenn du mehrere Themen recherchierst für jedes Thema eine Datei mit eigenen Schlagwörtern erstellen. Das wird im Output berücksichtigt.

Jedes Schlüsselwort bekommt seine eigene Suche. Die Anzahl der Threads bestimmt dabei wieviele Suchanfragen synchron starten.

Du kannst dich dabei voll und ganz auf die guten in einer Liste gespeicherten Seiten konzentrieren.

Es ist in etwa vergleichbar mit google nur dass du eben nicht 20 einzelne Suchen startest sondern direkt alle auf einmal.:)


1x zitiertmelden

Einstieg in Perl

18.10.2012 um 02:16
@----
Zitat von -------- schrieb:Wenn du ein Thema recherchierst oder Tutorials suchst
Dann wäre es (für später) auch noch sinnvoll einen html-Parser zu schreiben, der Dinge wie
<\script ...> <\/script> ignoriert und nicht dort auch die Keywords sucht, oder aber auch <\a href=...>TEXT<\>
nur TEXT parst usw. (nur mal zum weiterdenken)


melden
---- Diskussionsleiter
ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Einstieg in Perl

18.10.2012 um 02:23
Gibts als Modul. Aber danke für den Tip.
http://www.foo.be/docs/tpj/issues/vol5_1/tpj0501-0003.html


melden

Einstieg in Perl

18.10.2012 um 02:27
@----
Ja natürlich gibts dafür schon alles, aber man kann, wenn man es selbst schreibt, mehr lernen wie wenn man alles "fertig" nutzt. (Man könnte im Prinzip auch einfach nen xml Parser nehmen)


melden
---- Diskussionsleiter
ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Einstieg in Perl

18.10.2012 um 02:30
Kommt auf den Schwerpunkt an. Meine Kerninteressen liegen woanders. Da mach ich gerne Abstriche.

Gemäß dem Sprichwort: Mach ein Ding aber mach es gut. Alles andere ist oftmals Ballast. Spezialisieren ist in meinen Augen wichtig.


melden
---- Diskussionsleiter
ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Einstieg in Perl

18.10.2012 um 03:00
Funktioniert:
$conf[2] =~ m{([^\\/.]+([^\\/]*)$)};our ($fil,$dir_S) = ($1,$`);



melden
---- Diskussionsleiter
ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Einstieg in Perl

18.10.2012 um 03:38
Hier die Funktion zum zerlegen des Pfads:
our $path=/path/to/my/dictionary.txt
sub SPLITTER {
$_[0] =~ m{([^\\/.]+([^\\/]*)$)};
$_ = ( fileparse( $_[0], '\..*$' ) )[2];

return($`,$1,$_);
}
Die Nutzung:
our @PFE=SPLITTER($path);
Resultat:
print CLEAR WHITE "Display whole Array:\n";
print CLEAR GREEN "@PFE \n";

print CLEAR WHITE "Display Arraycontent one by one:\n";
print CLEAR GREEN "Path: $PFE[0]\n";
print CLEAR GREEN "Filename: $PFE[1]\n";
print CLEAR GREEN "Extension: $PFE[2]\n";

print RESET;



melden
---- Diskussionsleiter
ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Einstieg in Perl

18.10.2012 um 17:03
Die Subroutine in so kurz wie ich sie bekommen hab:
sub SPLITTER {
$_[0] =~ m{([^/.]+([^/]*([\..*]*$))$)};
return($`,$1,$2);
}
Wird ein Pfad ohne abschließendes / übergeben wird der Teil nach dem letzten / als Dateiname abgetrennt. Innerhalb meines Programms ist das allerdings kein Problem da der Pfad der Ursprungsquelle als Pfad genutzt wird sofern $2 nicht definiert ist.

Bedeutet: Wird keine Dateiendung gefunden dient der eigentlich an die Subroutine übergebene Wert als Pfad.

Ob man das als dirty workaround titulieren muss lass ich mal dahin gestellt.

Die Aufgabe ist zu erkennen ob der Pfad in einer Datei endet und gegebenenfalls die Endung als auch den Dateinamen zu separieren. Im Falle des Misserfolgs werden die Ergebnisse nicht berücksichtigt.
@Array=SPLITTER($path);

if(!($array[2])){$directory=$path;}else{$directory=$array[0];}



melden
---- Diskussionsleiter
ehemaliges Mitglied

Link kopieren
Lesezeichen setzen

Einstieg in Perl

18.10.2012 um 17:09
Lässt sich natürlich auch in die Subroutine integrieren was sich vermutlich negativ aufs Benchmark auswirkt.


melden

Ähnliche Diskussionen
Themen
Beiträge
Letzte Antwort
Helpdesk: Programmieren: Hilfe & Austausch
Helpdesk, 920 Beiträge, am 16.03.2024 von THX1138
accrec am 13.04.2011, Seite: 1 2 3 4 ... 43 44 45 46
920
am 16.03.2024 »
Helpdesk: Tastatureingabe per Skript
Helpdesk, 13 Beiträge, am 02.07.2019 von Sector7
Demo am 24.06.2019
13
am 02.07.2019 »
Helpdesk: Perl vs. Python
Helpdesk, 19 Beiträge, am 21.12.2011 von smodo
Hacker1209 am 22.10.2010
19
am 21.12.2011 »
von smodo
Helpdesk: Spiel programmieren
Helpdesk, 13 Beiträge, am 26.08.2010 von gorgon
usuldw am 06.08.2010
13
am 26.08.2010 »
von gorgon