Tại sao tái tạo bánh xe? Sử dụng các mô-đun File::Basename:
use File::Basename;
...
$file = basename($path);
Tại sao $file=$path=~s/.*\///;
không hoạt động?
=~
đã tăng precedence hơn =
Vì vậy
$file = $path =~s/.*\///;
được xử lý như sau:
$file = ($path =~s/.*\///);
mà làm việc thay thế trong $path
và giao hoặc 1
(nếu thay thế xảy ra) hoặc ''
(nếu không có thay thế xảy ra).
gì bạn muốn là:
($file = $path) =~s/.*\///;
đó gán giá trị của $path
-$file
và sau đó thực hiện việc thay thế trong $path
.
Nhưng một lần nữa có rất nhiều vấn đề với giải pháp này:
Đó là không chính xác. Tên tệp trong các hệ thống dựa trên Unix (không chắc chắn về Windows) có thể chứa dòng mới. Tuy nhiên, .
theo mặc định không khớp với dòng mới. Vì vậy, bạn sẽ phải sử dụng một modifier s
để .
phù hợp xuống dòng cũng như:
($file = $path) =~s/.*\///s;
Quan trọng nhất là nó không phải là xách tay vì nó là giả /
là tách con đường mà không phải là trường hợp với một số nền tảng như Windows (sử dụng \
), Mac (sử dụng :
). Vì vậy, sử dụng các mô-đun và để cho nó xử lý tất cả những vấn đề này cho bạn.
Đồng ý. Nói chung tốt hơn bằng cách sử dụng một mô-đun như thế này hơn là một regex vì nó là nền tảng chéo. – justintime
Cũng lưu ý rằng File :: Basename là một mô-đun lõi và luôn nằm trong Perl 5 nên không cần phải cài đặt. – mscha
Trang người đàn ông về File :: Basename, khuyến cáo sử dụng phương pháp 'fileparse' cho tác vụ này, vì" [tên cơ sở] KHÔNG luôn trả về phần tên tệp của đường dẫn như bạn mong đợi " – jutky