【问题标题】:Extracting the name given as an argument from command line in Perl script从 Perl 脚本的命令行中提取作为参数给出的名称
【发布时间】:2017-07-24 22:47:19
【问题描述】:

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

我是这样调用 Perl 脚本的

./perl.plx file.txt

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

【问题讨论】:

  • 试试看@ARGV,它是一个带有参数的数组。它在里面。
  • 是的,但是如果我尝试使用 $ARGV[0] 它会返回 file.txt 并且它不是字符串类型,所以我不能使用分隔符拆分。所以就像我说的,它给了我整个 file.txt 而我只需要 file 的名称。
  • @ARGV 仅包含字符串。这就是你对他们所做的。因此,如果您有$ARGV[0]file.txt,那么您可以拆分该字符串my $name = (split /\./, $ARGV[0])[0]; 以使$name 包含“文件”。
  • 非常感谢@AntonH 代码有效。我之前尝试过($name) = split('.', $ARGV[0]);,但没有成功,我不知道为什么。
  • 因为字符“.”是正则表达式中的特殊字符,表示“任意字符”。要拥有它,您需要转义它,因此,/\./

标签: bash perl shell command-line command-line-arguments


【解决方案1】:

要获取文件名,您需要从@ARGV 中提取它,然后将其拆分为点。

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

说明:

split /\./, $ARGV[0] 在一个点上分割(字符“.”是正则表达式中的一个特殊字符,它的意思是“任何字符”;要从字面上理解它,您需要对其进行转义,因此,/\./)。

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

【讨论】:

  • 为什么使用split() 而不是 File::Basename?
  • @DaveCross 因为我对 OP 的特定用例做出了快速响应(我已经花了一段时间来理解确切的问题,从我在 cmets 中的问题中可以看出)。而且,老实说,我对文件名的操作很少,以至于我往往会忘记File::
【解决方案2】:

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 的新手,尤其是命令行参数之类的东西。但是非常感谢,这很有帮助。
猜你喜欢
  • 2016-04-24
  • 2014-08-04
  • 2018-07-23
  • 1970-01-01
  • 2011-09-27
  • 2013-10-01
  • 2018-09-18
  • 1970-01-01
  • 2022-12-08
相关资源
最近更新 更多