谁帮我解释下这个Perl脚本,越详细越好
#!/usr/bin/perlsubsubdir{@tmp=();$rootdir=shift;opendir(DIR,$rootdir);@tmp=readdir(DI...
#!/usr/bin/perl
sub subdir {
@tmp=();
$rootdir=shift;
opendir(DIR, $rootdir);
@tmp = readdir(DIR);
$start=@dir;#目录数组的旧终点
for (local $i=2;$i<=@tmp-1;$i++) #从2开始是要跳过./和../目录
{
if (-d $rootdir.'/'.$tmp[$i]) {push (@dir,$rootdir.'/'.$tmp[$i]);}
if (-f $rootdir.'/'.$tmp[$i]) {push (@file,$rootdir.'/'.$tmp[$i]);}
}
$end=@dir;#目录数组的新终点
closedir(DIR);
@tmp=();
#print $start."-";
#print $end."\n";
}
subdir($ARGV[0]);
#start=end说明经过上一条(下一条)命令,数组没有变化(开始兼结尾)
if ($start ne $end) {for ($k=$start;$k<=$end-1;$k++){subdir($dir[$k]);}}
#foreach $f (@file){
#chomp $f;
#print "$f\r\n";
#}
#exit;
foreach $f (@file){
chomp $f;
open F,$f or next;
while(<F>){
if($_=~ m/$ARGV[1]/){
print "$f\r\n";last;
}
}
close F;
} 展开
sub subdir {
@tmp=();
$rootdir=shift;
opendir(DIR, $rootdir);
@tmp = readdir(DIR);
$start=@dir;#目录数组的旧终点
for (local $i=2;$i<=@tmp-1;$i++) #从2开始是要跳过./和../目录
{
if (-d $rootdir.'/'.$tmp[$i]) {push (@dir,$rootdir.'/'.$tmp[$i]);}
if (-f $rootdir.'/'.$tmp[$i]) {push (@file,$rootdir.'/'.$tmp[$i]);}
}
$end=@dir;#目录数组的新终点
closedir(DIR);
@tmp=();
#print $start."-";
#print $end."\n";
}
subdir($ARGV[0]);
#start=end说明经过上一条(下一条)命令,数组没有变化(开始兼结尾)
if ($start ne $end) {for ($k=$start;$k<=$end-1;$k++){subdir($dir[$k]);}}
#foreach $f (@file){
#chomp $f;
#print "$f\r\n";
#}
#exit;
foreach $f (@file){
chomp $f;
open F,$f or next;
while(<F>){
if($_=~ m/$ARGV[1]/){
print "$f\r\n";last;
}
}
close F;
} 展开
展开全部
在指定目录下,遍历所有文件包括子目录下文件,寻找关键词,并打印出来!
指定目录为第一个参数,关键词为第二个,比如该脚本名为 find.pl
用法应该就是 find.pl<空格>目录名<空格>文件名。 有段时间没用perl了,大概说一下吧,不对的见谅阿。
#!/usr/bin/perl ##类unix系统下告知系统这是perl脚本 前提是需要文件为可执行
sub subdir { ##找到和这个 { 向对应的 } 这里是 过程 subdir 大体功能是把目录存入数组@dir
##把文件存入数组@file
@tmp=(); ##声明临时数组@tmp
$rootdir=shift; ##从参数中读取目录名,就是subdir($ARGV[0])里的$ARGV[0].
opendir(DIR, $rootdir);##打开目录
@tmp = readdir(DIR);##读取目录,把目录下的文件和子目录名字都读进取。只是名字哦!
$start=@dir;#目录数组的旧终点 ##设置标志位,用于在主程序中判断目录是否为空
for (local $i=2;$i<=@tmp-1;$i++) #从2开始是要跳过./和../目录
{ ##开始对@tmp下的内容进行分类整理
if (-d $rootdir.'/'.$tmp[$i]) {push (@dir,$rootdir.'/'.$tmp[$i]);} #是目录(文件夹)放进@dir数组
if (-f $rootdir.'/'.$tmp[$i]) {push (@file,$rootdir.'/'.$tmp[$i]);}##是文件,放进@file数组
}
$end=@dir;#目录数组的新终点 ##设置另一个标志位,用途同$start。
closedir(DIR); #关闭句柄
@tmp=();# 临时数组清空 ,为了后续读取子目录下的内容做准备。
#print $start."-";
#print $end."\n";
}
subdir($ARGV[0]); ##这里是主程序开始的地方,@ARGV数组包含环境变量,就是执行的时候
##跟在文件名后面的东西开始第一个就是$ARGV[0],第二个是ARGV[1],以此类推.....
#start=end说明经过上一条(下一条)命令,数组没有变化(开始兼结尾)
if ($start ne $end) {for ($k=$start;$k<=$end-1;$k++){subdir($dir[$k]);}}
##上面这条的意思就是,如果该目录下无子目录那就算了,如果有,用subdir挨个处理子目录
##个人认为这个写的有问题,因为如果$ARGV[0]所指目录包含2层以上(含两层)子目录的话,
##脚本就做不好完全的遍历....具体改进方法可参考下面文件读取时的做法..
#foreach $f (@file){
#chomp $f;
#print "$f\r\n";
#}
#exit;
foreach $f (@file){##此时@file数组中保存的全部都是文件名
chomp $f; ##除去文件名后的 换行符
open F,$f or next; ##打开文件句柄,打不开这个就去试试打开下一个.....
while(<F>){ ##读取文件,一行一行来,读取到EOF标志是while循环结束
if($_=~ m/$ARGV[1]/){ ##如果当前行中有和 $ARGV[1]中需要查询字符一样的字符
print "$f\r\n";last; ##打印出文件名
}
}
close F; ##关闭文件句柄
}
----------------------------------差不多就是这样的了,perl用起来还是很方便的就是需要记的东西相对多点儿,而且一点不对,不好调试,这个脚本写的不是很规范,虽然语法检查没问题。但是运行起来貌似有死循环,最后只好kill掉了..........目前只能看这么多了
指定目录为第一个参数,关键词为第二个,比如该脚本名为 find.pl
用法应该就是 find.pl<空格>目录名<空格>文件名。 有段时间没用perl了,大概说一下吧,不对的见谅阿。
#!/usr/bin/perl ##类unix系统下告知系统这是perl脚本 前提是需要文件为可执行
sub subdir { ##找到和这个 { 向对应的 } 这里是 过程 subdir 大体功能是把目录存入数组@dir
##把文件存入数组@file
@tmp=(); ##声明临时数组@tmp
$rootdir=shift; ##从参数中读取目录名,就是subdir($ARGV[0])里的$ARGV[0].
opendir(DIR, $rootdir);##打开目录
@tmp = readdir(DIR);##读取目录,把目录下的文件和子目录名字都读进取。只是名字哦!
$start=@dir;#目录数组的旧终点 ##设置标志位,用于在主程序中判断目录是否为空
for (local $i=2;$i<=@tmp-1;$i++) #从2开始是要跳过./和../目录
{ ##开始对@tmp下的内容进行分类整理
if (-d $rootdir.'/'.$tmp[$i]) {push (@dir,$rootdir.'/'.$tmp[$i]);} #是目录(文件夹)放进@dir数组
if (-f $rootdir.'/'.$tmp[$i]) {push (@file,$rootdir.'/'.$tmp[$i]);}##是文件,放进@file数组
}
$end=@dir;#目录数组的新终点 ##设置另一个标志位,用途同$start。
closedir(DIR); #关闭句柄
@tmp=();# 临时数组清空 ,为了后续读取子目录下的内容做准备。
#print $start."-";
#print $end."\n";
}
subdir($ARGV[0]); ##这里是主程序开始的地方,@ARGV数组包含环境变量,就是执行的时候
##跟在文件名后面的东西开始第一个就是$ARGV[0],第二个是ARGV[1],以此类推.....
#start=end说明经过上一条(下一条)命令,数组没有变化(开始兼结尾)
if ($start ne $end) {for ($k=$start;$k<=$end-1;$k++){subdir($dir[$k]);}}
##上面这条的意思就是,如果该目录下无子目录那就算了,如果有,用subdir挨个处理子目录
##个人认为这个写的有问题,因为如果$ARGV[0]所指目录包含2层以上(含两层)子目录的话,
##脚本就做不好完全的遍历....具体改进方法可参考下面文件读取时的做法..
#foreach $f (@file){
#chomp $f;
#print "$f\r\n";
#}
#exit;
foreach $f (@file){##此时@file数组中保存的全部都是文件名
chomp $f; ##除去文件名后的 换行符
open F,$f or next; ##打开文件句柄,打不开这个就去试试打开下一个.....
while(<F>){ ##读取文件,一行一行来,读取到EOF标志是while循环结束
if($_=~ m/$ARGV[1]/){ ##如果当前行中有和 $ARGV[1]中需要查询字符一样的字符
print "$f\r\n";last; ##打印出文件名
}
}
close F; ##关闭文件句柄
}
----------------------------------差不多就是这样的了,perl用起来还是很方便的就是需要记的东西相对多点儿,而且一点不对,不好调试,这个脚本写的不是很规范,虽然语法检查没问题。但是运行起来貌似有死循环,最后只好kill掉了..........目前只能看这么多了
AiPPT
2024-09-19 广告
2024-09-19 广告
随着AI技术的飞速发展,如今市面上涌现了许多实用易操作的AI生成工具1、简介:AiPPT: 这款AI工具智能理解用户输入的主题,提供“AI智能生成”和“导入本地大纲”的选项,生成的PPT内容丰富多样,可自由编辑和添加元素,图表类型包括柱状图...
点击进入详情页
本回答由AiPPT提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询