我是新来的脚本语言,我有一个任务说我需要从erl命令行中的给定参数中提取名称。从Perl脚本中的命令行中提取参数作为参数
我打电话的Perl脚本这样
./perl.plx file.txt
,我需要得到的只有那file
名称,而不是整个file.txt
我是新来的脚本语言,我有一个任务说我需要从erl命令行中的给定参数中提取名称。从Perl脚本中的命令行中提取参数作为参数
我打电话的Perl脚本这样
./perl.plx file.txt
,我需要得到的只有那file
名称,而不是整个file.txt
要获取文件名,你需要提取它从@ARGV
,并将其分割在点上。
my $fileName = (split /\./, $ARGV[0])[0];
阐释:“”上一个点(字符在正则表达式特殊字符,这意味着‘任何字符’
split /\./, $ARGV[0]
分片;将它从字面上看,你需要逃避它,因此,/\./
)。
(...)[0];
取第一个元素,即文件名。
为什么使用'split()'优先于File :: Basename? –
@DaveCross因为我对OP的具体使用案例(我已经花了我一段时间来理解确切的问题,正如您从我的评论中的问题中看到的那样)迅速做出响应。而且,如果我诚实的话,我操纵的文件名很少,所以我往往会忘记'File ::'。 – AntonH
Perl脚本的命令行参数出现在@ARGV
中,如perldoc perlvar
中所述。
解析文件名似乎不重要,但外观可能会引起误解。但是,Perl附带一个名为File::Basename
的模块,用于处理您可能不会立即考虑的边缘情况。简单的split
不能处理的一个边缘情况是除了最后的后缀之外,点可能出现在文件名的其他地方。
您可以在命令提示符处输入perldoc File::Basename
来查看File::Basename
的文档。
下面是一个例子:
use stict;
use warnings;
use File::Basename qw(fileparse);
my ($fname, $dirs, $suffix) = fileparse($ARGV[0], qr/\.txt/);
print "Base file name is $fname\n";
print "Suffix is $suffix\n";
print "Path to $fname$suffix is $dirs\n";
由于此模块附带的Perl,你不需要安装任何东西来使用它。利用每个Perl发行版附带的核心Perl模块,您可以利用这些工具中体现的最佳实践和调试。
谢谢。正如我所说的,我是'perl'的新手,特别是命令行参数。但是非常感谢,很有帮助。 –
试着看看'@ ARGV',它是一个带参数的数组。它在那里。 – AntonH
是的,但看看如果我尝试使用$ ARGV [0]它返回** file.txt **,它不是字符串类型,所以我不能使用分隔符分隔。所以就像我说的,它给了我整个** file.txt **,我只需要**文件**的名称。 –
'@ ARGV'只包含字符串。这是你对他们做的事情。所以如果你用'file.txt'有'$ ARGV [0]',那么你可以分割这个字符串'my $ name =(split /\./, $ ARGV [0])[0];' $ name'包含“文件”。 – AntonH