Quiq
view release on metacpan or search on metacpan
lib/Quiq/String.pm view on Meta::CPAN
my $ind = ' ' x 4; # Einrückung
^ ^
hier müssen Leerzeichen (oder Tabs) stehen
my $ind = ' ' x 4;# Einrückung
^
Wird nicht erkannt!
my $ind = ' ' x 4; #Einrückung
^
Wird nicht erkannt!
Im Falle von mehrzeiligen Kommentaren ($start und $stop sind
definiert) ist dies das vorausgehende Leereichen nicht nötig.
=head4 Examples
HTML, XML:
$code = Quiq::String->removeComments($code,'<!--','-->');
C, Java, CSS:
$code = Quiq::String->removeComments($code,'/*','*/');
C++, JavaScript:
$code = Quiq::String->removeComments($code,'//');
Shell, Perl, Python, Ruby, ...:
$code = Quiq::String->removeComments($code,'#');
SQL:
$code = Quiq::String->removeComments($code,'--');
=cut
# -----------------------------------------------------------------------------
sub removeComments {
my ($this,$code,$start,$stop) = @_;
my $regex;
if ($start && $stop) {
# (potentiell) mehrzeiliger Kommentar
$regex = qr/\Q$start\E.*?\Q$stop\E/s;
}
else {
# einzeilger Kommentar
$regex = qr/(?:^|(?<=[\t ]))\Q$start\E .*/m;
}
# Spaces u. Tabs an Zeilenenden entfernen
$code =~ s|[\t ]+$||mg;
# Entferne alle Kommentare aus dem Quelltext und speichere die
# übrigbleibenden Fragmente in einem Array
my @frag = split m|$regex|s,$code;
if (@frag) {
if ($frag[-1] =~ /^$/) {
# End-Kommentar, da das letzte Element "leer" ist. Ein
# End-Kommentar zeichnet sich dadurch aus, dass wir
# Leerzeilen ggf. *davor* entfernen müssen. Vorgehen:
# 1) Wir entfernen das letzte Element
# 2) Wir entfernen Whitspace am Ende des vorhergehenden
# Elements, bis auf ein Newline, falls vorhanden
pop @frag;
$frag[-1] =~ s/\s+$/substr($&,0,1) eq "\n"? "\n": ''/e;
}
for (my $i = 0; $i < @frag-1; $i++) {
# Wir entfernen alle Spaces und Tabs, die vor dem Kommentar stehen
$frag[$i] =~ s/([\t ]+)$//;
if ($frag[$i] eq '' || substr($frag[$i],-1,1) eq "\n") {
# Ganzzeiliger Kommentar
# Einrückung des (ganzzeiligen) Kommentars vom linken Rand
my $ind = $1;
my ($prevInd,$prevContent) = $frag[$i] =~ /([\t ]*)(.*)$/;
if ($ind && $prevContent && $ind eq $prevInd) {
# Die vorhergehende Zeile ist keine Leerzeile (sie hat
# Content) und ist identisch eingerückt wie der Kommentar:
# Wir entfernen nur den Zeilenumbruch der Zeile.
$frag[$i+1] =~ s/^\n//;
}
else {
# Die vorhergehende Zeile ist eine Leerzeile oder
# hat anders eingerückten Content: Wir entfernen den
# Zeilenumbruch der Zeile und alle folgenden Leerzeilen.
$frag[$i+1] =~ s/^\n+//;
}
}
else {
# Teilzeiliger Kommentar: nichts zu tun, da der Kommentar
# und der Leerraum davor bereits entfernt ist
}
}
}
return join('',@frag);
}
# -----------------------------------------------------------------------------
=head2 Quoting
=head3 quote() - Fasse Zeichenkette in Single Quotes ein
=head4 Synopsis
$quotedStr = $class->quote($str);
=head4 Description
Fasse Zeichenkette $str in einfache Anführungsstriche (') ein und liefere
( run in 0.727 second using v1.01-cache-2.11-cpan-71847e10f99 )