我正在尝试编写Automator服务,因此我可以将其放入gui中的右键菜单中。
我有一个txt文件的文件路径,并且有一个类似命名的文件,仅在文件扩展名中有所不同。这可以是pdf或jpg,或者可能是任何其他扩展,无法事先知道。如何将文件路径获取到另一个文件(只有一个这样的文件)?
$other_name =~ s/txt$/!(txt)/;
$other_name =~ s/ /?/g;
my @test = glob "$other_name";
在Bash中,我只是打开extglob选项,并将末尾的“txt”更改为“!(txt)”和do glob扩展。但我甚至不确定它是否可用于perl。由于文件路径总是有空格(它位于一个近根目录名称中),这进一步使事情变得复杂。我已经阅读了http://perldoc.perl.org/functions/glob.html处的glob()文档,并尝试了引用的每个变体(上面的示例代码显示了我放弃后的尝试,我只是完全删除了所有空格)。
似乎我能够将模块放在脚本中,所以这不一定是裸perl(只是运行测试)。
是否有一种优雅或至少简单的方法来实现这一目标?
答案 0 :(得分:3)
您可以将文件名中的所有内容解压缩到扩展名,然后使用它运行一个glob并过滤掉不需要的.txt。这是需要使用双引号来保护glob中的模式的情况之一,用于空格。
use warnings;
use strict;
use feature qw(say);
my $file = "dir with space/file with spaces.txt";
# Pull the full name without extension
my ($basefname) = $file =~ m/(.*)\.txt$/;
# Get all files with that name and filter out unneeded (txt)
my @other_exts = grep { not /\.txt$/ } glob(qq{"$basefname.*"});
say for @other_exts;
有这样的玩具结构
dir space/ file with spaces.pdf file with spaces.txt
输出
dir space/file with spaces.pdf
此recent post在相关的全球范围内有更多内容。
答案 1 :(得分:2)
Perl不允许在glob中使用 not substring 构造。您必须找到具有相同名称和任何扩展名的所有文件,并删除以.txt
这个程序显示了这个想法。它将原始文件名拆分为词干部分和后缀部分,并使用词干形成圆形图案。 grep
会删除以原始后缀
如果有多个候选者,它只选择第一个匹配的文件名。如果找不到匹配的文件,$other_name
将设置为undef
原始文件名应作为命令行上的参数
结果打印到STDOUT;我不知道您的右键菜单需要什么
如果您正在使用包含空格的文件路径,则必须使用行use File::Glob ':bsd_glob'
,因为您似乎
use strict;
use warnings 'all';
use File::Glob ':bsd_glob';
my ($stem, $suffix) = shift =~ /(.*)(\..*)/;
my ($other_name) = grep ! /$suffix$/i, glob "$stem.*";
$other_name =~ tr/ /?/;
print $other_name, "\n";
答案 2 :(得分:-1)
这是一个基于File::Basename核心模块
的示例use File::Basename;
my $fullname = "/path/to/my/filename.txt";
my ($name, $path, $suffix) = fileparse($fullname, qw/.txt/);
my $new_filename = $path . $name . ".pdf";
# $name --> filename
# $path --> /path/to/my/
# $suffix --> .txt
# $new_filename --> /path/to/my/filename.pdf