当前位置: 首页 > news >正文

perl经典hash解决问题

我们有这么一个需求:将相同姓名相同的数据合并成一行

lihanghang@DXP4800-532F:~/script$ cat file
张三 语文 74 A
张三 物理 84 B
张三 化学 91 C
张三 物理 74 D
李四 物理 99 A
李四 语文 89 B
李四 数学 78 C

实现的结果应该如下:

李四 物理 99 A 语文 89 B 数学 78 C
张三 物理 99 A 语文 89 B 数学 78 C

我通过如下代码进行实现:

lihanghang@DXP4800-532F:~/script$ cat file |perl -nale '$a=$F[0];$b=join " ",@F[1..$#F];push @{$hash{$a}},$b;END{for(keys %hash){print "$_ @{$hash{$a}}"}}'
张三 物理 99 A 语文 89 B 数学 78 C
李四 物理 99 A 语文 89 B 数学 78 C

下面我来解释如上代码的含义:

$a=$F[0];:代表将第一列数据存放到变量$a中
$b=join " ",@F[1..$#F]; 代表将除第一列的数据存放到变量$b中,并且通过列表操作符join使用空格进行分割
push @{$hash{$a}},$b; 代表将变量$b的数据存放到该数组中
END:代表前面的代码执行完毕后,进行后续代码处理
for(keys %hash):这里就牵扯到hash的操作,keys代表将哈希hash的key值取出,分别是张三、李四
{print "$_ @{$hash{$a}}"}:这里的$_就代表哈希hash对应的key:张三、李四;@{$hash{$a}},代表的就是将我们保存的整个数组给取出来

http://www.hskmm.com/?act=detail&tid=27668

相关文章:

  • LCR 129. 字母迷宫
  • Ignite3 竟然变成分布式数据库了!
  • NUIST 《程序设计基础》 实验1
  • 10.9总结
  • [MIT 6.828] Lab 1 C, Assembly, Tools, and Bootstrapping
  • WCH低功耗蓝牙系列芯片usb烧录故障排查
  • 使用docker构建.net api镜像及nginx反向代理 - binzi
  • 利用sprintf与snprintf巧妙实现数值变量转换为字符串型
  • Helmholtz-Gibbs自由能与熵弹性
  • 日志|电话号码的字母组合|子集|回溯
  • Docker实用篇(初识Docker,Docker的基本操作,Dockerfile自定义镜像,Docker-Compose,Docker镜像仓库) - a
  • ROIR 2023
  • Rust 的验证码图像识别系统设计与实现
  • 【题解】P12992 [GCJ 2022 #1C] Intranets
  • ysyx:pa3.1批处理系统
  • C 语言的验证码图像识别系统实现
  • Nginx典型流控配置示例
  • 基于 C 语言的验证码图像识别系统实现
  • oppoR9m刷Linux系统: 引导知识
  • 操作系统知识点
  • JAVA: Mybatis添加xml执行多行更新语句时报错
  • 安装Docker(CentOS安装Docker,CentOS7安装DockerCompose,Docker镜像仓库) - a
  • 上代码演示下Profile-Guided Optimization (PGO)
  • 所有文档每页的第一行居中对齐
  • 109
  • 一个有趣的网站,可以给自己生成一个奖牌:aitokenawards.com
  • 20232416 2025-2026-1《网络与系统攻防技术》实验一实验报告
  • day008
  • lzr 的区间(interval)
  • IRB-120机械臂socket通信接受上位机指令运行程序段