Perl - 基本STDIN问题

时间:2014-04-17 14:04:52

标签: linux perl stdin

我现在和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;来自?

感谢您的帮助。

2 个答案:

答案 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];