clarkk12 has asked for the wisdom of the Perl Monks concerning the following question:

I used find2perl to generate a snippet of perl code. This works, I get the expected results to the html form. However, I really want the results in a file, which will be overwritten each time the code is run (not append).

I get back the expected files with path, but its to my browser. I've been through the Find::File man pages, and the find2perl pages and can't figure out how to get this to a file.

This is the actual find command I want to run:

find ./caldata -exec grep -n -l "Katie" '{}' \; > ./tmp/kc2

(I couldn't get find2perl to like the > ./tmp/kc2 part)

Here is what I have:

$person_sel = $values{"person_sel"}; use File::Find (); # for the convenience of &wanted calls, including -eval statements: use vars qw/*name *dir *prune/; *name = *File::Find::name; *dir = *File::Find::dir; *prune = *File::Find::prune; sub wanted; sub doexec ($@); # Traverse desired filesystems File::Find::find({wanted => \&wanted}, $calPath); sub wanted { doexec(0, 'grep','-l',$person_sel,'{}') } 0 use Cwd (); my $cwd = Cwd::cwd(); sub doexec ($@) { my $okCw shift; my @command = @_; # copy so we don't try to s/// aliases to consta +nts for my $word (@command) { $word =~ s#{}#$name#g } if ($ok) { my $old = select(STDOUT); $| = 1; print "@command"; select($old); return 0 unless <STDIN> =~ /^y/; } chdir $cwd; #sigh system @command; chdir $File::Find::dir; return !$?; }
Thanks in advance to anyone who can give me some pointers.

Replies are listed 'Best First'.
Re: Help with redirecting Find::File results
by chromatic (Archbishop) on Oct 27, 2004 at 18:39 UTC

    It prints to STDOUT. Either run it from the command line and redirect the output or edit it to open a file and print to that file.

      Where in my code might I "edit it to open a file and print to that file"? I'm new to perl, and have been banging my head at this problem for three days. I know how to use OPEN, I just don't know how to incorporate the code I have.

      Thanks for your input, I'd appreciate any other help you can provide.

        All you have to do is change where you print in doexec(). Suppose you've opened OUTPUT earlier in the program. Change your subroutine to something like:

        sub doexec { my $okCw shift; my @command = @_; # copy so we don't try to s/// aliases to consta +nts for my $word (@command) { $word =~ s#{}#$name#g } if ($ok) { print OUTPUT "@command"; return 0 unless <STDIN> =~ /^y/; } chdir $cwd; #sigh system @command; chdir $File::Find::dir; return !$?; }