Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW

Re: Re: Re: Can I match a range from an array?

by rchiav (Deacon)
on Aug 03, 2001 at 19:05 UTC ( #102003=note: print w/replies, xml ) Need Help??

in reply to Re: Re: Can I match a range from an array?
in thread Can I match a range from an array?

Well that's not quite what I was referring to.

Here's what I understand:
-You have a line that has a number at the end of it that signifies something.
-You want to print something depending on the number.
-I'm assuming that what you want to print is the name of the cell site.

Soooo.. What I would do is the following..

#!/usr/bin/perl -w use strict; #putting the line in question into $_ for this example. $_ = "Cell ID for Last Cell: MCC: 310 MNC: 64 LAC: x'44D CI: x'503E +"; #create our hash of 'site codes' => 'text to print' my %cells = ('207B' => 'Miami', '432F' => 'Buffalo', '443R' => 'Whatever you want for cell site 443R', '503E' => 'Portland, OR' ); if (/CI: x'(\w+)$/) { print "Cell site is $cells{$1}.\n"; }
Now.. if the regex confuses you, I'd suggest spending a little time with perlre. What this basically does it grabs the last part of the string that you said is variable. Then it takes that and looks it up in the hash. Now this is a very simple example, without error checking and the other various things that you should have in there. You need to take into account if there's no entry in the hash... and how you deal with that.

Hope this helps..

Replies are listed 'Best First'.
Re: Re: Re: Re: Can I match a range from an array?
by dragonchild (Archbishop) on Aug 03, 2001 at 19:21 UTC
    (If you want to know more about a function mentioned here, click on it and you'll get the documentation on that specific function, including syntax and suggested uses.)

    Another idea here is to do something along the lines of the following:

    foreach my $line (@the_cell_site_lines) { my @data = split /\s+/, $line; # If you want the cellnumber, do the following... my $cell_number = $data[12]; $cell_number = substr($cell_number, 2); # Do something here with the cellnumber you now have. }
    The first thing I noticed is that the lines are regular and stuff is separated by spaces. This immediately made me think of split and using an array of values to figure out what was going on.

    Once that happens, I can grab the 13th item (remember that Perl array indices start at 0, so it's the 12th index). That item is "x'503E". I have to get rid of the first 2 characters, so I use substr. I could've used a regex (something like $cell_number =~ s/^x'//;), but why use a cannon when all you need is a pistol? substr is faster and clearer.

    Creating a hash of cellnumber => cellname is an extremely good idea, and I suggest you do that. There are ways of putting that into a separate file and bringing it in either using do or require. If you want help with those, ask. (Oh - when you first do your testing, don't type the entire hash in - just use maybe 5-10 entries, to make sure your code works. Then, add the rest.)

    /me wants to be the brightest bulb in the chandelier!

Re: Re: Re: Re: Can I match a range from an array?
by brassmon_k (Sexton) on Aug 03, 2001 at 22:33 UTC
    OK That's really neat, I wasn't thinking at it like that. I kind of thought that's what you wanted me to do but wasn't sure, I see now though. However, one final problem, OK, I don't know what any of the lines will be so how do I tell the script that if it matches one of the numbers to print out the correct value from the hash.

    You're telling it to print out Miami for $cells{1} but I don't know what the cell site line is going to be it might be 503E so I'd have to tell it somehow to print out the name when you find the number in the record block and in the hash so it knows what key/value to print. So my dilemma is really the printing and matching.

    I can do both for a single match no problem. However I have to do 387 of them because there are 387 different Cell site names. So how can I tell the if statement this.

    Well your regex will match any cell site line I know that, and if it's under the "if (lastHeading = "MSTerminating)" then it will only evaluate in an "MSTerminating" record block so that one is good and now the final problem which I haven't been able to solve. How do I tell the script to print out the line without knowing what number will be matched. In my current script I don't know why "$_" won't print, but that's the only way I can guess to print out something when you don't know what the answer will be but you know what you want to do with the answer.

    The Brassmon_k
      OK.. you really should look at perlre. The regex /CI: x'(\w+)$/ looks for "CI: x'<one or more word characters><end of line>".
      The parens around the \w+ capture that to the variable "$1". And that is going to be the code you're looking for. So in my example.. $1 == "503E". And for any line, it's going to equal whatever is between "x'" and the end of the line.

      Hope that clairifies things. And also.. read all of perlre. All of this will be much clearer, and you're probably completely rewrite your script as a result of learning what you can do with regular expressions.


        That's it....THAT'S IT!!! WOOOHOOO!
        IT WORKS!

        Praise rchiav for his great knowledge!

        It does exactly as I want it to now.
        With the hash, your "if statement" and some of my code
        it works! It now prints off the lines I tell it to based off the MSISDN\phone number from the appropriate/matching record block title and matches the correct "Cell ID" number\key from the hash and associates the key with it's value and prints the correct name.

        I understood the regex and I understand them and I knew what you wrote. I will look at "perlre". The thing is I can write em but some of the stuff I don't know how it works. For instance you put the $ at the end of your pattern match. I knew what every part of your regex meant except the "$". I think it means match at end of line (not sure though). Then I didn't know that $1 became the variable for the numbers. I thought it was referring to the "key" in the hash so it would print off the first value of the first key in the hash.
        The Brassmon_k

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (4)
As of 2018-09-23 13:49 GMT
Find Nodes?
    Voting Booth?
    Eventually, "covfefe" will come to mean:

    Results (191 votes). Check out past polls.

    • (Sep 10, 2018 at 22:53 UTC) Welcome new users!