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

I'm using the Net::FTP module to grab some files--so far so good. However, I don't want to save the files locally; I want to parse them after I pull them over and dump some of the contents out. All the examples I've seen of Net::FTP dump the file locally, and that's all I can get it to do. Thanks in advance!
  • Comment on Use Net::FTP to get a file and parse it without saving the file locally

Replies are listed 'Best First'.
Re: Use Net::FTP to get a file and parse it without saving the file locally
by petral (Curate) on Oct 27, 2001 at 03:47 UTC
    If you look into the get routine in FTP.pm, you'll see that it's reading a buffer, then writing it to the passed-in filehandle. If you just want to hack on it, make your own copy and save the buffer in the *ftp object and return that. Or, to be closer to "production", inherit FTP into a wrapper object and override get().

    In the end, it's probably easier to write to a temporary file and parse that. The time to write and read the local file will almost certainly be a tiny fraction of the ftp connect and transmit time.

    (update) If you really want to get into it, you could look at Net::FTPServer.  That lets you write your own site commands.  You could do "SITE PARSE filename" and let the server parse the file and send back a 200 response with the needed data.  Now, that would be an efficiency!

      p
Re: Use Net::FTP to get a file and parse it without saving the file locally
by runrig (Abbot) on Oct 27, 2001 at 02:40 UTC
    You can use IO::Scalar and pass Net::FTP the filehandle, or use IO::File's new_tmpfile() to create a file handle and pass it to Net::FTP. Update: I looked at the link in AnonyMonk's reply, then I looked at the code. With a little patching, there doesn't seem to be any real need to use fileno, unless Mr. Barr knows of a good reason not to go this route (I don't have anything to test on at the moment, so it'll have to wait if I try to do it) :-)
    Update: I think princepawn has a better idea anyway :)
      You can use IO::Scalar and pass Net::FTP the filehandle

      Probably not. Net::FTP uses fileno to get the file descriptor for the passed filehandle and an IO::Scalar won't have a file descriptor. More detail here
Use an anonymous tmp file
by Fletch (Bishop) on Oct 27, 2001 at 20:02 UTC

    If you're on a POSIX-ish OS you can always open a temporary file read/write and then immediately unlink it to remove it from the filesystem. As long as you still have a file descriptor for it you can manipulate it any way you want. Pass it to Net::FTP, use seek to rewind back to the beginning, then read the contents. As soon as you close the handle the underlying storage on disk will go away for good.

Re: Use Net::FTP to get a file and parse it without saving the file locally
by princepawn (Parson) on Oct 27, 2001 at 02:44 UTC
    I think you are answering the opposite question, Doug :-)...

    He probably wants the RETRmethod to return a filehandle from the remote FTP server and then he wants to a $filehandle->getline to read from it.

Re: Use Net::FTP to get a file and parse it without saving the file locally
by gbarr (Monk) on Oct 30, 2001 at 02:26 UTC
    If you want to read a file directly into your process and not save it to a file then call $ftp->retr instead of $ftp->get

    This will return you a file handle that you can read from just like any other.