Perl学习笔记(5)glob的使用

本文详细解析了read()函数中的offset参数的含义及使用方法,提供了优化技巧,并介绍了如何利用glob函数读取目录下所有文件的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

######################read()函数中的offset参数含义
read (FILEHANBD, $var, $length, $offset)
read 函数有四个参数,最容易误解的是$offset
它的含义看官方文档,解释是:

An OFFSET may be specified to place the read data at some place in the string other than the beginning. A negative OFFSET specifies placement at that many characters counting backwards from the end of the string. A positive OFFSET greater than the length of SCALAR results in the string being padded to the required size with "\0" bytes before the result of the read is appended.


#####################优化技巧

函数的开销是很大的。
A循环地调用一个函数
B在函数中循环地进行一个操作
从性能上说,B比A好。


#####################glob的用法--读取一个目录下的所有文件
1. 比如要读取/home/globtest目录中的所有文件,可以这样写:@plFiles = glob '/home/globtest/*.*';
上面的glob的用法相当于如下
opendir(Dir,"/home/globtest");#注意这是在Linux的写法,若在Windows下,应该写为opendir(Dir,"F:\\home\\globtest");
@Files=readdir(Dir);
closedir(Dir);
foreach $Cur(@Files){
$File="/home/globtest".$Cur;
open(IN,$File);
while(<IN>){
......
                   }
close(IN);
}


2 . @many = glob "{apple,tomato,cherry}={green,yellow,red}";
把@many数组输出就能看到会显示:
1 apple=green
2 apple=yellow
3 apple=red
4 tomato=green
5 tomato=yellow
6 tomato=red
7 cherry=green
8 cherry=yellow
9 cherry=red









Perl 中的 `glob` 函数用于匹配文件名模式,通常用于获取与特定模式匹配的文件或目录列表。它可以模拟 Unix shell 的文件名扩展行为,非常适用于遍历符合特定规则的文件路径。 ### 基本用法 在 Perl 中,`glob` 可以接受一个字符串参数表示文件名通配符模式,并返回所有匹配的文件名列表。常见的通配符包括: - `*`:匹配任意数量的字符(不包括目录分隔符) - `?`:匹配单个字符 - `[...]`:匹配括号内任意一个字符 例如,以下代码将列出当前目录下所有 `.txt` 文件: ```perl my @files = glob("*.txt"); foreach my $file (@files) { print "$file\n"; } ``` ### 使用绝对路径或相对路径 可以使用绝对路径或相对路径来限定搜索范围。例如,查找 `/var/log/` 目录下的所有 `.log` 文件: ```perl my @logs = glob("/var/log/*.log"); foreach my $log (@logs) { print "$log\n"; } ``` 也可以结合变量动态构造路径: ```perl my $dir = "/var/log"; my @logs = glob("$dir/*.log"); ``` ### 递归搜索子目录 如果希望递归地搜索子目录中的文件,可以结合 `File::Find` 模块[^1],而不是仅依赖 `glob`。不过,对于简单的目录层级,可以通过嵌套 `glob` 实现: ```perl my @all_files = glob("dir/* dir/*/*"); # 匹配目录及其子目录下的文件 ``` ### 与 `bsd_glob` 的区别 Perl 内置的 `glob` 是基于旧版 Berkeley DB 的 `bsd_glob` 实现,它支持一些额外的选项。可以通过 `File::Glob` 模块导入更强大的功能,例如使用 `GLOB_BRACE` 扩展花括号匹配: ```perl use File::Glob ':glob'; my @files = bsd_glob("file{1,2,3}.txt"); ``` ### 示例:批量处理文件 以下是一个完整的示例脚本,展示如何使用 `glob` 遍历指定目录下的所有 `.pl` 文件并打印其内容: ```perl my @scripts = glob("*.pl"); foreach my $script (@scripts) { open(my $fh, '<', $script) or die "Cannot open $script: $!"; print "Contents of $script:\n"; while (my $line = <$fh>) { print $line; } close($fh); } ``` ### 注意事项 - 如果没有匹配项,`glob` 将返回空列表。 - `glob` 不会自动排除目录,需要手动检查是否为文件(可使用 `-f` 测试)。 - 在 Windows 系统中,路径分隔符应使用双反斜杠 `\\` 或正斜杠 `/`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值