我正在尝试从 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;
如果要获取数组的一部分,则必须将数字列表放在括号内[ .. ]
,而不是字符串。当然,一个字符串是一个列表,它将被视为一个数字,因此转换为一个数字,但正如您所指出的,它只是第一个数字。
如果你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 提供的信息和控制以及减少的调试时间足以弥补与使用它们相关的较短的学习曲线。
这在我的地方有效:
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;
像这样做:
#!/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";
使用您的方法实现您想要的一种方法是
@weekdays = @shortdays[split(","$temp)];
这样打印效果更好:
print join(' ',@weekdays), "\n";
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
会给我们一个匹配列表。由于正则表达式只匹配一个数字,我们不需要指定用户应该使用什么来分隔数字。实际上,(在这种情况下)用户甚至根本不需要将它们分开。