arrays - perl丢弃映射操作中的第一个数组元素

标签 arrays perl map slice splice

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

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

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

最佳答案

split 中删除第一个元素的一种方法并且仍然能够链接更多命令将使用 grep带有状态变量:

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";

输出:

2 3 4 5 6 7

但是,我认为您试图在一行代码中做太多事情。

既然您只是在读取一个文件,我建议您使用 Perl 来 open文件而不是炮击到 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>
};

关于arrays - perl丢弃映射操作中的第一个数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25270236/

相关文章:

php从多维数组动态创建导航菜单

multithreading - 当我尝试启动不同的线程时如何避免重复作业(每个核心一个)?

Perl:创建散列的散列,最后一个键作为对数组的引用

python - mechanize 无法检索所有表单(包括一些由 js 生成的表单)

java - 存储玩家手中的扑克牌的最佳数据结构是什么?

c# - 制表符分隔的txt文件从字符串数组中读取int值

java - 从逗号分隔属性列表创建数组的更优雅的解决方案?

c++ - 为什么这个 STL 映射的条目没有在 GCC 4.5.1 中初始化?

c++ - 智能指针作为 map 键

scala - 如何在scala中检查 map 是否包含空字符串值?