Perl分裂函数为第一个单词

时间:2015-08-11 08:07:28

标签: perl split

我是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

在这里,我试图获得第二个字,但它没有给出预期的输出。

请有人建议并帮助我。

4 个答案:

答案 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";
}