2017-03-04 97 views
-4

我是新来的脚本语言,我有一个任务说我需要从erl命令行中的给定参数中提取名称。从Perl脚本中的命令行中提取参数作为参数

我打电话的Perl脚本这样

./perl.plx file.txt 

,我需要得到的只有那file名称,而不是整个file.txt

+1

试着看看'@ ARGV',它是一个带参数的数组。它在那里。 – AntonH

+0

是的,但看看如果我尝试使用$ ARGV [0]它返回** file.txt **,它不是字符串类型,所以我不能使用分隔符分隔。所以就像我说的,它给了我整个** file.txt **,我只需要**文件**的名称。 –

+1

'@ ARGV'只包含字符串。这是你对他们做的事情。所以如果你用'file.txt'有'$ ARGV [0]',那么你可以分割这个字符串'my $ name =(split /\./, $ ARGV [0])[0];' $ name'包含“文件”。 – AntonH

回答

0

要获取文件名,你需要提取它从@ARGV,并将其分割在点上。

my $fileName = (split /\./, $ARGV[0])[0]; 

阐释:“”上一个点(字符在正则表达式特殊字符,这意味着‘任何字符’

split /\./, $ARGV[0]分片;将它从字面上看,你需要逃避它,因此,/\./)。

(...)[0];取第一个元素,即文件名。

+0

为什么使用'split()'优先于File :: Basename? –

+0

@DaveCross因为我对OP的具体使用案例(我已经花了我一段时间来理解确切的问题,正如您从我的评论中的问题中看到的那样)迅速做出响应。而且,如果我诚实的话,我操纵的文件名很少,所以我往往会忘记'File ::'。 – AntonH

5

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模块,您可以利用这些工具中体现的最佳实践和调试。

+0

谢谢。正如我所说的,我是'perl'的新手,特别是命令行参数。但是非常感谢,很有帮助。 –