2010-03-20 8 views

Antwort

8

Wenn Sie sicher sind, dass es ist ein/am Ende die ganze Zeit Sie die Chop-Funktion verwenden können:

$test = "test/"; 
$test = chop($test); 

Wenn Sie nicht sicher sind, können Sie tun:

$test = "test/"; 
$test = $1 if($test=~/(.*)\/$/); 
+0

Herzlichen Glückwunsch zu 10k Reputation – Zerobu

+0

@Zerobu: Danke Kumpel :) – codaddict

+0

Nutzlose Verwendung von Capturing Group, und wenn die Zeichenfolge neue Zeilen enthält, wird es auch zu brechen. – Qtax

12

Mit einem regulären Ausdruck zu tun: $test =~ s/\/$//

Alternativ, wenn Sie das letzte Zeichen sind sicher, dass ein Schrägstrich sein wird, können Sie die chop Funktion: chop $test

+3

Ich würde '$ test = ~ s [/ $] []' für die Lesbarkeit schreiben. – Quentin

+1

Verwenden Sie den Anker \ z, um das absolute Ende der Zeichenfolge zu erhalten. –

+1

Sorry für die Mühe, aber es scheint, dass diese Regex funktioniert für alle Verzeichnisse, * außer * bei der Verwendung von 'Stammverzeichnis' * ->/<-.Es wird einfach den Root-Pfad entfernen, der in einigen Fällen nicht so gut ist, weil er mit einem nachgestellten Schrägstrich beginnt (Paradoxon?). ;-) – Semo

8

können Sie die s/// Substitution Operator:

$test =~ s{/\z}{}; 
+1

Großartige Gedanken sind gleich ... – justintime

+1

Verwenden Sie den \ z-Anker, um das absolute Ende der Zeichenfolge zu erhalten. –

8

Persönlich würde ich das anders formulieren die Mischung aus "\" und "/"

$test =~ s|/$|| 

zu vermeiden Wenn Sie "|" Sie brauchen nicht die „/“

+1

Verwenden Sie den Anker \ z, um das absolute Ende der Zeichenfolge zu erhalten. –

0

Dieser Ausschnitt kümmert sich um folgende Schrägstriche zu zitieren, mit Ausnahme des Stammverzeichnis:

#!/usr/bin/perl 
 

 
my $test = './'; 
 
$test =~ s{(.+)/\z}{\1}; 
 
print $test."\n";

Hier ist, wie es funktioniert:

Der erste Teil des regulären Ausdrucks - s {(. +)/\ Z} - definiert eine Gruppe in den Klammern (). Dies wird durch die \ 1 im zweiten Teil des regulären Ausdrucks - {\ 1}. Innerhalb dieser Gruppe habe ich ein oder mehrere Zeichen definiert - . + - gefolgt von einem Schrägstrich gefolgt von dem absoluten Ende der Zeichenfolge - \ z.

Der reguläre Ausdruck speichert alles in den Klammern, die später als \ 1 in der Ersatz-Spezifikation verwendet werden

Dies zu einer typischen sed Strategie sehr ähnlich arbeitet, nämlich (den zweiten Teil, im Grunde.):

echo "./" | sed -e 's:\(..*\)/$:\1:'

ich hoffe, das Ihnen von Hilfe ist.

+0

Schön, einen zu sehen, der das reale Problem des Wurzelverzeichnisses anspricht. Zwei weitere Ideen: 1) Ich glaube, dass die empfohlene Art der Ersetzungen in der Ersetzung ist mit "$" und nicht "\", obwohl beide arbeiten. 2) Es kann effizienter sein, nur das Zeichen kurz vor dem nachgestellten/anstelle von möglicherweise sehr, sehr vielen Zeichen zu erfassen. Mit diesen beiden Änderungen würde ich es machen: 's {(.)/\ Z} {$ 1}' –

Verwandte Themen