为什么我的Perl正则表达式没有正确地从路径中提取文件名?

2 perl

我试图从路径解析文件名.我有这个:

my $filepath = "/Users/Eric/Documents/foldername/filename.pdf";
$filepath =~ m/^.*\\(.*[.].*)$/;
print "Linux path:";
print $1 . "\n\n";
print "-------\n";

my $filepath = "c:\\Windows\eric\filename.pdf";
$filepath =~ m/^.*\\(.*[.].*)$/;
print "Windows path:";
print $1 . "\n\n";
print "-------\n";

my $filepath = "filename.pdf";
$filepath =~ m/^.*\\(.*[.].*)$/;
print "Without path:";
print $1 . "\n\n";
print "-------\n";
Run Code Online (Sandbox Code Playgroud)

但那回归:

Linux path:

-------
Windows path:Windowsic
                      ilename.pdf

-------
Without path:Windowsic
                      ilename.pdf

-------
Run Code Online (Sandbox Code Playgroud)

我期待这个:

Linux path:
filename.pdf
-------
Windows path:
filename.pdf
-------
Without path:
filename.pdf
-------
Run Code Online (Sandbox Code Playgroud)

有人可以指出我做错了什么吗?

谢谢!:)

Tel*_*hus 7

在这种情况下,正如其他人所说,错误就是手工完成.

除此之外File::Basename,你应该看看File::SpecPath::Class.它们提供经过充分测试的跨平台方法来处理文件和目录.Path::Class特别是提供了帮助方法来处理脚本所在系统的外来文件和目录名.看起来这可能会派上用场.

#!/usr/bin/env perl
use strict;
use warnings;
use Path::Class qw/file foreign_file/;

my $nix = "/Users/Eric/Documents/foldername/filename.pdf";
my $win = 'c:\\Windows\eric\filename.pdf'; # single quote to avoid escape issues

print file($nix)->basename(), "\n";
print foreign_file('Win32', $win)->basename(), "\n";
Run Code Online (Sandbox Code Playgroud)