perl 在映射操作中丢弃第一个数组元素

2024-01-12

我开始利用 Perl Map 的强大功能,但遇到了一个我找不到答案的问题。基本上我正在解析一个 unix 命令的返回,该命令有一个我不需要的标题行,然后每个项目有 2 行信息。目前,我正在这样做:

(undef, @ret) = map { [split /\n/] } split(/(?:Host: )/, `cat /proc/scsi/scsi`);

这可以很好地跳过标题并为每个“有用”文本行提供一个数组元素。但是,我想构建一个散列,除了那条额外的行之外,我知道如何做。那么我怎样才能在一行代码中忽略第一个数组元素,以允许我创建哈希呢?我正在考虑切片或拼接的某个地方,但我需要知道主机上的分割创建的数组的大小(这可能吗?)。我想我也可以做 (undef,undef, %ret) = map {...} 但如果这可以通过切片或拼接来完成,那学习如何做就太好了。


从 a 中删除第一个元素的一种方法split http://perldoc.perl.org/functions/split.html并且仍然能够链接更多命令来使用grep http://perldoc.perl.org/functions/grep.html带有状态变量:

use strict;
use warnings;

my @lines = do {
    my $line = 0;
    grep {++$line > 1} split /\n/, "1\n2\n3\n4\n5\n6\n7\n"
};

print "@lines";

Output:

2 3 4 5 6 7

然而,我认为你试图在一行代码中做太多事情。

由于看起来您只是在读取文件,因此我建议您使用 Perl 来open http://perldoc.perl.org/functions/open.html文件而不是外壳cat.

假设您的键/值分隔符是冒号,以下是我建议您构建逻辑的方式:

use strict;
use warnings;
use autodie;

my %hash = do {
    open my $fh, '<', '/proc/scsi/scsi';
    <$fh>; # Skip Header Row
    map {chomp; split /:/, $_, 2} <$fh>
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

perl 在映射操作中丢弃第一个数组元素 的相关文章