selfjungle Just another WordPress weblog

19Jul/110

perl regexp – threat whole string as one line

s - Treat the whole string as one line, so that even /./ will match a "newline" character.

#!/usr/bin/perl

my $multiline =
  "In the town where I was born,\n" .
  "Lived a man who sailed to sea,\n" .
  "And he told us of his life,\n" .
  "In the land of submarines.";

if ($multiline =~ /born,.Lived/s) {
  print "found\n";   # found in deed
} else {
  print "not found\n"; 
}
Tagged as: No Comments
20Feb/111

iwlist scan perl wrapper

The output of /sbin/iwlist scan is too much for me in most of the cases: I just want to know which WiFis are present, quality and open/passneeded state.

So here is a small perl script for it, the ESSIDs printed in descending order of quality which changed from 1-70 to 1-100.

#!/usr/bin/perl

use warnings;
use strict;

open(LIST, "/sbin/iwlist scan 2>&1 |") or die "Failed: $!\n";

my %wifis;
my $essid;
while () {
        if (/ESSID\:\"(.*)\"/) { $essid = $1; }
        elsif (/Quality=(\d*)\/70/) { $wifis{$essid}->{"quality"} = $1; }
        elsif (/Encryption key\:(\S*)/) { $wifis{$essid}->{"key"} = $1; }
}

sub by_quality {
        $wifis{$b}->{"quality"} <=> $wifis{$a}->{"quality"};
}

print "\n";
foreach $essid ( sort by_quality keys %wifis) {
        printf '%*s %*s   %-d', 30, 
                $essid, 
                6,  $wifis{$essid}->{"key"}=~/on/? "Pass" : "Open" , 
                int($wifis{$essid}->{"quality"}) / 70.0 * 100;
        print "\n";
}
print "\n";

A sample output I got at my flat:

cs0rbagomba@ramen ~ $ wifi_list 

                    gara_dlink   Pass   71
                     TP-Link01   Open   54
                           zaa   Pass   50
                         DBnet   Pass   50
                          anzo   Pass   47
                          3Com   Pass   22
                TP-LINK_9D27F4   Pass   21
                 TP-LINK_TOMEC   Pass   21
                           TNT   Pass   17
                   TimeCapsule   Pass   15
                       hpsetup   Open   14
                  Pannon Cargo   Pass   12
                       Airlive   Pass   10
                TP-LINK_DA3008   Open   10
                                 Open   8
     Szeretetre melto internet   Pass   8
                        KZSNET   Pass   8
                     CEO_iroda   Pass   8
                         Vani2   Pass   5
                      GIGABYTE   Open   4
                        csikos   Pass   2
                TP-LINK_E6395C   Pass   2
                      Dante_88   Pass   2
                        RG60SE   Open   2
                       default   Open   2
                        WIFI99   Pass   1
                         Zsoka   Pass   1
                           IKO   Pass   1

cs0rbagomba@ramen ~ $

PS: TP-Link01 Open - sharing is caring 🙂 default settings rulz

Tagged as: 1 Comment
12Aug/090

String templates with Perl

Here is a nice thing with perl.

  1. You have a string template, like an e-mail, with fields to change.
  2. This fields are stored in a CVS file.
  3. Perl changes this fields with hashes and regular expressions in no time.

Note: the field names are the keys in the hash, lines of the CVS are an array with hash refs.

#!/usr/bin/perl

use warnings;
use strict;

my @data = ();

# data.csv:
# bela,fired
# julcsi,killed
# jani,promoted

my $string_template = <<EOF;
Dear <name>,
   You have been <action>.
Br: Someone.
EOF

# CSV to hash
open FILE, "data.csv" or die $!;
while (my $line = ) {
    my %temp_hash = ();
    ($temp_hash{"name"}, $temp_hash{"action"}) = split (",", $line);
    chomp $temp_hash{"action"};
    push @data, \%temp_hash;
}
close FILE;

# replace & print
foreach (@data) {
    my $s = $string_template;
    $s=~s/<(.*?)>/$$_{$1}/g;
    print "$s\n";
}
Tagged as: No Comments