http://www.perlmonks.org?node_id=89003


in reply to Variable number of words/fields in a line/record

Sorry to reply to my own post, but I think that I could state my problem a bit more clearly.

How can I capture each "element" of a line, and store it in a variable, regardless of how many elements are in the line? So, if LINE_1 contains 9 elements, I need to create 9 variables. If it contains 10, I need to create 10...and so on.

I know that if someone reads this, they're gonna ask what I'm really trying to do:

The program will grab each element as described, ie:
conduit permit tcp|host|192.168.1.1|eq|139|host|192.168.2.1
then, it will ignore "conduit" and "permit", and insert the remaining variables into a database.

Replies are listed 'Best First'.
Re: UPDATE: Variable number of words/fields in a line/record
by jeroenes (Priest) on Jun 18, 2001 at 10:58 UTC
    Don't use variables, but an array or hash. Would do something like:
    while( <> ){ split; splice @_, 0, 2; #removes first two elements store_elements_function( @_ ); #sub to store the remainder }
    If you really want to name the items, use a hash. Define the names first:
    my @std_keys = qw/proto .../; my @ext_keys = qw/name9 name10 name11/; .. #and in loop: my %hash; if( @_ < 9 ){ @hash{@std_keys} = @_; } else { @hash{(@std_keys, @ext_keys)} = @_; } print "My proto is: ",$hash{'proto'},"\n"; ...
    Hope this helps. You can read up on it in perldata.

    Jeroen
    "We are not alone"(FZ)