1

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

Linux
exp 文件
my/dir1/RESULTS
my/dir2/RESULTS
等。

这是我一次尴尬的尝试

   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 脚本本身。

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

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

但我只想搜索 dir2 和 dir3。

@array1 = qw( dir2 dir3);

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

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

4

2 回答 2

3

假设你真的想做外部查找:

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

应该做你想做的。

于 2012-08-15T00:03:37.933 回答
3

openPerl中的函数有两种格式:

两个参数调用:

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

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

另一种是首选的三参数语法:

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

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

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

看来你把这两个弄混了。


只是一个说明:

您可以使用File::Find模块来代替 Perl 进行查找。

它更有效,因为您没有启动单独的进程并且更独立于操作系统,因为它在 Windows 或 Linux 上以相同的方式工作。

于 2012-08-15T18:08:04.497 回答