免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 37271 | 回复: 20
打印 上一主题 下一主题

perl原创精华文章! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-06-10 11:55 |只看该作者 |倒序浏览
欢迎朋友们提供自己的原创文章,

请不要回复非原创文章的帖子,

谢谢你喜欢并支持perl版 :)     

十分感谢各位作者:  

论坛徽章:
0
2 [报告]
发表于 2003-06-10 11:59 |只看该作者

perl原创精华文章!


[1] Blowfish模块
作者:hoowa


总在这里问东西也不能不给这里的朋友点东西
这是我刚刚做的,给你资料你整理一下就可以用了:)

Blowfish是一个强壮的可变长度由8个字节到56个字节(448位钥匙)的加密技术。
只有在双方持有相同的钥匙情况下才有可能解密数据。
他照比DES算发具有更高的安全性(目前无法破解)。
而且他的加密速度是最快的!
这里不讲他如何做的算法。我们只讲Crypt::Blowfish如何使用。

安装:
win32系统:
输入ppm命令,然后输入install Crypt::Blowfish回车等待安装结束,或search blowfish查看列表。

Linux下请到www.cpan.org下载模块,编译安装需要gcc

此模块是使用的最小8字节长度,最大56字节长度,在编写钥匙的时候如果不符合这个范围那么就将出现错误。
在加密的时候,需要将所加密的字符穿分割成为多个8字节长度的字符串,如果不够8字节可以填充空格等特殊字符。

以下是举例:


  1. #!/usr/bin/perl
  2. use Crypt::blowfish; #加载模块


  3. #需要加密的资料
  4. $data = qq~欢迎光临www.ilcatperl.org这里是Perl的天堂
  5. 欢迎喜欢Perl
  6. 如果你觉得Perl不行,那就是你水平太臭,回家看孩子玩吧~;

  7. #构造对象
  8. my $fish = new Crypt::Blowfish 'this is my key'; # 8 bytes < Key >; 56 bytes

  9. #编码
  10. @data = &block($data); #将数据以8个字节块化,如果最后不够补充空格

  11. foreach (@data) {
  12.         $encode .= $fish->;encrypt($_);
  13. }

  14. #解码
  15. @data = &block($encode); #将数据以8个字节块化,如果最后不够补充空格

  16. foreach (@data) {
  17.         $decode .= $fish->;decrypt($_);
  18. }


  19. #块化子程序
  20. sub block
  21. {
  22.         my ($string) = @_;
  23.         my (@blocks,$last_length,$nu,$ad);
  24.         my @blocks = unpack("a8 "x(int(length($data)/) . "a*", $string);

  25.         $last_length = length($blocks[$#blocks]);

  26.         if (($nu = 8 - $last_length) >; 0) {
  27.                 for (my $i=1;$i<=$nu ;$i++) {
  28.                         $ad .= ' ';
  29.                 }
  30.         }
  31.         $blocks[$#blocks]= $blocks[$#blocks].$ad;
  32.        
  33.         return(@blocks);
  34. }

  35. #以上代码encode是编码后decode是解码后
  36. #coding by hoowa
复制代码

论坛徽章:
0
3 [报告]
发表于 2003-06-10 16:23 |只看该作者

perl原创精华文章!


[2] 父进程与子进程communicate..利用PIPE的例子
作者:apile


# 本程序主要利用PIPE来建立Parent Process与Child Process间的互相连通,
# 利用%STATUS纪录目前Child Process的所有状态,与%CHILDREN纪录所有的Child
# Process。
# Parent Process:负责由CHILD_READ中读取所有CHILD Process的输入,并纪录
# 这些Process目前的状态。当收到INT、HUP、TERM等Signal时,即跳出主要loop
# 并将所有child Process全部杀光...


  1. #!/usr/bin/perl
  2. use strict;
  3. use IO::Select;
  4. use POSIX qw(WNOHANG);

  5. #---Define constants:定义准备先fork几个Process
  6. use constant PREFORK_CHILDREN   =>; 3;
  7. # debugging information:显示过程
  8. use constant DEBUG              =>; 1;

  9. # declare globals
  10. my $DONE=0;             # set flag to true when server done
  11. my %STATUS = ();        #child status information, child pid form keys of the ha
  12. sh, status form the values
  13. #--- 纪录所有Child Process的id...
  14. my %CHILDREN = ();
  15. #---Interrupt handles,跳出loop
  16. $SIG{TERM} = $SIG{INT}=$SIG{HUP} = sub { $DONE++ };
  17. #--- get CHLD Signal
  18. $SIG{CHLD} = sub {
  19.          while((my $child=waitpid(-1,WNOHANG)) >; 0){
  20.            delete $CHILDREN{$child};
  21.          }
  22.       };
  23. # create a pipe for IPC:建立PIPE
  24. pipe(CHILD_READ,CHILD_WRITE) or die "Can't make pipe!\n";
  25. my $IN = IO::Select->;new(\*CHILD_READ);
  26. # prefork some children
  27. make_new_child() for (1..PREFORK_CHILDREN);

  28. # main loop
  29. while(!$DONE){
  30.   # avoid parent block in the I/O call
  31.   if ($IN->;can_read){ # got a message from one of the children
  32.     my $message;
  33.     next unless sysread(CHILD_READ,$message,4096);
  34.   # may contain several messages
  35.     my @messages = split "\n",$message;
  36.   # retrive every pid and status code
  37.     foreach (@messages){
  38.       next unless my ($pid,$status) = /^(\d+) (.+)$/;
  39.   # change status
  40.       if($status ne "done"){
  41.          $STATUS{$pid} = $status;
  42.       }else{
  43.   # delete pid
  44.          delete $STATUS{$pid};
  45.       }
  46.     }
  47.   }

  48.   warn join(' ',map {"$_=>;$STATUS{$_}"} keys %STATUS),"\n" if DEBUG;
  49.   last unless %CHILDREN
  50. }
  51. warn "Termination received, killing children\n" if DEBUG;
  52. #-------------杀掉所有Child Process
  53. kill TERM =>; keys %CHILDREN;
  54. sleep while %CHILDREN;

  55. warn "Normal termination.\n";
  56. exit 0;
  57. #---- 建立新的Process
  58. sub make_new_child{
  59.   die "can't fork :$!" unless(defined( my $child = fork()));
  60.   if($child){   # child >; 0, so we're the parent
  61.     $CHILDREN{$child} = 1;
  62.     warn "launching child $child\n" if DEBUG;
  63.   }else{
  64.     close CHILD_READ;   # no need to read from pipe
  65.     do_child();         # child handles incoming connections
  66.     exit 0;             # child is done
  67.   }
  68. }
  69. #------ child process
  70. sub do_child{
  71.    # write status code: idle
  72.    syswrite CHILD_WRITE,"$$ idle\n";
  73.    for(1..1000000){ };
  74.    syswrite CHILD_WRITE,"$$ busy\n";
  75.    for(1..1000000){ };
  76.    syswrite CHILD_WRITE,"$$ done\n";
  77. }

复制代码

论坛徽章:
0
4 [报告]
发表于 2003-06-11 11:52 |只看该作者

perl原创精华文章!


[3] 父进程与子进程communicate..利用IPC::Shareable的例子
作者:apile

Hi...這是昨天那個例子改用share memory的方式,兩相比較..我覺得
PIPE比較好點...尤其是有大量資料需要互傳的時候...
---------------------------------------------------------------------------------
本程序主要使用IPC::Shareable module来建立一块共同的share memory
以为所有程序所用,主要利用tie将%STATUS、%status与IPC::Shareable
tie在一起,其中SHM_GLUE用来向OS做注册一块memory的識別符號,因
此若程序失败, 未能正常清除share memory,必须利用OS提供的share
memory工具清除, 否则程序将无法启动。linux可以使用ipcrm清除
Parent Process利用sleep(),不做任何动作,而child Process的状态,
透过kill -ALARM getppid() 通知Parent,child Process的status已经
改变了..
-----------------------------------------------------------------------

  1. #!/usr/bin/perl -w
  2. # p_shm.pl

  3. #---- 加载 module包含IPC::Shareable
  4. use strict;
  5. use POSIX qw(WNOHANG);
  6. use IPC::Shareable;

  7. #---- 定义常数
  8. use constant PREFORK_CHILDREN =>; 3;
  9. #--- 定义识别文字
  10. use constant SHM_GLUE =>; 'PERF';
  11. #--- 查测过程
  12. use constant DEBUG =>; 1;

  13. #--- 宣告全域变量
  14. my $DONE = 0; # set flag to true when server done
  15. #--- 纪录CHILD的STATUS
  16. my %STATUS = ();
  17. my %CHILDREN=();

  18. #--- 抓取Signal INT,TERM,ALRM----
  19. $SIG{INT} = $SIG{TERM}= sub{ $DONE++ };
  20. $SIG{ALRM} = sub {}; # receive alarm clock signals, but do nothing
  21. #----抓取 signal : CHLD
  22. $SIG{CHLD} = sub {
  23. while((my $child=waitpid(-1,WNOHANG)) >; 0){
  24. delete $CHILDREN{$child};
  25. }
  26. };

  27. # create a shared memory segment for child status
  28. tie(%STATUS,'IPC::Shareable',SHM_GLUE,
  29. { create =>;1,exclusive=>;1,destroy=>;1,mode=>;0600})
  30. or die "Can't tie \%STATUS to shared memory: $!";

  31. # prefork some children
  32. make_new_child() for(1..PREFORK_CHILDREN); # prefork children

  33. #-- Main loop
  34. while(!$DONE){
  35. sleep; # sleep until a signal arrives(alarm clock or child)
  36. # get the list of idle children
  37. warn join(' ',map{"$_=>;$STATUS{$_}"} keys %STATUS),"\n" if DEBUG;
  38. unless(%CHILDREN){ last; }
  39. }

  40. warn "Termination received, killing children\n" if DEBUG;
  41. #-------------杀掉所有Child Process
  42. kill TERM =>; keys %CHILDREN;
  43. sleep while %CHILDREN;
  44. warn "Normal termination.\n";
  45. exit 0;

  46. #---- 给launch_child cleanup child code
  47. sub make_new_child{
  48. die "can't fork :$!" unless(defined( my $child = fork()));
  49. if($child){ # child>;0, so we're the parent
  50. warn "launching child $child\n" if DEBUG;
  51. $CHILDREN{$child} = 1;
  52. }else{
  53. do_child(); # child handles incoming connections
  54. exit 0; # child is done
  55. }
  56. }
  57. #--- 执行accept() loop fro each child ---
  58. sub do_child{
  59. my %status;
  60. #--将%status与IPC::Shareable tie在一起
  61. tie(%status,'IPC::Shareable', SHM_GLUE)
  62. or die "Child $$: can't tiel \%status to shared memory: $!";
  63. #----告知Parent Process,child process 状态已经改变
  64. $status{$$} ='idle'; kill ALRM=>;getppid();
  65. for(1..1000000){ }
  66. #----告知Parent Process,child process 状态已经改变
  67. $status{$$} ='busy'; kill ALRM=>;getppid();
  68. #----告知Parent Process,child process 状态已经改变
  69. for(1..1000000){ }
  70. $status{$$} = 'done'; kill ALRM=>;getppid();
  71. warn "child $$: done\n" if DEBUG;
  72. }
  73. #---- delete the child's PID from %STATUS.
  74. sub cleanup_child{
  75. my $child=shift;
  76. delete $STATUS{$child};
  77. }     
复制代码

论坛徽章:
0
5 [报告]
发表于 2003-06-26 19:57 |只看该作者

perl原创精华文章!


[4]
為什麼要用IO:oll?因為使用IO::Select時候,因為其儲存handle是存在。。。。。。
作者:apile

以下資料為本人閱讀Nework Programming With Perl的記要..
有興趣的自己研究研究...

=============================================
date: 2003/06/22

IO:oll的使用說明:
  在5.6版本的時候開始發展,功能完整的版本為0.04版。所以要注意的是IO:oll版本一定要是0.04以上。

為什麼要用IO:oll?因為使用IO::Select時候,因為其儲存handle是存在bit vector裡面,因此必須針對所有監控中的Handle一個一個去Scan,找出可以Read/Write的handle。因此在效能的Issue上,當遇到大量的handle需要監控時,就會產生效能上的降低。而IO:oll的機制則不是這麼回事,他同樣可以監控大量的HANDLE,但是利用array儲存這些handle,因為array的儲存機制,並不同於bit vector,並不需要一個一個去Scan這些handle,所以在效能上比較好。

  IO:oll只需要一個Object就可以處理所有的handle,透過bitmask將Event傳給被監控的Handle,一旦符合需求,可以從handle中取出。

IO:oll接受的Event(mask):
可讀的
POLLIN:一般與有Priority的資料
POLLRDNORM:一般的資料
POLLRDBAND:有Priority的資料
POLLPRI:特別高的Priority
可寫的
POLLOUT:一般與有Priority的資料
POLLWRNORM:一般的資料
POLLWRBAND:有Priority的資料
有錯誤的
POLLHUP:HangUp發生
POLLNVAL:handle不合法
POLLERR:有Error發生,如果是Socket可用sockopt(SO_ERROR)取得Error內容

IO:oll的method
1.$poll=IO:oll->;new():產生IP:oll的Object
2.$mask=$poll->;mask($handle,[$mask])
取得或設定目前handle的 event bitsmask,如果mask沒給,則目前的設定值回傳。如果有給mask則將該mask設定給該handle。如果mask為0,則從list將該handle移除。所有的handle預設都會監控(POLLNVAL、POLLERR、POLLHUP)。
3.$poll->;remove($handle)
同$poll->;mask($handle,0);
4.$events=$poll->;poll([$timeout])
等候有任何一個監控中的handle可以被讀取或寫入。回傳Event Type。
5.@handles=$poll->;handles([$mask])
取出符合mask的handles。
6.$mask = $poll->;events($handle)
取得$handles的所有mask。


  1. #!/usr/bin/perl
  2. # file : test.pl
  3. # usage: test.pl [host] [port]
  4. # 利用IO::Poll達到多工的技術
  5. #--加載module
  6. use strict;
  7. use IO::Socket;
  8. #--引用後面的constant
  9. use IO::Poll qw( POLLIN POLLOUT POLLERR POLLHUP);
  10. use Errno qw(EWOULDBLOCK);
  11. #--設定Buffer的最大值
  12. use constant MAXBUF =>;8192;
  13. #--忽略掉HANG HUP的Signal
  14. $SIG{PIPE} = 'IGNORE';
  15. #--設定全域變數,兩個buffer兩個flag
  16. my ( $to_stdout,$to_socket,$stdin_done,$sock_done);
  17. #--取得 host and port
  18. my $host = shift or die "Usage: test.pl host [port]\n";
  19. my $port = shift || 'echo';
  20. #--建立Socket
  21. my $socket = IO::Socket::INET->;new("$host:$port") or die $@;
  22. my $poll = IO::Poll->;new() or die "Can't create IO::Poll object";
  23. #--一開始先將STDIN與$socket放入list中,並將其mask設定為POLLIN準備讀取。
  24. $poll->;mask(\*STDIN =>; POLLIN);
  25. $poll->;mask($socket =>; POLLIN);
  26. #--設定標準輸出與$socket為noblocking mode
  27. $socket->;blocking(0); # turn off blockingon the socket
  28. STDOUT->;blocking(0);  # and on STDOUT
  29. #--main loop,$poll->;handles會回傳所有正在監控中的handle
  30. while($poll->;handles){
  31. #--等候直到有事件符合
  32.   $poll->;poll;
  33.   # 處理可讀取的事件
  34.   for my $handle ($poll->;handles(POLLIN|POLLHUP|POLLERR)){
  35.     if($handle eq \*STDIN){
  36.   #?#93;資料讀取表示STDIN已經終止,否則將資料放入to_socket buffer中
  37.     $stdin_done++ unless sysread(STDIN,$to_socket,2048,length $to_socket);
  38.     }
  39.     elsif($handle eq $socket){
  40.   # ?#93;資料讀取表示Socket已經讀取完畢,否則將資料附入to_stdout buffer中
  41.    $sock_done++ unless sysread($socket,$to_stdout,2048,length $to_stdout);
  42.     }
  43.   }

  44.   # 處理可寫入的事件
  45.   for my $handle ($poll->;handles(POLLOUT|POLLERR)){
  46.      if($handle eq \*STDOUT){
  47.        my $bytes = syswrite(STDOUT,$to_stdout);
  48.      # 假若不是EWOULDBLOCK,表示真的有Error發生,所以才無法寫入
  49.        unless ($bytes){
  50.           next if $! == EWOULDBLOCK;
  51.           die "write to stdout failed: $!";
  52.        }
  53.      # 如果發生Partial Write將已經寫出的先清掉。
  54.        substr($to_stdout,0,$bytes) = '';
  55.      }
  56.      elsif($handle eq $socket){
  57.        my $bytes = syswrite($socket,$to_socket);
  58.        unless ($bytes){
  59.           next if $! == EWOULDBLOCK;
  60.           die "write to socket failed: $!";
  61.        }
  62.        substr($to_socket,0,$bytes) = '';
  63.      }
  64.   }
  65. } continue {
  66.   # 每次While loop執行時都會執行到這兒
  67.   # 先設定三個bitmask為0,表示將從list中將該handle移除
  68.   my ($outmask,$inmask,$sockmask) = (0,0,0);
  69.   # 設定stdout的mask,假如有資料要寫出去,則將其mask設為可寫(POLLOUT)
  70.   $outmask = POLLOUT if length $to_stdout >; 0;
  71.   # 當 to_socket的資料長度比MAXBUF大、或socket已經完結
  72.   # 或stdin已經完結,都不成立時,則設定STDIN可讀取。
  73.   $inmask = POLLIN unless length $to_socket >;= MAXBUF
  74.                       or ($sock_done || $stdin_done);
  75.   # 假如有資料要寫出去,設定$socket為POLLOUT(待寫)
  76.   $sockmask = POLLOUT if length $to_socket>;0;
  77.   # 同STDIN定義,但是|=表示附加上去,因為Socket可以同時讀寫
  78.   $sockmask |= POLLIN unless length $to_stdout>;=MAXBUF or $sock_done;
  79.   # 設定STDIN、STDOUT、Socket三個handle的bitmask
  80.   $poll->;mask(\*STDIN =>; $inmask);
  81.   $poll->;mask(\*STDOUT=>; $outmask);
  82.   $poll->;mask($socket =>; $sockmask);
  83.   # 如果$stdin_done為真且已經?#93;有資料送出至$socket了,則將$socket 關?#93;
  84.   $socket->;shutdown(1) if $stdin_done and !length($to_socket);
  85. }
复制代码

论坛徽章:
0
6 [报告]
发表于 2003-09-02 18:22 |只看该作者

perl原创精华文章!

截取中英文混合字符串,写得很罗嗦,请高人修改一下!
作者:雨中漫步

  1. sub makelen($$)
  2.   {
  3.           my($sstr,$slen)=@_;
  4.           my $makelen,$parity;
  5.           $mslen=length($sstr);
  6.           if($mslen>;$slen)
  7.             {
  8.                 for($mn=0;$mn<$slen;$mn++) #在要求的长度内
  9.                   {
  10.                           $ss=substr($sstr,$mn,1);
  11.                           if(ord($ss)<127) #为英文
  12.                             {
  13.                                 $parity+=1;
  14.                             }
  15.                   }
  16.                  if($parity%2==1) #含英文长度为奇数
  17.                   {
  18.                           if($slen%2==1) #如果所要求的长度也为奇数
  19.                                 {
  20.                                         $tmpstr=substr($sstr,0,$slen);
  21.                             }
  22.                           else #所要求的长度为偶数
  23.                             {
  24.                                     $tmpstr=substr($sstr,0,$slen-1);
  25.                             }
  26.                   }
  27.                 else #含英文长度为偶数或者为0,0也为偶数
  28.                   {
  29.                           if($slen%2==1) #如果所要求的长度为奇数
  30.                                 {
  31.                                         $tmpstr=substr($sstr,0,$slen-1);
  32.                             }
  33.                           else #所要求的长度为偶数
  34.                             {
  35.                                     $tmpstr=substr($sstr,0,$slen);
  36.                             }
  37.                   }
  38.                 $makelen=$tmpstr;
  39.             }
  40.           else
  41.             {
  42.                 $makelen=$sstr;
  43.             }
  44.           return $makelen;
  45.   }
复制代码

论坛徽章:
0
7 [报告]
发表于 2003-09-04 13:09 |只看该作者

perl原创精华文章!

To: 雨中漫步

可以拿下面的代码测试一下:
  1. $str = "asdf中12 34国人民";
  2. for(0..length($str) )
  3. {
  4.   print "$_=>;", substring($str, $_), "\$\n";
  5. }
复制代码

长度为8, 9时不正确.

看一下这代码怎么样:
  1. sub substring($$)
  2. {
  3.   my ($str, $len) = @_;
  4.   my $retval = substr($str, 0, $len);
  5.   $retval =~ /[\x7f-\xff]+$/s;
  6.   chop($retval) if (length($&) % 2 == 1);
  7.   return $retval;
  8. }   
复制代码

论坛徽章:
0
8 [报告]
发表于 2003-09-23 22:24 |只看该作者

perl原创精华文章!

use encoding 'euc-cn', STDIN =>; 'euc-cn', STDOUT =>; 'euc-cn';

$str = "asdf中12 34国人民";
for(0..length($str) )
{
  print "$_=>;", substr($str, $_), "\$\n";
}

论坛徽章:
0
9 [报告]
发表于 2003-10-26 22:20 |只看该作者

perl原创精华文章!

获得本机的多个IP地址
本人是初学者,找了半天才找到这种获得多个IP的方法,原来就这么简单 ,希望能对初学者有所帮助!

  1. #!c:/perl/bin/perl.exe
  2. use strict;
  3. use Socket;
  4. use Sys::Hostname;

  5. my $host = hostname();
  6. print $host."\n";

  7. my $name;
  8. my $aliases;
  9. my $type;
  10. my $len;
  11. my @thisaddr;
  12. ($name,$aliases,$type,$len,@thisaddr)=gethostbyname($host);

  13. foreach(@thisaddr)
  14. {
  15.         print inet_ntoa($_)."\n";
  16. }
复制代码

求职 : 网络信息安全
论坛徽章:
0
10 [报告]
发表于 2003-10-27 16:30 |只看该作者

perl原创精华文章!


  1. #!e:/635/bin/perl.exe -w
  2. use strict;
  3. #####  Name:      xnnyy.pl
  4. #####  Version:   0.0.0.1
  5. #####  Author:    y6cmE[PerlChina]
  6. #####  Contact:   www.perlchina.org
  7. #####  Updated:   2003-9-21
  8. $|=1;
  9. open(F,">;xnnyy.txt") or die "Can't write output file!";
  10. my $x=shift||3;
  11. my $y=int($x/2);
  12. my @z=(()x$x);
  13. my($e,$v,$n,$m);
  14. for(1..$x*$x){
  15.         if($_ >; $x){
  16.                 $n=(--$n+$x)%$x;
  17.                 $m=(1+$m++)%$x;
  18.                 if($z[$n][$m]){
  19.                         $n=($n+2)%$x;
  20.                         $m=($m-1)%$x;
  21.                         $z[$n][$m]=$_;
  22.                         print F "$_\t$n\t$m\n";
  23.                 }
  24.                 else{
  25.                         $n=$n;
  26.                         $m=$m;
  27.                         $z[$n][$m]=$_;
  28.                         print F "$_\t$n\t$m\n";
  29.                 }
  30.         }
  31.         else{
  32.                 $n=($x+$e--)%$x;
  33.                 $m=(++$v+$y-1)%$x;
  34.                 $z[$n][$m]=$_;
  35.                 print F "$_\t$n\t$m\n";
  36.         }
  37. }
  38. close F;
  39. print "Enjoy";
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP