在perl中,在数组的每个元素中映射一个字符串,并在另一个数组中赋值
我有一个数组在perl中,在数组的每个元素中映射一个字符串,并在另一个数组中赋值,perl,Perl,我有一个数组@abc,其中的值是'1234.txt','2345.txt','3456.txt','4567.txt'。 我想从这个数组中获取所有数值,并将它们放入另一个数组中,比如说@xyz。 我有正则表达式可以这样做,但是使用map函数我无法获得另一个数组中的数值。 下面的代码是我正在尝试map函数的部分的snipet: use strict; use warnings; my @abc = ('1234.txt', '2345.txt', '3456.txt', '4567.txt');
@abc
,其中的值是'1234.txt','2345.txt','3456.txt','4567.txt'。
我想从这个数组中获取所有数值,并将它们放入另一个数组中,比如说@xyz
。
我有正则表达式可以这样做,但是使用map函数我无法获得另一个数组中的数值。
下面的代码是我正在尝试map函数的部分的snipet:
use strict;
use warnings;
my @abc = ('1234.txt', '2345.txt', '3456.txt', '4567.txt');
foreach my $abc(@abc) {
my @xyz = map(m/(\d*).txt/, $abc);
print "@xyz\n";
}
使用此代码,我得到以下输出:
1234
2345
3456
4567
但这不是我尝试长宁打印“@xyz\n”时使用的数组到打印“$xyz[0]\n”;当输出应仅为1234时,我仍然获得相同的输出。我猜输出的形式是字符串而不是数组
任何人都可以帮助获取数组中的这些值。问题是,您对每个值都使用
map
,而不是对整个列表调用一次。相反,请尝试这样做,它将一次构建您的@xyz
数组,并保留四个数字/字符串(它们将是字符串,但如果您尝试使用它们,perl会将它们转换为整数):
问题是数组
@xyz
将只包含一个值,因为for
循环一次只包含一个数组元素。然后通过map
语句将单个标量的值分配给for循环内声明的数组,这意味着循环完成时数组将超出范围,并且在循环迭代之间不会保存任何值
my @abc = ('1234.txt', '2345.txt', '3456.txt', '4567.txt');
foreach my $abc(@abc) { # using one array element at the time
my @xyz = map(m/(\d*).txt/, $abc); # single string, never saved
print "@xyz\n"; # only prints one value
}
由于@xyz
仅包含一个值,因此打印整个数组或仅打印第一个元素没有任何区别
如果您希望这样做,则必须将数组移出循环,并使用推送
,而不是赋值=
(后者将覆盖)。并删除map语句,因为它对于单个字符串是多余的。另外,将print语句置于循环之外,否则我们将多次打印某些值
my @abc = ('1234.txt', '2345.txt', '3456.txt', '4567.txt');
my @xyz; # declare outside loop
foreach my $abc(@abc) {
push @xyz, $abc =~ m/(\d*).txt/;
}
print "@xyz\n"; # print only after all values have been collected
但这不是最好的方法。如果我们使用map
,for循环是多余的。for
和map
都围绕列表/数组中的值循环,因此在这种情况下重复两次没有任何意义。该解决方案已由和在评论中给出:
my @abc = ('1234.txt', '2345.txt', '3456.txt', '4567.txt');
my @xyz = map { m/(\d+).txt/ } @abc;
print "@xyz\n";
此外,在收集数字时,您应该使用
\d+
,否则您将获得某些字符串的空字符串误报。例如,字符串foo.txt
将返回空字符串“
”。如果希望整个文件名都是数字,则应使用行首定位:/^(\d+)\.txt/
。此外,句点
应该转义,因为它是正则表达式元字符。请尝试my@xyz=map{/(\d+)\.txt$/}@abc代码>而不是循环感谢回复Håkon Hægland。实际上,我想使用foreach,因为我需要在代码的后面打印数组@abc的每个元素,这就是我使用foreach循环的原因。请告诉我,如果使用foreach,我如何获取数组xyz中的所有数字元素。您的意思是?@johnITmap
和for
都是循环,因此您在值周围循环两次,但仍然是一对一,这就是为什么输出是相同的。并且您正在for循环中分配数组,因此它们无论如何都不会保存到数组中
my @abc = ('1234.txt', '2345.txt', '3456.txt', '4567.txt');
my @xyz = map { m/(\d+).txt/ } @abc;
print "@xyz\n";