如何在具有相同扩展名的多个输入文件上运行Perl脚本?

时间:2009-11-11 00:18:51

标签: perl command-line

如何在具有相同扩展名的多个输入文件上运行Perl脚本?

 perl scriptname.pl file.aspx

我希望它能够运行当前目录中的所有aspx文件

谢谢!

7 个答案:

答案 0 :(得分:7)

在你的Perl文件中,

 my @files = <*.aspx>;
 for $file (@files) {

      # do something.

 }

<*.aspx>称为glob

答案 1 :(得分:3)

您可以使用通配符

将这些文件传递给perl 你脚本中的

foreach (@ARGV){
    print "file: $_\n";
    # open your file here...
       #..do something
    # close your file
}

在命令行上

$ perl myscript.pl *.aspx

答案 2 :(得分:2)

您可以显式使用glob来使用shell参数,而不必依赖shell行为。

for my $file ( map {glob($_)} @ARGV ) { 
   print $file, "\n";
};

您可能需要控制文件名重复的可能性,并扩展了多个参数。

答案 3 :(得分:1)

如果你在Linux机器上,你可以尝试这样的事情。

for i in `ls /tmp/*.aspx`; do perl scriptname.pl $i; done

答案 4 :(得分:0)

对于包含-n-p的简单单行,您需要

perl -i~ -pe 's/foo/bar/' *.aspx

-i~表示要修改每个目标文件,并将原始文件保留为备份,并在文件名中添加~后缀。 (省略后缀以不留下备份。但是如果你还在学习或试验,那么这是一个坏主意;当你完成后删除备份比从备份中恢复原件要小得多。你搞砸了。)

如果您的Perl代码对于单行代码来说过于复杂(或者只是有用而且可以重用),显然可以将-e '# your code here'替换为scriptname.pl ...但是可能会重构scriptname.pl所以它接受文件名参数列表,只需使用scriptname.pl *.aspx在当前目录中的所有*.aspx文件上运行它。

如果您需要递归目录结构并查找具有特定命名模式的所有文件,find实用程序很有用。

find . -name '*.aspx' -exec perl -pi~ -e 's/foo/bar/' {} +

如果您的find不支持-exec ... +尝试使用-exec ... \;,但速度较慢并启动更多进程(每个文件一个,而不是尽可能少处理所有文件文件)。

要仅扫描某些目录,请将.(用当前目录命名)替换为要检查的空格分隔的目录列表,甚至使用find自行查找目录(然后也许探索-execdirfind选择的每个目录中做一些事情,使用复杂,复杂,关键业务,可能是find选项谓词的秘密列表。)

也许还可以探索find2perl在Perl中本地执行此目录递归。

答案 5 :(得分:0)

例如,处理perl scriptname.pl *.aspx *.asp

在linux中:shell扩展了通配符,因此perl可以只是

for (@ARGV) {
  operation($_); # do something with each file
}

Windows不会扩展通配符,因此请在perl中的每个参数中展开通配符,如下所示。然后for循环以与上面相同的方式处理每个文件

for (map {glob} @ARGV) {
  operation($_); # do something with each file
}

例如,这将在Windows

下打印扩展列表
print "$_\n" for(map {glob} @ARGV);

答案 6 :(得分:-2)

您也可以传递您拥有aspx文件的路径并逐个阅读。

#!/usr/bin/perl -w

use strict;

my $path = shift;
my @files = split/\n/, `ls *.aspx`;

foreach my $file (@files) {
        do something...
}