我正在尝试从perl中的数组获取特定元素,但代码无法正常工作
print "Enter the column numbers you want separated by comma ";
$temp=<>;
@shortdays = qw/Mon Tue Wed Thu Fri Sat Sun/;
@weekdays = @shortdays[scalar $temp];
print @weekdays;
答案 0 :(得分:2)
如果要获取数组的一部分,则必须在括号[ .. ]
内放置一个数字列表,而不是字符串。当然,一个字符串 是一个列表, 将被视为一个数字并因此转换为数字,但正如您所指出的,它只会是第一个号码。
如果您已启用use warnings
,我强烈怀疑您没有,则会收到错误:
Argument "3,4\n" isn't numeric in array slice at yourscript.pl ...
但是Perl会尽可能地将此字符串转换为数字,并提供3
。
所以,那就是你做错了。你能做什么呢?
my @nums = $temp =~ /\d+/g;
my @weekdays = @shortdays[@nums];
这将以相当简单的方式从字符串中提取整数。它还将删除使用特定分隔符(如逗号)的要求。请注意,使用全局/g
修饰符时会隐含捕获括号。
如果你绝对使用逗号,请使用split来提取数字。但请注意,这可能会留下空白和其他不需要的字符。
my @nums = split /,/, $temp;
在调试时,使用诸如
之类的语句print @weekdays;
有点混乱。我建议你这样做:
use Data::Dumper;
...
print Dumper \@weekdays;
然后你会看到数组包含的确切内容。
当然,将这两行添加到您的所有脚本中:
use strict;
use warnings;
如果你使用过这些,你就不会遇到这个问题。这两个pragma提供的信息和控制以及缩短的调试时间弥补了与使用它们相关的短学习曲线。
答案 1 :(得分:0)
这适用于我的地方:
my $temp=<>;
my @shortdays = qw/Mon Tue Wed Thu Fri Sat Sun/;
my @id=split ",",$temp;
my @weekdays;
for(@id)
{
push(@weekdays,@shortdays[$_]);
}
print @weekdays;
答案 2 :(得分:0)
这样做:
#!/usr/bin/perl -w
use strict;
print "Enter the column numbers you want separated by comma ";
my $temp=<>;
my @a1=split(/,/,$temp);
my @shortdays = qw/Mon Tue Wed Thu Fri Sat Sun/;
my @weekdays = @shortdays[@a1];
print "@weekdays";
答案 3 :(得分:0)
使用您的方法实现您想要的一种方法是
@weekdays = @shortdays[split(","$temp)];
印刷品看起来更好:
print join(' ',@weekdays), "\n";
答案 4 :(得分:0)
use strict;
use warnings;
my @shortdays = qw'Mon Tue Wed Thu Fri Sat Sun';
print "Enter the column numbers you want\n";
my $line = <STDIN>;
my @ids = $line =~ /[0-7]/g;
my @days = @shortdays[ @ids ];
print join( ', ', @days ), "\n";
由于您只需要$line
和@ids
一次,因此您可以在不使用它们的情况下离开。
# my $line = <STDIN>;
# my @ids = $line =~ /[0-7]/g;
# my @days = @shortdays[ @ids ];
my @days = @shortdays[ <STDIN> =~ /[0-7]/g ];
为什么/[0-7]/g
可能会问。
/g
将为我们提供匹配列表。由于正则表达式只匹配一个数字,因此我们不需要指定用户应该使用什么来分隔数字。实际上,(在这种情况下)用户根本不需要将它们分开。