我正在编写一个脚本,它从目录中获取一个文件列表,打开每个文件,然后搜索包含扩展名为.zip的文件名的行.然后我想从行中删除文件名.这是我的代码:
foreach (@fnames) {
chomp ($_);
open FILE, '<', "$_";
@archives = grep { /.+?\.zip/ } <FILE>;
foreach (@archives) {
if ($_ =~ /("|>)(.+?)("|<)/) { push @files, $2; }
}
}
Run Code Online (Sandbox Code Playgroud)
我从中提取数据的文件将包含双引号或尖括号之间的.zip文件名.此代码没有返回任何内容,但我知道文件名存在.如果我在终端上做grep我可以看到所有这些,但是Perl中的grep并没有给我任何东西.有任何想法吗?
可能出错了:
@fnames 是空的,因为你没有显示代码中的一些错误.open FILE, ...失败,但由于你没有检查它的返回值open,它会无声地失败,因此你不知道它.使用open ... or die $!ZIP,输入中有大写字母,并且不要/i在grep中使用ignore case选项.顺便说一句,.+?在开始时是相当无用的,除非你期望不需要的字符串开头
.zip(即它只检查之前至少有一个字符).也:
open.my @archives并且my @files在适当的词汇范围内将有助于确保您获得并保留您想要的数据.$_ =~ /.../可以简单地编写/.../以获得更好的可读性(IMO).("|>)是一种多余的说法[">].grep是冗余处理.你可以简单地做:while (<FILE>) {
push @files, /[">](.*\.zip)["<]/ig;
}
Run Code Online (Sandbox Code Playgroud)
简而言之:
my @files;
foreach my $file (@fnames) {
chomp $file;
open my $fh, '<', $file or die $!;
while (<$fh>) {
push @files, /[">](.*\.zip)["<]/ig;
}
}
print "File names found: @files\n";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
95 次 |
| 最近记录: |