如何扩展适用于一个文件的程序,以对目录中的每个文件执行操作

时间:2016-10-20 08:14:07

标签: perl

我写了一个程序来检查文本文件中的拼写错误或未使用的数据。现在,我想使用相同的过程检查目录中的所有文件。

以下是我为第一个文件运行的几行脚本:

open MYFILE, 'checking1.txt' or die $!;
@arr_file = <MYFILE>;
close (MYFILE);

open FILE_1, '>text1' or die $!;
open FILE_2, '>Output' or die $!;
open FILE_3, '>Output2' or die $!;
open FILE_4, '>text2' or die $!;

for ($i = 0; $i <= $#arr_file; $i++) {

    if ( $arr_file[$i-1] =~  /\s+\S+\_name\s+ (\S+)\;/ ) {
           print FILE_1 "name : $i  $1\n";
    }

...

我只使用一个文件checking1.txt来执行脚本,但现在我想对all_file_directory

中的所有文件执行相同的过程

3 个答案:

答案 0 :(得分:2)

使用数组存储文件名,然后循环它们。在循环结束时重命名输出文件或将它们复制到某处,以便在下一次迭代中不会被覆盖。

my @files = qw(checking1.txt checking2.txt checking3.txt checking4.txt checking5.txt);
foreach my $filename (@files){
    open (my $fh, "<", $filename) or die $!;
    #perform operations on $filename using filehandle $fh
    #rename output files    
}

现在要完成上述工作,您需要确保文件位于同一目录中。如果没有,那么:

  • @files数组
  • 中的每个文件提供绝对路径
  • 遍历目录以查找所需文件

如果要遍历目录,请参阅:

此外:

并给出变量的正确名称。例如:

@arr_file = <MYFILE>;

应该写成

@lines = <MYFILE>;

答案 1 :(得分:2)

您在同一目录中的所有文件意味着将程序放在目录中然后运行它。

要从目录中读取文件,请使用glob

#include<stdio.h>

void sort(const void* d1, const void* d2)
{
    int a = *(int*)d1;
    int b = *(int*)d2;

    if (a > b)return 1;
    if (b > a)return -1;
    return 0;
}

int main()
{
    int abc[3];

    printf("Enter three numbers: ");
    scanf("%d%d%d", &abc[0], &abc[1], &abc[2]);

    qsort(abc, 3, sizeof(int), sort);

    printf("%d\n", abc[2] - abc[1]);

    while (1){}

    return 0;
}

答案 2 :(得分:0)

  1. 为什么不use File::Find?使目录中的文件更改非常容易。只需提供开始目录。 它并不总是最佳选择,取决于您的需求,但几乎每次我需要同时修改大量文件时它都很有用且简单。

  2. 另一种选择是循环浏览文件,但在这种情况下,您必须提供文件名。

  3. 由于mkHun指出glob可能会有所帮助。