Skeeve •---->


Anmeldedatum: 20.04.2006 Beiträge: 1067
|
Verfasst am: 12.05.2006 - 21:07 Titel: Perl anyone? |
|
|
Ich habe hier ja schon des öfteren Perl erwähnt. Das kommt daher, daß ich die Sprache nun schon seit mehr als 10 Jahren nutze, angfangen unter DOS fürs FIDO Netz (Nachrichten in Crosspoint einsortieren) bis heute, wo ich es regelmäßig für adhoc Lösungen auf der Arbeit oder auch zum Vergnügen verwende.
Nun dachte ich mir, ich fang mal an, den einen oder anderen hier dafür zu begeistern.
Darum zunächst mal die wichtigsten Unterschiede zwischen AppleScript und Perl, wie ich sie sehe.
AppleScript ist ja eine sehr geschwätzige Sprache. Perl hingegen ist im Allgemeinen sehr kurz und knapp.
Applescript eignet sich wunderbar um andere Programme zu steuern. Perl arbeitet am Besten mit Dateien.
AppleScript hat nur rudimentäre Textverarbeitungsfunktionen. Perl nutzt reguläre Ausdrücke um Texte zu verarbeiten.
AppleScript kommt mit einem AppleScript Editor. Für Perl nimmt man irgendeinen Text Editor, da nichts Editormäßiges mitgeliefert wird.
AppleScript läuf auf Mac OS (X). Perl läuft auf jedem *IX, und sogar auf WinDOS.
Wer mit Perl anfangen will, sollte zumindet ein bischen was über das Terminal wissen. Es gibt nämlich von Haus aus nichts doppelklickbares.
Wollen wir einfach mal mit dem altbekannten "Hallo Welt" anfangen?
Erstellt Euch einen Ordner "myperl".
Erstellt Euch dann eine Textdatei (in TextEdit Shift-Apfel-T) mit dem Inhalt:
Code: | #!/usr/bin/perl
print "Hallo Welt\n"; |
und speichert das als "HalloWelt" im Ordner "myperl" ab.
Jetzt öffnet Ihr ein Terminal Fenster und gebt folgendes ein:
Damit wechselt ihr in den Ordner "myperl"
Damit macht Ihr "HalloWelt" ausführbar, d.h. Ihr teilt Mac OS X mit, daß das die Datei ein Programm ist.
Damit startet Ihr "HalloWelt" und solltet als Ausgabe "Hallo Welt" erhalten (ohne die Anführungszeichen.
So weit, so gut?
Soll ich weiter machen? |
|
Wolle-77 •--->


Anmeldedatum: 25.02.2003 Beiträge: 449 Wohnort: Geldern
|
Verfasst am: 14.05.2006 - 23:55 Titel: |
|
|
Hallo Skeeve,
ich fände es sehr gut, wenn Du hier eine Art Perl-Workshop erfassen und nach und nach erweitern würdest. Ich weiß übrigens nicht, wie ich abstimmen kann, daher antworte ich schriftlich direkt...
Was ich aber besser fände, wäre, wenn Du Dich aus der Sicht AppleScripts dem Thema, der Perle, widmen würdest -- so wie bereits geschehen mit Deinen Antworten zum Abkürzen der ohnehin schon schwer zu verstehenden Shell-Tricks.
Also wie jemand sich ein externes Perl-Script ausführbar erstellt, ist glaube ich nicht so gefragt. Viel mehr ist die Integration in AppleScript gefragt, also in ein do shell script-Kommando verpackt.
Und dann eben die eleganten Möglichkeiten erklärt, was alles möglich ist. So würden universelle Module entstehen.
Hier einmal etwas, was mich interessieren würde: Du hast einen Ordner mit Dateien, JPGs. Es gilt, eine HTML-Fotogallerie (inklusive Links zum nächsten Bild usw.) zu erstellen. Mit AppleScript möglich, aber eben eine Schleife.
Wie baut man mit perl -- möglichst Einzeiler, damit innerhalb eines AppleScript-Droplets, eine Schleife, damit perl pro Datei (Dateiname...) nun eine HTML-Datei in Unicode codiert (!) speichert; es gibt ja dann jeweils einen kleineren HTML-Teil, der gleich ist und eben wird dynmaisch die jeweilige Datei eingebaut.
Es muß nichts Fertiges oder Perfektes werden, nur ganz einfach die Herangehensweise, schrittweise erklärt, wäre interessant. _________________ Martin Wolter
--
Apple rocks the planet! |
|
Skeeve •---->


Anmeldedatum: 20.04.2006 Beiträge: 1067
|
Verfasst am: 15.05.2006 - 14:11 Titel: |
|
|
Wolle-77 hat Folgendes geschrieben: | Was ich aber besser fände, wäre, wenn Du Dich aus der Sicht AppleScripts dem Thema, der Perle, widmen würdest |
Wobei ich AS-Anfänger bin. Aber ich werde mein Bestes geben.
Wolle-77 hat Folgendes geschrieben: | Also wie jemand sich ein externes Perl-Script ausführbar erstellt, ist glaube ich nicht so gefragt. |
Ist auch einerseits nur als Einführung gedacht und andererseits essentiell, wenn man längere Scripte nicht unübersichtlich in den AS Code einbetten will, sondern direkt von AS aus aufrufen möchte.
Wolle-77 hat Folgendes geschrieben: | Hier einmal etwas, was mich interessieren würde: Du hast einen Ordner mit Dateien, JPGs. Es gilt, eine HTML-Fotogallerie (inklusive Links zum nächsten Bild usw.) zu erstellen. Mit AppleScript möglich, aber eben eine Schleife. |
Um Schleifen kommst Du aber nicht herum.
Wolle-77 hat Folgendes geschrieben: | Wie baut man mit perl -- möglichst Einzeiler, damit innerhalb eines AppleScript-Droplets, eine Schleife, damit perl pro Datei (Dateiname...) nun eine HTML-Datei in Unicode codiert (!) speichert; es gibt ja dann jeweils einen kleineren HTML-Teil, der gleich ist und eben wird dynmaisch die jeweilige Datei eingebaut. |
Das wird aber kein Einzeiler!
Ich würde es so machen, wenn ich nicht auf fertige perl module aufbauen wll:
1. Eine Vorlage anlegen in der Platzhalter für das Bild un die Links definiert sind.
2. Dem perl Script die Vorlage und den Ordner übergeben
Wenn also jetzt jemand ein Droplet im Source abliefert, das eine HTML Datei und einen Ordner Akzeptiert und beides dem Perl Script übergibt, dann sähe der ungefähr so aus:
Code: | #!/usr/bin/perl
# Die folgenden 2 Zeilen sollte man immer verwenden,
# wenn man das Script ernsthaft nutzen wiill
# Sie warnen dann vor den gröbsten Schnitzern.
use strict;
use warnings;
# Zuerst mal die übergebenen Namen holen
my ($vorlage, $ordner)= @ARGV;
# testen ob die Reihenfolge verkehrt war
if ( -d $vorlage ) {
# -d testet ob es sich um ein Directory handelt
# Wenn $vorlage ein ordner ist, tauschen wir,
# denn dann stimmte die Reihenfolge nicht
($ordner, $vorlage)= ($vorlage, $ordner);
# Mit der Syntax da oben kann man Variableninhalte vertauschen.
# In Applescript wäre das
# set temp to vorlage
# set vorlage to ordner
# set ordner to temp
}
# Vorlage einlesen
my ($vorlage_text);
open (my $vorlage_datei, $vorlage) or die "Kann $vorlage nicht lesen: $!\n";
{ local $/; # Das ist ein Trick um alle Zeilen auf einmal einzulesen
$vorlage_text= <$vorlage_datei>;
# die <> Notation bedeutet, daß aus einer Datei gelsen wird.
# Da wir vorher den Zeilenumbruch mit "local" neu definiert haben und
# ihm keinen Wert gegeben haben, wird alles auf einmal eingelesen.
# Ansonsten hätte man eine Schleife programmieren müssen udn Zeile für
# Zeile einlesen bis die Datei zuende ist.
}
close $vorlage_datei;
# Alle Bilddateinamen holen
opendir (my $ordner_lesen, $ordner) or die "Kann $ordner nicht lesen: $!\n";
# Hier öffnen wir einen Folder zum Lesen, d.h. wir können nun einlesen,
# welche datein darin sind.
my @bilder= sort grep /^[^.].*\.(jpg|png|tiff?)$/i, readdir $ordner_lesen;
# Hier wird's heftig!
# readdir liest die Dateinamen ein.
# der grep Befehl filtert nur solche Dateien aus, die
# 1. nicht mit . beginnen (^[^.]) und
# 2. mit jpg, png tif oder tiff
# in beliebiger Groß-, Kleinschreibung (/i)
# enden ($)
# sort sortiert alphabetisch
# my @bilder speichert das ganze im array (@) mit namen "bilder"
closedir $ordner_lesen;
# Liste der nächsten und vorherigen Bilder zusammenstellen
my @next= @bilder[1..$#bilder, 0];
my @prev= @bilder[$#bilder, 0..($#bilder-1)];
# @bilder[1..n] bedeutet, daß man von dem Array nur die Einträge 1-n nimmt
# $#bilder ist dabei der letzte Eintrag.
# Also holt @bilder[1..$#bilder, 0]; den 2ten (wir fangen bei 0 an zu zählen()
# bis letzten, gefolgt vom ersten Eintrag
# Wir verschieben also alle Einträge um 1.
my $insgesamt= scalar @bilder;
# Hier gehen wir vom letzten bis zum ersten Bild alle durch
for (my $i= scalar @bilder; $i--;) {
my $bildnr= $i+1;
# holen uns den Vorlage Text in eine perl-Standardvariable ($_)
$_= $vorlage_text;
# ersetzen die Platzhalter %img%, %rueck%, %vor%, %n%, %i%
s/%img%/$bilder[$i]/g;
s/%rueck%/$prev[$i].html/g;
s/%vor%/$next[$i].html/g;
s/%n%/$insgesamt/g;
s/%i%/$bildnr/g;
# Basteln uns den Ausgabe Dateinamen zusammen
my $ausgabe= $ordner . '/' . $bilder[$i] . '.html';
# erzeugen die Datei
open my $html, '>', $ausgabe or die "Kann $ausgabe nicht erstellen: $!\n";
# Schreiben den HTML Text da rein
print $html $_;
close $html;
}
# Fertig.
|
Eine passende html könnte so aussehen:
Code: | <html>
<body>
<a href="%rueck%">zurueck</href>
<a href="%vor%">weiter</href>
<br>
Bild %i% von %n%
<br>
<img src="%img%">
</body>
</html> |
Das perl script muß natürlich per chmod +x einmal ausführbar gemacht werden und kann dann (wenn es fotoalbum heißt und z.B. in Deinem Homedirectory liegt) mit
Code: | do shell script "$HOME/fotoalbum " & quoted form of POSIX path to vorlagedatei & " " & quoted form of POSIX path to Bildordner |
aufgerufen werden. Es erzeugt dann für jedes Bild eine zugehörige .html Datei mit dem passenden Inhalt. |
|