Perl中read函数用法及if块内$h变量赋值逻辑疑问
Perl脚本中$h变量逻辑说明
这个变量的运行逻辑和looks_like_number函数没有任何关联,你产生困惑的核心原因是不熟悉Perlread函数的参数规则。
核心知识点:read函数的写入特性
Perl的read是内置的文件读取函数,调用格式为:read(FILEHANDLE, $buffer, $length, [$offset])
其中第二个参数$buffer是用来接收读取内容的标量缓冲区:
- 函数执行时会直接把从文件句柄读到的字节内容写入这个传入的标量变量,不需要提前给变量显式赋值
- 函数返回值是实际读取到的字节长度,读取失败时返回
undef
对应代码的运行逻辑
你贴的代码片段里相关逻辑逐行解释如下:
if (open(IN, "/dev/$a[4]")) # 打开容量大于100G的块设备 { my $h; # 声明词法变量$h作为读缓冲区,作用域仅限当前if代码块 # 先判断是否成功读到4字节,再判断读到的内容是不是"EFI"标识 if (read(IN, $h, 4) == 4 && $h eq 'EFI') { print "/dev/$a[4]\n"; # 匹配到EFI分区就输出设备路径 } close(IN); }
- 这里的判断做了两层校验:首先确认从设备开头完整读取了4字节没有截断,其次校验这4字节是EFI分区的特征标识
EFI,以此筛选出系统中的EFI分区设备 my $h;声明的是块内词法变量,每次循环打开新设备时都会重新初始化,不会出现跨循环的变量污染,完全符合use strict的变量校验规则,所以脚本可以正常运行无报错。
注:这类把未赋值标量当缓冲区传给IO函数的写法在旧Perl脚本中非常常见,除了
read之外,sysread、recv等输入类函数也会直接修改传入的标量参数存储读取结果,不需要提前用=赋值。
内容的提问来源于stack exchange,提问作者Hardguy
相关产品推荐
相关产品推荐

