in reply to Re: Tie::RefHash
in thread Tie::RefHash

Looked at that information and still not clear. Would the Tie.pm help me at all in this situation: i have 6 tab delimited text files, all with a common field (column). i need to pull information from each, based on that one field. should i open each one, pull the appropriate row into an array, etc, or would the Tie.pm do anything to automate this in any way? or is it's intended use totally unrelated to what i'm doing?

Replies are listed 'Best First'.
(bbfu)Re: Re: Re: Tie::RefHash
by bbfu (Curate) on Jan 30, 2001 at 06:54 UTC

    I think that you'd be better off using something like DBD::CSV or Text::CSV.

    tie is intended to be used to tie a Perl variable (scalar, array, or hash) with a subroutine so that, to the user, it seems that they're using a regular Perl variable but every time they access that variable they are, in reality, invoking a subroutine call that handles the data in a form that is maybe totally different from normal Perl variables.

    The reason that tie might be used with database modules is that it provides a simple, intuitive interface to the data. For example, the user can get a scalar variable tied to a DB field that, every time they read the value of that variable, the DB module looks up the field data for the next record in the DB. Or they could receive a tied hash that looks up field values by name instead of the user having to remember what order the fields are in and without the DB having to read an entire record into memory at once.

    So, while you could build a tied variable interface to the files, you'll still have to build the routines to read that data in from the files. And for that, you'd probably want to go with one of the two CSV modules I mentioned above or, perhaps, one of the DBI modules...

    Forgive me if I've rambled a bit and am not making any sense. It happens some times!  =) Let me know if that helps (or doesn't)!

    bbfu

      i looked up both of those modules, but the server i'm working on doesn't have them, and it's next to impossible to get anything added, so it's a moot point. but the Text::CSV looked like it might have helped. thanks!

        Well, I'm not totally sure about this so don't get mad if I'm wrong. ;)

        You say you have a hard time getting modules installed at the site your on, but do you have a write access to a local (user) directory? If so, you might be able to install the module (Text::CSV) into that local directory and then modify the @INC in your program via use lib.

        I know for sure that there are one or two modules that require some other things to be installed in specific places or to have some C programs compiled but I don't think Text::CSV is one of them. You'll have to look at the documentation or try installing it to be sure.

        I like to put the module in the same directory as the script, and then in the script's code add the lines:

        use lib '.'; use Text::CSV;

        Of course, you should note that for a module like Text::CSV, you'll have to create a subdirectory named Text and put the module file (named CSV.pm) in it (standard convention, of course) but the install should do that for you.

        Anyway, I hope this helps!

        bbfu
        Seasons don't fear The Reaper.
        Nor do the wind, the sun, and the rain.
        We can be like they are.

Re: Re: Re: Tie::RefHash
by eg (Friar) on Jan 30, 2001 at 06:50 UTC

    I don't think tying is going to help you the way you hope it will.

    You're still going to have to write the methods or subs that open the text files and search through and aggregate your data (which is what you were trying to avoid.) All tying does is give you a nice, clean, familiar interface to use (although nothing you can't do outside of tying.) In other words, if you tie a hash, you'd be able to access your data like

    tie %hash, 'MyHashClass', @files; my @data = $hash{$key}; # convienent!

    but somewhere in the background you'll still need something like

    package MyHashClass; use strict; use Carp; use Tie::Hash; @MyHashClass::ISA = qw/ Tie::StdHash /; sub FETCH { my ($self, $key) = @_; my @ret = (); foreach my $filename ( @files ) { open( F, $filename ) or croak "$!"; while( <F> ) { if ( matches ) { push @ret, $_; } } close F; } return @ret; } 1;

    Hmm. Actually this is horribly inefficient and you wouldn't want to do it this way. You'd probably open all of the files when the hash is tied or something.

    But I think I'm getting off track. I guess my point is that tying isn't going to save you any work.

    If you have a lot of data or you're going to have to search through it very often, it's worth combining and/or sorting your files (or converting to a database like Berkeley DB (DB_File)) so you can search them more efficiently. Otherwise doing what you say (open each one, pull the appropriate row, etc.) will work.

      yeah, i wish i had db available on the server, but i don't. thanks for your help. i won't pursue the Tie pm thanks.