繁体   English   中英

如何使用 Perl 从路径中提取文件名?

[英]How can I extract a filename from a path using Perl?

我有一个从数据库填充的 Perl 变量。 它的名字是$path 我需要获取另一个变量$file ,它只有来自路径名的文件名。

我试过了:

$file = $path =~ s/.*\///;

我对 Perl 很陌生。

为什么要重新发明轮子? 使用File::Basename模块:

use File::Basename;
...
$file = basename($path);

为什么$file=$path=~s/.*\\///; 不工作?

=~ 优先级高于=

所以

$file = $path =~s/.*\///;

被视为:

$file = ($path =~s/.*\///);

它在$path中进行替换并分配1 (如果发生替换)或'' (如果没有发生替换)。

你想要的是:

($file = $path) =~s/.*\///;

它将$path的值分配给$file ,然后在$path中进行替换。

但是这个解决方案也有很多问题:

  1. 这是不正确的。 基于 Unix 的系统(不确定 Windows)中的文件名可以包含换行符。 但是. 默认情况下不匹配换行符。 因此,您必须使用s修饰符,以便. 也匹配换行符:

     ($file = $path) =~s/.*\\///s;
  2. 最重要的是,它不可移植,因为它假设/是路径分隔符,这在某些平台(如 Windows(使用\\ )、Mac(使用: )时并非如此)。 因此,使用该模块并让它为您处理所有这些问题。

use File::Basename 

查看以下链接以获取有关其工作原理的详细说明:

http://p3rl.org/File::Basename

我认为最好的方法是——

use File::Basename;

my $file_name = basename($0);

所以变量$file_name将具有您的脚本的名称

Path::Class 一开始可能看起来有点矫枉过正——制作文件和目录路径的对象——但它确实可以在复杂的脚本中得到回报,并提供很多好处,当你被范围蔓延退回到角落时,它会防止出现意大利面。 File::Spec在第一个示例中用于解决路径的乐趣。

use warnings;
use strict;
use Path::Class qw( file );
use File::Spec;

# Get the name of the current script with the procedural interface-
my $self_file = file( File::Spec->rel2abs(__FILE__) );
print
    " Full path: $self_file", $/,
    "Parent dir: ", $self_file->parent, $/,
    " Just name: ", $self_file->basename, $/;

# OO                                    
my $other = Path::Class::File->new("/tmp/some.weird/path-.unk#");
print "Other file: ", $other->basename, $/;
$url=~/\/([^\/]+)$/;
print "Filename $1\n";

就这么简单:

$path =~ /.*[\/\\](.*)/;    # will return 1 (or 0) and set $1
my $file = $1;              # $1 contains the filename

要检查文件名是否可用,请使用:

$file = $1 if $path =~ /.*[\/\\](.*)/;

图案:

.*[\/\\](.*)
| |     |
| |     \- at last there is a group with the filename
| \------- it's the last / in linux or the last \ in windows
\--------- .* is very greedy, so it takes all it could

使用例如 https://regex101.com/ 来检查正则表达式。

从路径中提取文件名对于 Unix 和 Windows 文件系统都非常容易,无需任何包:

my $path;
$path = 'C:\A\BB\C\windows_fs.txt';     # Windows
#$path = '/a/bb/ccc/ddd/unix_fs.txt';    # Unix

my $file =  (split( /\/|\\/, $path))[-1];
print "File: $file\n";

# variable $file is "windows_fs.txt"  for Windows
# variable $file is "unix_fs.txt"     for Unix

逻辑非常简单:创建一个包含路径的所有元素的数组并检索最后一个。 Perl 允许使用从数组末尾开始的负索引。 索引“-1”对应于最后一个元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM