Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re^2: Warning is right or not ?

by Anonymous Monk
on Dec 21, 2012 at 07:43 UTC ( #1009884=note: print w/ replies, xml ) Need Help??


in reply to Re: Warning is right or not ?
in thread Warning is right or not ?

You are right, but the cause of returning more than single scalar was a typo, so its fixed now.

(BTW: Is the latter behavior really intended?) Do you mean $count++ ?

If so, I need the previous value of @data, so if you can tell me a better solution I'll use it.

Because if I try the code as

if ( grep( /^$airline/, @data) ) { return $data[-2]; }
it returns wrong value if there are additional notes in the definition file


Comment on Re^2: Warning is right or not ?
Download Code
Replies are listed 'Best First'.
Re^3: Warning is right or not ?
by AnomalousMonk (Abbot) on Dec 21, 2012 at 22:07 UTC
    ... I need the previous value of @data ...

    If you mean you need to return the element in the  @data array immediately prior to the first element in the array that matches the string passed into the function, I think I would use something like this (Update: an empty string is returned if no match):

    >perl -wMstrict -le "print get_IATA('bar'); ;; sub get_IATA { my ($airline) = @_; ;; my @data = qw(fee fie foe foo barbell boff); ;; for my $i (1 .. $#data) { return $data[$i - 1] if $data[$i] =~ m{ \A \Q$airline\E }xms; } return ''; } " foo

    Update: Here's a variation that returns every element in the  @data array immediately prior to an element in the array that matches the string passed into the function. An empty list is returned if no match.

    >perl -wMstrict -le "printf qq{'$_' } for get_IATA('bar'); ;; sub get_IATA { my ($airline) = @_; ;; my @data = qw(fee fie yyy barfly foe fum zzz barbell foo); ;; return map { $data[$_] =~ m{ \A \Q$airline\E }xms ? $data[$_ - 1] : () } 1 .. $#data ; } " 'yyy' 'zzz'

      Thank you very much for your tips. With my irregual data I had to change my code( and data) and your tips helped alot.

      In my check table (csv), I have 3 character codes(ICAO) and their equivalent 2 character codes(IATA) and descriptions. At first, IATA was at first column so I needed previous element of the array when the key was found. But after having an example of irregular ICAO code, which has 2 characters that matches its IATA code, the code didn't help since Perl stops after the first matching. And that IATA code is used three times in the table ( 1 ICAO, 2 IATA)

      Then I changed IATA and ICAO columns' order and changed the code with your help and now it works. Though it may be clumsy, i think its pretty clear.

      --$hash{'AirIATA'}= get_IATA($airlineLoc,$hash{'Airline'}) ; ------------------------------------------------------- sub get_IATA { my $file = shift; my $airline = shift; my @data; open(my $fh, '<', $file) or die "Can't read file '$file' [$!]\ +n"; while (my $line = <$fh>) { my @fields = split(/;/, $line); push @data, @fields; } close($fh); my @results= map { $data[$_] =~ m{ \A \Q$airline\E }xms ? $data[$ +_ + 1] : () } 1 .. $#data; if ($#results>1) { return $results[1]; } elsif ($#results>0) # Do I need a second check, like <2 ? { return $results[0]; } else { print "Airline $airline has no definition in $file fil +e\n"; exit; # Program should stop if there is no match } }

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1009884]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (9)
As of 2015-07-30 06:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (270 votes), past polls