Perl Script Help


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Perl Script Help
# 1  
Old 08-25-2011
Perl Script Help

If I am out of line for asking this please just let me know.

I can barely survive when it comes to shell scripting so when I have to deal with perl I petty much just fail to succeed.

Any help would be appreciated.

Currently the section of the code is as follows;
Code:
# Read and process the config file
while ( <CFG> ) {
        chomp;
        next if m/^#/;
       if ( m/^\s*([a-zA-Z][a-zA-Z0-9.]+)\s+(\d+\.\d+\.\d+\.\d+)/ ) {
                $zone=$1;
                $ip=$2;
        } else { next; }

        if ( $zones{$zone} == 1 ) {
                print "skipping Duplicate zone: $zone\n";
                next;
        }

        create_zone($zone,$ip);
        $zones{$zone}=1;
}

create_zone("crap","127.0.0.1");

A sample entry in the config file is;

Code:
3.crakatxr.com  12.245.255.67
01o02n8cf01.com 12.254.235.231
543-lwp-277.mxtosehp.com        12.222.246.212

The line of code in red is what I am asking about. Could you tell me what output from the line of code in red would yield on the three examples given. I think I understand that the $zone will be the first field and $ip will be the second. I am sure you could do some sort of print statement to get that info but I just don't know how.

The issue is it appears that the script is ignoring the line in the config with a "-" dash in it.

If I way off base on this I will not be surprised.

Thanks for your time on this issue.

Justin
# 2  
Old 08-26-2011
Quote:
Originally Posted by juredd1
...
Code:
# Read and process the config file
while ( <CFG> ) {
        chomp;
        next if m/^#/;
       if ( m/^\s*([a-zA-Z][a-zA-Z0-9.]+)\s+(\d+\.\d+\.\d+\.\d+)/ ) {
                $zone=$1;
                $ip=$2;
        } else { next; }

        if ( $zones{$zone} == 1 ) {
                print "skipping Duplicate zone: $zone\n";
                next;
        }

        create_zone($zone,$ip);
        $zones{$zone}=1;
}

create_zone("crap","127.0.0.1");

A sample entry in the config file is;

Code:
3.crakatxr.com  12.245.255.67
01o02n8cf01.com 12.254.235.231
543-lwp-277.mxtosehp.com        12.222.246.212

The line of code in red is what I am asking about. Could you tell me what output from the line of code in red would yield on the three examples given.
...
The regular expression in red will *NOT* match any of the 3 lines, as the following adaptation of your script into a Perl one-liner shows:

Code:
$
$ # display the content of the config file
$ cat config.txt
3.crakatxr.com  12.245.255.67
01o02n8cf01.com 12.254.235.231
543-lwp-277.mxtosehp.com        12.222.246.212
$
$
$ # run a Perl one-liner that has the relevant regex, on the config file
$
$ perl -lne 'if (m/^\s*([a-zA-Z][a-zA-Z0-9.]+)\s+(\d+\.\d+\.\d+\.\d+)/){print "Matched: zone = $1, ip = $2"} else {print "No match"}' config.txt
No match
No match
No match
$
$

As to why it does not match - you'd see it quickly if you break down the regex:

Code:
/^\s*([a-zA-Z][a-zA-Z0-9.]+)\s+(\d+\.\d+\.\d+\.\d+)/ => Match a line in the   input stream if:

(1)  ^  = At the beginning of the line, (there exist)
(2)  \s* = Zero or more occurrences of whitespace i.e. blanks or tabs
(3)  [a-zA-Z] = followed by a single upper or lower case letter of the English alphabet
(4)  [a-zA-Z0-9.]+ = followed by one or more occurrences of any combination of uppercase letters, lowercase letters, digits from 0 to 9, the period (.) character

[
Remember the matched result of (3) appended by (4) above and assign it to a "special" variable called "$1"
]

(5)  \s+  = followed by one or more occurrences of whitespace i.e. blanks or tabs
(6)  \d+\.\d+\.\d+\.\d+ = 
one or more occurrences of digits (0-9) followed by the period (.) character, 
followed by
one or more occurrences of digits (0-9) followed by the period (.) character,
followed by
one or more occurrences of digits (0-9) followed by the period (.) character,
followed by
one or more occurrences of digits (0-9)

[
Remember the matched result of (6) above and assign it to the next "special" variable called "$2"
]


If a match does happen, then assign the value of "$1" to $zone, and "$2" to $ip.

Now, as you can see, token no. (3) above would fail because none of the 3 lines in your config file have a upper or lower case English letter at the beginning. (All the 3 lines have digits at the beginning.)

Quote:
...
The issue is it appears that the script is ignoring the line in the config with a "-" dash in it.
...
As to how this can be fixed. You may want to be explicit and specify all the characters that you could encounter in the "zone" value, in your regex.

Here's one way to do it:

Code:
$
$ # display the content of the config file
$ cat config.txt
3.crakatxr.com  12.245.255.67
01o02n8cf01.com 12.254.235.231
543-lwp-277.mxtosehp.com        12.222.246.212
$
$
$ # run a Perl one-liner that has the relevant regex, on the config file
$ perl -lne 'if (/^\s*([a-zA-Z0-9.-]+)\s+(\d+\.\d+\.\d+\.\d+)/){print "Matched: zone = $1, ip = $2"} else {print "No match"}' config.txt
Matched: zone = 3.crakatxr.com, ip = 12.245.255.67
Matched: zone = 01o02n8cf01.com, ip = 12.254.235.231
Matched: zone = 543-lwp-277.mxtosehp.com, ip = 12.222.246.212
$
$

I've specified all the different characters that I expect in "zone", in the first token of the regex which is within parenthesis. That gets stored in special variable "$1". The remaining part of the regex is identical to yours.

Of course, there are other ways of writing the regex as well, depending on how strict you want your matching pattern to be. You could even use the split function and thereby avoid the regex. As it usually happens with Perl, there's more than one way to do it.

tyler_durden
This User Gave Thanks to durden_tyler For This Post:
# 3  
Old 08-26-2011
Tyler,

Thank you very much for the your time spent explaining this to me is the detail that you did. I don't understand it all yet but will review to see if I can make this work. I want to understand it and not just plug the code in. I do appreciate it.

Justin
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

PERL: In a perl-scripttTrying to execute another perl-script that SETS SOME VARIABLES !

I have reviewed many examples on-line about running another process (either PERL or shell command or a program), but do not find any usefull for my needs way. (Reviewed and not useful the system(), 'back ticks', exec() and open()) I would like to run another PERL-script from first one, not... (1 Reply)
Discussion started by: alex_5161
1 Replies

2. Shell Programming and Scripting

Excuting perl script from within a perl script with variables.

Not sure what I am doing wrong here, but I can print the list with no issue. Just a blank screen with the 'do'. #!/usr/bin/perl open FILE, "upslist.txt"; while ($line=<FILE>){ if ($line=~/^(.*?),(.*?)$/){ #print "ups:$1 string:$2\n"; do 'check_snmp_mgeups-0.1.pl -H $1 -C $2'; } ... (1 Reply)
Discussion started by: mrlayance
1 Replies

3. Shell Programming and Scripting

Perl : embedding java script with cgi perl script

Hi All, I am aware that html tags can be embedded in cgi script as below.. In the same way is it possible to embed the below javascript in perl cgi script ?? print("<form action="action.htm" method="post" onSubmit="return submitForm(this.Submitbutton)">"); print("<input type = "text"... (1 Reply)
Discussion started by: scriptscript
1 Replies

4. Shell Programming and Scripting

executing perl script from another perl script : NOT WORKING

Hi Folks, I have 2 perl scripts and I need to execute 2nd perl script from the 1st perl script in WINDOWS. In the 1st perl script that I had, I am calling the 2nd script main.pl =========== print "This is my main script\n"; `perl C:\\Users\\sripathg\\Desktop\\scripts\\hi.pl`; ... (3 Replies)
Discussion started by: giridhar276
3 Replies

5. Shell Programming and Scripting

calling a perl script with arguments from a parent perl script

I am trying to run a perl script which needs input arguments from a parent perl script, but doesn't seem to work. Appreciate your help in this regard. From parent.pl $input1=123; $input2=abc; I tried calling it with system("/usr/bin/perl child.pl $input1 $input2"); and `perl... (1 Reply)
Discussion started by: grajp002
1 Replies

6. Shell Programming and Scripting

HELP on Perl array / sorting - trying to convert Korn Shell Script to Perl

Hi all, Not sure if this should be in the programming forum, but I believe it will get more response under the Shell Programming and Scripting FORUM. Am trying to write a customized df script in Perl and need some help with regards to using arrays and file handlers. At the moment am... (3 Replies)
Discussion started by: newbie_01
3 Replies

7. Shell Programming and Scripting

Perl :How to print the o/p of a Perl script on console and redirecting same in log file @ same time.

How can i print the output of a perl script on a unix console and redirect the same in a log file under same directory simultaneously ? Like in Shell script, we use tee, is there anything in Perl or any other option ? (2 Replies)
Discussion started by: butterfly20
2 Replies

8. Shell Programming and Scripting

perl/unix: script in command line works but not in perl

so in unix this command works works and shows me a list of directories find . -name \*.xls -exec dirname {} \; | sort -u | > list.txt but when i try running a perl script to run this command my $query = 'find . -name \*.xls -exec dirname {} \; | sort -u | > list.txt';... (2 Replies)
Discussion started by: kpddong
2 Replies

9. Shell Programming and Scripting

[Perl] Accessing array elements within a sed command in Perl script

I am trying to use a script to replace the header of each file, whose filename are stored within the array $test, using the sed command within a Perl script as follows: $count = 0; while ( $count < $#test ) { `sed -e 's/BIOGRF 321/BIOGRF 332/g' ${test} > 0`; `cat 0 >... (2 Replies)
Discussion started by: userix
2 Replies

10. Shell Programming and Scripting

Perl: Run perl script in the current process

I have a question regarding running perl in the current process. I shall demonstrate with an example. Look at this. sh-2.05b$ pwd /tmp sh-2.05b$ cat test.sh #! /bin/sh cd /etc sh-2.05b$ ./test.sh sh-2.05b$ pwd /tmp sh-2.05b$ . ./test.sh sh-2.05b$ pwd /etc sh-2.05b$ So... (10 Replies)
Discussion started by: vino
10 Replies
Login or Register to Ask a Question