我是Perl编程的新手。 我正在尝试拆分功能。 这是我的代码:
#!perl;
use strict;
use warnings;
use Data::Dumper;
my @sections = ("Hard Drive", "Multi Drive");
foreach my $secname (sort @sections)
{
my $file_name=split / /, $secname;
print $file_name;
}
所以我试图只输出第二个字的输出。
输出是
22
预期输出为:
drive
drive
在这里,我试图获得第二个字,但它没有给出预期的输出。
请有人建议并帮助我。
答案 0 :(得分:5)
当您从Perl函数中获得意外行为时,您的第一步应该是阅读该函数的文档。 documentation for split
说明了这一点:
将字符串EXPR拆分为字符串列表并返回列表 列表上下文,或标量上下文中列表的大小。
因此,在标量上下文中,split
返回列表中的元素数,而不是实际列表。你的代码:
my $file_name = split / /, $secname;
在标量上下文中调用split
(因为您将结果赋给标量变量)。为了获得您想要的结果,您需要在列表上下文中调用split
。有很多方法可以实现这一目标。
# Assign to an array, take the second element
my @bits = split / /, $secname;
my $file_name = $bits[1];
# Use a list slice to only get the value that you want
my $file_name = (split / /, $secname)[1];
# Use a list assignment
my (undef, $file_name) = split / /, $secname);
答案 1 :(得分:2)
Split仅返回列表上下文中的字符串列表。
如上面的评论所述,您可以使用列表上下文来获取字符串。
例如,将它们全部存储在一个数组中:
my @split_string = split / /, $secname;
my $wanted = $split_string[1]; # get the string you want (here, second)
如果您以后不需要它们,您也可以使用匿名数组, 为自己保存一个变量:
my $wanted = (split / /,$secname)[1];
perl中的大多数函数都是上下文相关的,即返回不同的值,无论是在列表中还是在标量上下文中调用,当你想到它时,返回值通常是非常明智的,但它需要一些时间来习惯。
答案 2 :(得分:1)
由于@Сухой27有commented且来自split doc:
将字符串EXPR拆分为字符串列表,并返回列表上下文中的列表,或标量上下文中列表的大小。
所以你可以通过创建列表上下文来做到这一点:
my @sections = ("Hard Drive", "Multi Drive");
foreach my $secname (sort @sections)
{
my ($first, $file_name) = split / /, $secname;
print $file_name, "\n";
}
或者如果您不想要额外的变量,只需将其定义为undef
:
my (undef, $file_name) = split / /, $secname;
或分配到数组中:
my @file_name = split / /, $secname;
print $file_name[1], "\n";
或者你可以使用list slice:
my $file_name = (split / /, $secname)[1];
答案 3 :(得分:0)
split将标量转换为列表。您试图拆分列表的每个值。
输出22
结果是因为它显示列表中的标量总数。
例如
@ar = qw(1 4);
$aa = @ar;
print $aa;
结果为2
。同样的想法是你的问题上升。
因此,您将拆分值存储到数组中。并通过数组的索引键打印预期的输出。
试试这个
use strict;
use warnings;
use Data::Dumper;
my @sections = ("Hard Drive", "Multi Drive");
foreach my $secname (sort @sections)
{
my @file_name=split / /, $secname;
print $file_name[1],"\n";
}