2010-03-20 25 views

Trả lời

8

Nếu bạn chắc chắn rằng có là một trong/ở cuối tất cả các thời gian, bạn có thể sử dụng chức năng Chop:

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

Nếu bạn không chắc chắn bạn có thể làm:

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

congrats trên danh tiếng 10k – Zerobu

+0

@ Zerobu: Cảm ơn bạn thân :) – codaddict

+0

Sử dụng vô dụng nhóm chụp và nếu chuỗi chứa các dòng mới, nó cũng sẽ bị hỏng. – Qtax

12

Với một biểu thức chính quy làm: $test =~ s/\/$//

Ngoài ra, nếu bạn chắc chắn ký tự cuối cùng sẽ là một dấu gạch chéo, bạn có thể sử dụng chức năng chop: chop $test

+3

Tôi muốn viết '$ test = ~ s [/ $] []' để dễ đọc. – Quentin

+1

Sử dụng neo \ z để có được kết thúc tuyệt đối của chuỗi. –

+1

Xin lỗi vì đã làm phiền, nhưng có vẻ như regex này không hoạt động cho tất cả các thư mục, * ngoại trừ * khi sử dụng 'thư mục gốc' * ->/<-.Nó sẽ chỉ đơn giản là loại bỏ đường dẫn gốc, mà không phải là quá tốt trong một số trường hợp, bởi vì nó sẽ bắt đầu với một dấu gạch chéo (paradoxon?). ;-) – Semo

8

Bạn có thể sử dụng toán tử s/// thay:

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

Tâm trí tuyệt vời nghĩ như nhau .... – justintime

+1

Sử dụng neo \ z để có được kết thúc tuyệt đối của chuỗi. –

8

Cá nhân tôi sẽ nói lại điều này để tránh hỗn hợp "\" và "/"

$test =~ s|/$|| 

Nếu bạn sử dụng "|" bạn không cần phải trích dẫn "/"

+1

Sử dụng neo \ z để có được kết thúc tuyệt đối của chuỗi. –

0

đoạn này sẽ chăm sóc dấu slashes, ngoại trừ thư mục gốc:

#!/usr/bin/perl 
 

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

Dưới đây là cách hoạt động:

Phần đầu tiên của cụm từ thông dụng - s {(. +)/\ Z} - xác định nhóm trong ngoặc đơn (). Điều này được tham chiếu bởi \ 1 trong phần thứ hai của cụm từ thông dụng - {\ 1}. Trong nhóm này, tôi đã xác định một hoặc nhiều ký tự - + - theo sau ngay lập tức bằng dấu gạch chéo, sau đó là đầu cuối tuyệt đối của chuỗi - \ z.

Các biểu hiện thường xuyên tiết kiệm tất cả mọi thứ trong phạm vi khung, sau đó được sử dụng như \ 1 trong đặc tả thay thế

này hoạt động rất giống với một chiến lược sed điển hình, tức là (phần thứ hai, về cơ bản.):

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

tôi hy vọng điều này là trợ giúp cho bạn.

+0

Rất vui khi thấy một địa chỉ liên quan đến vấn đề thực tế của thư mục gốc. Hai ý tưởng bổ sung: 1) Tôi tin rằng cách thay thế được đề xuất để thay thế ảnh chụp trong phần thay thế bằng "$" thay vì "\", mặc dù cả hai đều hoạt động. 2) Có thể hiệu quả hơn khi chỉ chụp nhân vật ngay trước dấu /, thay vì có khả năng rất nhiều ký tự. Kết hợp cả hai thay đổi đó, tôi sẽ thực hiện: 's {(.)/\ Z} {$ 1}' –

Các vấn đề liên quan