Archive

Posts Tagged ‘perl’

[Perl] Port Scanner

五月 2nd, 2006

這是課堂上練習的程式,可以掃瞄某主機哪些 Port 有開放。
利用 Perl::Socket 建立 socket 後 connent() 主機,如果回應 true 表示連線正確 (Port 有開啟)。
使用方法:
portscan.pl <主機名稱>


#!/usr/bin/perl
use strict;
use Socket;

my $host = shift;
print "Enter scan port start:";
my $port = <>;
print "Enter scan port end:";
my $port_end = <>;

my $protocol = getprotobyname('tcp');
$host = inet_aton($host) or die "$host failed";

for (my $i = $port; $i <= $port_end; $i++) {
    socket(SOCK , AF_INET , SOCK_STREAM , $protocol) or die "socket() failed: $!";
    my $dest_addr = sockaddr_in($i , $host);
    if (connect(SOCK , $dest_addr)) {
        print "Port: $i is open\n";
    }
    close SOCK;
}

Other, 程式筆記

用文言文寫 Perl

四月 14th, 2006

詳情請看這篇討論串

真是服了這位高人,讓 Perl 可以用文言文寫
目前這個 module 已經放上 CPAN,名稱為「Lingua::Sinica::PerlYuYan
有興趣的可以試看看。
不過我想對現代人來說,英文應該是比文言文好懂吧!

Other, 程式筆記

[作業­2] 由檔案讀取成績並計算平均 - Perl

三月 14th, 2006

功能說明:

讀取成績檔內容並計算平均,最後寫入新檔。
成績資料檔:testdata.txt (檔名改為 testdata)

實作:


#!/usr/bin/perl
use strict; 

open FILE, "testdata" or die "Can not open file: $!"; 

my @lines;
foreach (<FILE>) {
    chomp;
    split(/__/);
    my @grades = split(/,/, $_[1]);
    my $total = 0;
    my $average = 0;
    foreach my $grade (@grades) {
        $total += $grade;
    }
    $average = $total/@grades;
    my $line = $_[0].'__'.$_[1].'=>'.$average."\n";
    push @lines, $line;
} 

open OUT_FILE, ">testdata2" or die "Can not open file: $!";
print OUT_FILE @lines; 

close FILE;
close OUT_FILE;

筆記:
chop 和 chomp 的差異。
這兩個都可以刪除尾端的換行字元,但使用 chomp 是比較安全的,因為 chop 會把尾端是 0 的一併刪除,造成錯誤結果。

Other, 程式筆記

[作業­1] 串列與陣列練習 - Perl

三月 14th, 2006

題目:

1. 試著把串列 (24, 33, 65, 42, 58, 24, 87) 放入陣列中,並讓使用者輸入索引值 (0…6),然後印出陣列中相對應的值。
2. 把剛剛的陣列進行排序,並且印出排序後的結果。
3. 取出陣列中大於40的所有值。
4. 將所有陣列中的值除以 10 後印出。

實作:


#!/usr/bin/perl
use strict; 

my @array = (24, 33, 65, 42, 58, 24, 87); 

while (1) {
    print "1) Select No.1 \n";
    print "2) Select No.2 \n";
    print "3) Select No.3 \n";
    print "4) Select No.4 \n";
    print 'Please enter a number: '; chomp($_ = <>); 

    if ($_ == 1) {
        while (1) {
            print "Please enter 0-6 ('q' to exit): ";
            chomp($_ = <>);
            last if ($_ eq 'q');
            print $array[$_]."\n";
        }
    } elsif ($_ == 2) {
        my @array_sort = sort(@array);
        print "$_\t" for @array_sort;
        print "\n";
    } elsif ($_ == 3) {
        my @sift = grep {$_ > 40} @array;
        print "$_\t" for @sift;
        print "\n"
    } elsif ($_ == 4) {
        my @answer = map {$_ / 10} @array;
        print "$_\t" for @answer;
        print "\n";
    }
}

Other