Dirk Thierbach wrote:
> Dirk Thierbach <
dthie...@usenet.arcornews.de> wrote:
>> Schaltet die zeilenweise Verarbeitung ab. Es kann sein, dass
>> "-pi" aber trotzdem zeilenweise arbeitet.
>
> Tut es. Also muss man das auch abschalten. Test:
>
> $ echo -e "abc?>\nde?>\n\n\n" | perl -lpe 'BEGIN{$/=""}s/\?\>$//s'
^
Wie gesagt: /s ist überflüssig, da sich kein “.” im Ausdruck befindet, der
dann auch als Newline interpretiert werden könnte.
> abc?>
> de
>
> $ echo -e "abc?>\nde?>f\n\n\n" | perl -lpe 'BEGIN{$/=""}s/\?\>$//s'
> abc?>
> de?>f
>
> Das wolltest Du doch, oder?
Oder. Es hilft hier natürlich, neben einem Perl- auch einen PHP-Minimalclue
zu haben, durch den man weiss, dass “… abc?>\nde?>f\n\n\n” kein syntaktisch
korrekter PHP-Code sein kann (auch für geeignete Werte von “de” und “f”
nicht), und daher nicht Ziel dieser Übung sein kann.
Vielmehr geht es darum, aus
<?php
foo
?>
den Code
<?php
foo
zu machen, damit nicht ungewollt nicht-druckbare Zeichen ausgegeben werden
(ausserhalb von <?php … ?> gibt der *P*HP *H*ypertext *P*reprocessor
zweckgemäss immer alles aus; wilde print/echo-Experimente wie sie in Perl
AFAIK nötig sind, kann man sich so in PHP sparen).
<
http://php.net/manual/>
> -i hinzufuegen, um Dateien "in-place" zu ersetzen (nicht getestet, ich
> hoffe, es gibt keine Zusatzkomplikationen. Sonst halt mit externer
> Schleife).
Dein Ansatz ist grober Unfug; “perldoc perlrun”, “perldoc perlvar”;
angesichts Deiner anderen Perl-“Weisheiten” besser vorher noch “perldoc
perlintro”.
Man will hier gerade *keine* Schleife (“-p”), denn es interessiert nur das
*Ende* der Datei. Das entsprechende Perl-Skript könnte daher so aussehen:
use strict;
use warnings;
# Zeilenende ist nicht mehr Datensatzbegrenzer
$/ = "";
# Ganze Datei auf einmal einlesen (Slurping)
$_ = <>;
# “Problematischen” Quelltext löschen
s/(\s* \?> | \s* <\? (?:php)? )+ \s* $//x;
# Geänderten Dateiinhalt ausgeben
print;
oder auf der Befehlszeile
$ printf '\n?>foo<?php bar ?>\n\n<?php' | perl -e 'use strict; use warnings;
$/ = ""; $_ = <>; s/(\s* \?> | \s* <\? (?:php)? )+ \s* $//x; print;'
?>foo<?php bar
Vermutlich geht es noch kürzer, aber das *funktioniert* immerhin und geht
auch bei grossen Dateien hinreichend schnell. Zu beachten ist aber, dass
beim Slurping die Grösse der verarbeitbaren Datei vermutlich durch den
verfügbaren Speicher begrenzt ist. Wie so oft tauscht man also Speicher-
gegen Laufzeiteffizienz.
Wenn man das nicht will, muss man bei einer Schleife zumindest eine
Fallunterscheidung einbauen, damit man *nur* die letzte Zeile bearbeitet
(aber selbst dann ist nicht sichergestellt, dass die letzte Zeile die zu
suchende Zeichenfolge enthält, daher halte ich das Ersetzen im geschlürften
Dateiinhalt hier für deutlich praktischer).
X-Post & F'up2 de.comp.lang.perl.misc