在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中的所有数字元素。您的意思是?@johnIT
map
for
都是循环,因此您在值周围循环两次,但仍然是一对一,这就是为什么输出是相同的。并且您正在for循环中分配数组,因此它们无论如何都不会保存到数组中
my @abc = ('1234.txt', '2345.txt', '3456.txt', '4567.txt');
my @xyz = map { m/(\d+).txt/ } @abc;
print "@xyz\n";