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

XXXX - XXXX - - XXXXXXX XX - XXXXX XX TNXXXXXXXX
XXXX - denotes a numerical data.All the data are seperated by spaces.I need to load only 2 space delimited values into my hash table. Since hash holds only a key and value.

i need to extract XXXXXXX from TNXXXXXXX and another value. I used split with space delimiter.but first 2 values are only loaded. I need to load only required value.

Please help

Replies are listed 'Best First'.
Re: split - please help
by 7stud (Deacon) on Nov 10, 2009 at 01:29 UTC

    Your explanation is difficult to understand. It would have been easier for you and clearer to someone trying to answer your questions if you had just written:

    I have this string:

    my $str = 'XXXX - AAAA - - XXXXXXX XX - XXXXX XX TNBBBBB ';

    ...and I want to end up with this hash:

    my $data = ( 'keyA' => 'AAAAA', 'keyB' => 'BBBBB' );

    ...or whatever it is you want.

    If you have this string:

    my $str = "XXXX - 12345 - - XXXXXXX XX - XXXXX XX TN67890";

    and you want to get 12345 and 67890 into a hash, you can do this:

    use strict; use warnings; use 5.010; my $str = 'XXXX - 12345 - - XXXXXXX XX - XXXXX XX TN6789'; my @pieces = split /\s+/, $str; my $val1 = $pieces[2]; (my $val2 = $pieces[-1]) =~ s/^TN//; say $val1; say $val2; my %hash = ( 'keyA' => $val1, 'keyB' => $val2 ); say %hash; --output:-- 12345 6789 keyB6789keyA12345

      If you don't know which letters are on the front of "TN6789", or even how many letters are on the front of that string, you can change the substitution to this:

      s/^\D*//

      ...where ^ matches the start of the string, and \D matches "not a digit", and the * applies to "not a digit" and means "0 or more times". Because the * is greedy, it will match as many non-digits as it can find at the start of the string.

Re: split - please help
by bichonfrise74 (Vicar) on Nov 09, 2009 at 21:30 UTC
    There are more than one ways to do this... So, something like this?
    #!/usr/bin/perl use strict; my %record; my $a = 'XXXXval - XXXX - - XXXXXXX XX - XXXXX XX TNkeyXXXXXXX'; my ($key, $val) = $a =~ /^(\w+)\s-.*\sTN(\w+)/; $record{$key} = $val; print "Key: $key\n"; print "Value: $record{$key}\n";