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 | [reply] [d/l] [select] |
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 :) | [reply] |
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
| [reply] |
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.
| [reply] |
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.
| [reply] [d/l] |
| [reply] [d/l] [select] |