我现在和Perl在一起。
我有以下代码,目的是提取软件名称 通过文本解析。 在这种情况下,软件名称是" ddd" :
print "Please provide full installation path (Ex:/a/b/c/ddd)\n";
my $installPath = <STDIN>;
#going to extract software name
my @soft = split '/', $installPath;
my $softName = print "@soft[4]\n";
print "$softName\n";
但是, 而不是得到&#34; ddd&#34;作为我得到的软件名称:
ddd
1
我不明白&#39; 1&#39;来自?
感谢您的帮助。
答案 0 :(得分:5)
错误来自:
my $softName = print "@soft[4]\n";
# ^^^^^
函数print
在成功时返回1
(true),它在此处返回。 1
已分配给您的变量,然后打印该变量。
print "$softName\n";
简短回顾:
my $installPath = <STDIN>; # "/a/b/c/ddd"
my @soft = split '/', $installPath; # 5th element is "ddd"
my $softName = print "@soft[4]\n"; # this prints "ddd", but "1" is returned
# ^^^^^ print returns 1, which is assigned to $softName
print "$softName\n"; # "1" is printed
你想要的是:
my $softName = $soft[4];
这只是采用数组的第5个元素。在引用单个元素时,您应该使用$
而不是@
。在引用切片时,可以使用@
,多个元素。
使用File::Basename
:
use File::Basename;
my $softName = basename($installPath);
File::Basename
是Perl 5中的核心模块。
答案 1 :(得分:0)
my $softName = print "@soft[4]\n";
是一种处理数组的坏方法,这就是造成这个问题的原因。
当引用整个数组时,应使用@
。你在这里通过引用@soft[4]
做了什么,你确实指向数组中的特定值,但是你仍然在数组上下文中引用它,并且因为$softName
是一个只需要一个标量的标量单值,perl会尽力弄清楚你想要什么,因为你根本不需要它。要明确表示您正在引用数组中的特定项而不是整个数组,请改用$
。 Perl会理解,因为您还指定了[4]
。
此外,分配给$softName
的内容不是该数组值,而是print
的结果,即状态代码(这是“1”来自的地方)。
要更正您的代码,请将该行更改为:
my $softName = $soft[4];