Perl,我如何使用管道将多个文件合并到同一个文件处理程序中?

时间:2012-08-14 23:36:18

标签: linux perl filehandler

我一直在尝试将多个文件分配给单个文件句柄。然后从那里处理整个文件句柄以查找某个模式,然后将其写入FIN_RESULTS。

的Linux
exp文件
我/ DIR1 /结果
我/ DIR2 /结果

这是我尝试的笨拙错误

   open (FIN_RESULTS, ">", "FIN_RESULTS.txt") or die $!;

   open(RESULTS, "-|"," find my/ -name RESULTS -print0 | xargs -0 cat");
   while(<RESULTS>){
        if(/match_something/){
           do some commands;
           print FIN_RESULTS $_;
         }
close FIN_RESULTS;
close RESULTS;

但是我最终用当前目录的ls覆盖了perl脚本本身。

感谢您的帮助!!!!!我能够实现我最初的想法。

我还有第二个问题是,是否可以通过仅查看某些目录的方式实现查找? 如果我有 我/ abc_dir1 /结果
我/ dsa_dir2 /结果
我/ afx_dir3 /结果

但我只想搜索dir2和dir3。

@array1 = qw( dir2 dir3);

foreach $array1(@array1)
{ open(RESULTS, "-|"," find my/*$array1 -name RESULTS -print0 | xargs -0 cat");
}

但是我得到了这个错误,xargs:cat:由信号13终止。 所以不允许多次重新打开文件句柄。关于我能做什么的任何建议?

2 个答案:

答案 0 :(得分:3)

假设你真的想做外部发现:

open RESULTS, "-|", "find my -name RESULTS -print0 | xargs -0 cat"

应该做你想做的事。

答案 1 :(得分:3)

Perl中的open函数有两种格式:

这两个论点叫:

open (RESULTS, "|find my/ -name 'RESULTS'")

两个参数调用很简单,但是如果你碰巧有一个以垂直管道开头的文件名,你就会遇到问题。

另一种是首选的三种ARGUMENT语法:

open (RESULTS, "-|", "find my/ -name 'RESULTS'")

此语法使用第二个参数来声明您正在执行的打开类型:

">" -  Write
">>" - Append
"<"  - Read
"-|" - Read from command
"|-" - Write to command

看起来你已经把这两个搞糊涂了。


请注意:

您可以使用File::Find模块执行查找而不是Perl。

它更有效率,因为你没有启动一个单独的进程和更多独立于操作系统,因为它在Windows或Linux上的工作方式相同。