Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1284439
  • 博文数量: 161
  • 博客积分: 10192
  • 博客等级: 上将
  • 技术积分: 2165
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-27 17:09
文章分类

全部博文(161)

文章存档

2012年(2)

2011年(13)

2010年(137)

2009年(5)

2008年(4)

我的朋友

分类: LINUX

2010-01-28 17:04:54

虽然许多Linux零售商创建了各种Perl模块的RPM软件包,但他们并不为每一个现存的模块创建数据包,除了那些是供应商所要求的。这就是Comprehensive Perl Archive Network (CPAN)的产生的原因。

  安装CPAN模块,你就能使用Perl本身安装其它模块。这样做,你就需要你所要安装的模块的名字。比如,你要安装的是Time::HiRes或是DBI模块。具有特色的是,如果你为一个特定的Perl程序查看README文件,它将会列举任何所要求的模块的名字。
linux环境下:
--------------------------
  使用CPAN,成为根用户,执行以下操作:

  # perl -MCPAN -e shell

  首次这样做的话,你就必须配置CPAN模块。花一些时间回答它所问的问题;通常情况下,问题按住【Enter】就可。

  安装模块的时候,在CPAND的提示下,输入安装和模块的名字。比如:

  cpan> install Time::HiRes

  这样就对Time::HiRes Perl模块进行了下载,编辑和安装。核查CPAN网站获取有效的CPAN模块的完整列表,。

windows环境下:
---------------------------
如果是在windows操作系统使用的ActivePerl的话,则进入ActivePerl的安装目录的可执行程序目录,也就是bin目录。(例如:C:\Perl\bin)执行命令ppm-shell ,(PPM:Perl Package Manager
Perl包管理器),然后执行命令:
C:\Perl\bin>ppm-shell
ppm 4.01
Copyright (C) 2007 ActiveState Software Inc.  All rights reserved.
ppm>
install Net::SMTP_auth
$>perldoc perlvar

perl的内置特殊变量
  $- 当前页可打印的行数,属于Perl格式系统的一部分
  $! 根据上下文内容返回错误号或者错误串
  $” 列表分隔符
  $# 打印数字时默认的数字输出格式
  $$ Perl解释器的进程ID
  $% 当前输出通道的当前页号
  $& 与上个格式匹配的字符串---->&
  $( 当前进程的组ID
  $) 当前进程的有效组ID
  $* 设置1表示处理多行格式.现在多以/s和/m修饰符取代之.
  $, 当前输出字段分隔符---->OFS
  $. 上次阅读的文件的当前输入行号---->FNR
  $/ 当前输入记录分隔符,默认情况是新行---->RS
  $: 字符设置,此后的字符串将被分开,以填充连续的字段.
  $; 在仿真**数组时使用的分隔符.
  $? 返回上一个外部命令的状态
  $@ Perl解释器从eval语句返回的错误消息
  $[ 数组中第一个元素的索引号
  $ 当前输出记录的分隔符---->ORS
  $] Perl解释器的子版本号
  $^ 当前通道最上面的页面输出格式名字
  $^A 打印前用于保存格式化数据的变量
  $^D 调试标志的值
  $^E 在非UNIX环境中的操作系统扩展错误信息
  $^F 最大的文件捆述符数值
  $^H 由编译器激活的语法检查状态
  $^I 内置控制编辑器的值
  $^L 发送到输出通道的走纸换页符
  $^M 备用内存池的大小
  $^O 操作系统名
  $^P 指定当前调试值的内部变量
  $^R 正则表达式块的上次求值结果
  $^S 当前解释器状态
  $^T 从新世纪开始算起,脚步本以秒计算的开始运行的时间
  $^W 警告开关的当前值
  $^X Perl二进制可执行代码的名字
  $_ 默认的输入/输出和格式匹配空间
  $| 控制对当前选择的输出文件句柄的缓冲
  $~ 当前报告格式的名字
  $` 在上个格式匹配信息前的字符串
  $’ 在上个格式匹配信息后的字符串
  $+ 与上个正则表达式搜索格式匹配的最后一个括号
  $< 当前执行解释器的用户的真实ID
  $ 含有与上个匹配正则表达式对应括号结果
  $= 当前页面可打印行的数目
  $> 当前进程的有效用户ID
  $0 包含正在执行的脚本的文件名
  $ARGV 从默认的文件句柄中读取时的当前文件名
  %ENV 环境变量列表
  %INC 通过do或require包含的文件列表
  %SIG 信号列表及其处理方式
  @_ 传给子程序的参数列表
  @ARGV 传给脚本的命令行参数列表
  @INC 在导入模块时需要搜索的目录列表
  $-[0]和$+[0] 代表当前匹配的正则表达式在被匹配的字符串中的起始和终止的位置 。
perldoc perl : 查看帮助的摘要 
    perl  Perl概要 (也就是这页)                              
    perldelta         自上一版来的变化
    perl5005delta      版本5.005中的变化
    perl5004delta      版本5.004中的变化
    perlfaq     常见问题
    perltoc       文档内容表
    perldata  Perl数据结构
    perlsyn  Perl 语法
    perlop  Perl 运算符及优先级
    perlre  Perl 正则表达式
    perlrun  运行Perl内部函数
    perlopentut  Perl open() 函数使用指导
    perlvar  Perl 内部变量
    perlsub  Perl 子程序
    perlmod  Perl 模块: 他们是如何工作的
    perlmodlib  Perl 模块: 怎么样写和使用PERL模块
    perlmodinstall Perl 模块: 怎样安装来自CPAN的模块
    perlform  Perl 格式化
    perlunicode  Perl 对unicode的支持
    perllocale  Perl 对locale的支持
    perlreftut  Perl 引用的简单介绍
    perlref  关于Perl 引用的更多知识
    perldsc  Perl 数据结构介绍
    perllol  Perl 数据结构:数组的数组
    perlboot  Perl 面向对象基础教程
    perltoot  Perl 新手指南, 第1部分
    perltootc  Perl 新手指南,第2部分
    perlobj  Perl 对象
    perltie  Perl 隐藏在简单变量之后的对象
    perlbot  Perl 技巧与实例
    perlipc  Perl 进程间通讯
    perlfork  Perl fork() 函数的知识
    perlthrtut  Perl 线程指南
    perllexwarn  Perl 的警告与控制
    perlfilter  Perl 过滤源代码
    perldbmfilter Perl DBM 过滤器
    perlcompile  Perl 编译套件介绍
    perldebug  Perl 调试
    perldiag  Perl 诊断信息
    perlnumber  Perl 数字的语义
    perlsec  Perl 安全
    perltrap  Perl 无意的陷阱
    perlport  Perl 便利性指导
    perlstyle  Perl 风格指导
    perlpod  Perl 老的文本文档
    perlbook  Perl 书籍信息
    perlembed  Perl 在你的C,C++程序中嵌入PERL
    perlapio  Perl 内部IO抽象接口
    perldebguts  Perl 调试技巧
    perlxs  Perl XS 应用程序接口
    perlxstut  Perl XS 指南
    perlguts  Perl 用于扩展的内部函数
    perlcall  Perl 从C语言继承的风格
    perlapi  Perl API 列表 (自动生成的)
    perlintern  Perl 内部函数 (自动生成的)
    perltodo  Perl 要做的事
    perlhack  Perl hackers指导
    perlhist  Perl 历史记录
    perlamiga  Perl 对于Amiga需注意的事项
    perlcygwin  Perl 对于Cygwin需注意的事项
    perldos  Perl 对于DOS需注意的事项
    perlhpux  Perl 对于HP-UX需注意的事项
    perlmachten  Perl 对于Power MachTen需注意的事项
    perlos2  Perl 对于OS/2需注意的事项
    perlos390  Perl 对于OS/390需注意的事项
    perlvms  Perl 对于VMS需注意的事项
    perlwin32  Perl 对于Windows需注意的事项
perl检测操作
-r -w -x -o -R -W -X -O 文件或目录对此用户或组的权限
-e 文件或目录名存在
-z 文件存在,大小为0(目录恒为false)
-s 文件或目录名存在,大小大于0(值为文件的大小,单位:字节)
-f 为普通文本
-d 为目录
-l 为符号连接
-S 为socket
-p 为管道
-b 为block-special文件(如挂载磁盘)
-c 为character-special文件(如I/O设备)
-u setuid的文件或目录
-g setgid的文件或目录
-k
-t
-T
-B
-M  modefy修改时间(单位:天)
-A  access访问时间(单位:天)
-C  change索引节点修改时间(单位:天)

perl:从apache日志统计访问ip

方法一:
perl -F'from=' -anle 'BEGIN{%ip_count=();} if($F[1]){$ip_count{$F[1]}+=1;}END{foreach $cap_ip (keys(%ip_count)){print "$cap_ip\t$ip_count{$cap_ip}"}}' /tmp/http-web.log

方法二:

第一步,将每个日志中的ip地址单独导入到一个文件中

#vi count.pl
$log_name="/tmp/http-web.log";
 
open (file_log,$log_name) || die ("open log file failed");

while ($line_log = )
{
 @log_ip = split(/\s+/,$line_log);
 print("$log_ip[0]\n");
}
close (file_log);

或者用命令行来做:perl -ne "/from=/;print $'"  /tmp/http-web.log > /tmp/ip.log

第二步,分析此文件中的ip地址并进行统计

#vi count2.pl
$log_name="/tmp/ip.log";
 
open (file_log,$log_name) || die ("open log file failed");
 

%ip_count=();

$total=0;

while ($line_log = )
{
 @log_ip = split(/\s+/,$line_log);
 $ip_count{$log_ip[0]}+=1;
}
close (file_log);
 
foreach $cap_ip (keys(%ip_count))
{
    print("$cap_ip \t $ip_count{$cap_ip} \n");
}

第三步:执行并排序
perl count2.pl |sort -k2n
perl+seek函数:如果文件巨大且要查找的部分偏尾部则用它。(linux本身无此功能的函数,PERL有。)
seek 设置文件的当前位置!当一个文件非常大时可以从指定位置读起。
seek FILEHANDLE,POSITION,WHENCE   成功返回真,失败返回假。
FILEHANDLE 句柄
POSITION 是读入的新位置(字节),它大小一般参考目标文件的大小;如果从尾部开始时它须为负值。
WHENCE   有3个值,0表示新位置是POSITION,
                  1表示当前位置加上POSITION,
                  2表示文件尾加上POSITION
例如:A.txt有10万行,内容为行标,如1 2 3 。。。。大小为从588895字节。现查找99996并打印出来。
方案一:从头开始找(PERL里默认即是从文件头开始查找,即这里也可以用不SEEK函数)
$>cat a.sh
#!/usr/bin/perl -w
open (FILEHANDLE,"seek FILEHANDLE,0,0;
while()
{
  if(/99996/)
   {print "ok\n";}
}
close(FILEHANDLE);

$>time perl a.sh
ok
real    0m0.065s
user    0m0.063s
sys     0m0.002s



方案二:从尾开始找(-288895这个值是估算,根据大概位置来估算)
$>cat b.sh
#!/usr/bin/perl -w
open (FILEHANDLE,"seek FILEHANDLE,-288895,2;
while()
{
  if(/99996/)
   {print "ok\n";}
}
close(FILEHANDLE);

$>time perl b.sh

$>time perl b.sh
ok
real    0m0.033s
user    0m0.031s
sys     0m0.001s

scalar(@数组名):求数组列数的函数
perl -anle '{for($i=0;$i
PERL正则表达式运算符

=~ 正则表达式匹配运算符,左边是待匹配字符串,右边是正则表达式,匹配结果设置在$1,$2等变量中,在scaler上下文中,成功匹配返回匹配个数,否则返回false。例如 $var =~ /foo/;
!~ 正则表达式匹配运算符,和=~ 不同的是它忽略匹配结果,且返回值相反。例如 $var !~ /foo/;
正则表达式运算符右边是正则表达式,有如下三种形式:
1. 匹配模式 m/pattern/igmsoxc
        m表示match,pattern是正则式内容,分隔符/可以用任意其他字符如#替换,igmsoxc是可选的参数,意义如下:
          i  忽略大小写
          g  匹配所有符合的(默认是匹配第一个符合的)
          m  多行模式,^和$分别匹配行的开始和结尾(默认匹配字符串的开始和结尾)
          s  单行模式,“.” 匹配“\n”(默认不匹配)
          o  compile pattern Once
          x  eXtended legibility - free whitespace and comments
          c  don't reset pos on failed matches when using /g

2. 存储模式 qr/pattern/imsox
        qr将正则表达式存储到一个变量中,这样可以反复使用,可选项意义与m相同

3. 替换模式 s/pattern/replacement/igmsoxe
        s代表substitutes,将匹配的模式pattern替换为replacement,多了一个可选项:
          e  将replacement作为一个表达式执行

4. 一次性匹配模式  ?pattern?
和m/pattern/相同,但是只进行一次匹配,?不能用其他分隔符替换

基本语法元素

     \         字符转义
     .         匹配除\n外的任意字符
     ^         匹配行或字符串开头
     $         匹配行或字符串结尾
     *         0个或多个
     +         1个或多个
     ?         0个或1个
     {...}     指定个数
     [...]     字符类,匹配括号中的任意一字符
     (...)     匹配组,匹配后可以用$1,$2等获取相应的匹配组
     (?:...) 聚集,匹配后不能$1,$2等获取相应的匹配组,速度会快些
     |         前者或后者,一般和括弧配合使用
     \1, \2 ...  正则式中反引用匹配组

常见转义字符
     \a         Alarm (beep)
     \e         Escape
     \f         Formfeed
     \n         Newline
     \r         Carriage return
     \t         Tab
     \037       Any octal ASCII value
     \x7f       Any hexadecimal ASCII value
     \x{263a} A wide hexadecimal value
     \cx        Control-x
     \N{name} A named character

     \l  Lowercase next character
     \u  Titlecase next character
     \L  Lowercase until \E
     \U  Uppercase until \E
     \Q  Disable pattern metacharacters until \E
     \E  End case modification
     \b  word boudariy

字符类

    [...]匹配括号中的任意一个字符,但是当第一个字符是^时是相反的,匹配除了括号中的字符外的任意字符。另外还有a-z这样的简写方式代替a到z的所有字符。例如:
    [amy]     Match 'a', 'm' or 'y'
    [f-j]     Dash specifies "range"
    [f-j-]    Dash escaped or at start or end means 'dash'
    [^f-j]    Caret indicates "match any character _except_ these"

    一些字符类有更简单的表达方式,如:
    \d       A digit                      [0-9]
    \D      A nondigit                   [^0-9]
    \w       A word character             [a-zA-Z0-9_]
    \W      A non-word character         [^a-zA-Z0-9_]
    \s       A whitespace character       [ \t\n\r\f]
    \S       A non-whitespace character  [^ \t\n\r\f]


特殊标记
    ^  Match string start (or line, if /m is used)
    $  Match string end (or line, if /m is used) or before newline
    \b Match word boundary (between \w and \W)
    \B Match except at word boundary (between \w and \w or \W and \W)
    \A Match string start (regardless of /m)
    \Z Match string end (before optional newline)
    \z Match absolute string end
    \G Match where previous m//g left off

重复
    Maximal Minimal Allowed range
    ------- ------- -------------
    {n,m}    {n,m}?  Must occur at least n times but no more than m times
    {n,}     {n,}?    Must occur at least n times
    {n}      {n}?     Must occur exactly n times
    *        *?       0 or more times (same as {0,})
    +        +?       1 or more times (same as {1,})
    ?        ??       0 or 1 time (same as {0,1})

perl命令行

perl -anle 'xxx' filename
     -a:把filename的一行分割成数组@F
     -n: 使用 <> 将所有 @ARGV 参数当作文件来逐行运行,会将读入的内容隐式的逐一按行来遍历文件.每一行将缺省保存在 $_    
     -l: 使用 -l 有两个效果,第一自动 chomp 输入分隔号,第二 把$/(默认记录分隔符) 值付给 $\ ( 这样 print 的时候就会自动在末尾加 \n )
     -e: 后面直接跟命令
     -p: 和 -n 一样,但是还会打印 $_ 的内容
         请注意 -p 开关和 -n 开关的使用。当您想显式打印数据时,使用 -n 开关。
         -p开关隐式地将 print $_ 语句插入到 -n 开关所产生的循环中。因此, -p 开关更适用于对文件进行的 完全处理,而 -n 开关更适用于
选择性文件处理,这样的处理只需打印特定数据。
     -i: 在适当的位置编辑文件.一般是在匹配到的地方直接修改文件。    
     -w:打开警告 -Mstrict    打开严格编译指示(pragma)
    
-F:把缺省的分隔符改为你想要的。
     -c:进行perl的语法检查,但不执行perl命令
     -M:导入模块
     -I:指定目录以搜索标准位置前的模块  整洁性
-0<数字>
(用8进制表示)指定记录分隔符($/变量),默认为换行
-00
段落模式,即以连续换行为分隔符
-0777
禁用分隔符,即将整个文件作为一个记录
PERL基本结构
循环结构:while结构
     for结构   for($i=1;$i<=10;$i++){print "ok,$i\n";}
               或者:for(1..10){print "ok,$i\n";}
     foreach控制结构foreach $counter (@a) 类似bash中的for(in),即for i in aa
                         注意:foreach是引用,不是赋值,perl里面的“=”实际上是在进行引用,而不是赋值。对$counter的操作即是对@a元素的操作。


分支结构:if 如果。。。
     Unless 除非。。。
     Untill 直到。。。
      next相当于c语言中的continue,就是中止本次循环的过程,开始下一次循环。
     last相当于c语言中的break,就是跳出循环
     redo

perl 5种变量类型:

标量 指针 数组 哈希表 句柄
标量变量名字前有$的变量即为标量
   注意:使用双引号定义的字符串里面出现的变量名会进行替换,而且可以出现“\n\r\t”等控制字符。
            用单引号定义的就不可以使用反斜杠引导的控制命令了(当然还可以使用反斜杠引单引号和反斜杠),文本会按照字符串原来的样子保存。
            用单引号定义可以使用多行文本
      标量的操作符:
                   数字:+(加),-(减),*(乘),/(除),-(取反),“%”(取余),幂运算(**),“++”,“--”,
                         “<”,“>”,“<=”,“>=”,“==”,“!=”,
                         “<=>”当左边的数字小于右边的时返回-1,相等时返回0,当左边的大于右边的时返回1。
                          “=”,“+=”,“-=”,“*=”,“/=”,“**=”,“^=”,“&=”,“|=”,“~=”。
                   字符串:两个字符串相加(连接)用“.”进行,还有一个运算符是x,
                          字符串的比较用以下的操作符进行:
                           “lt”意为“小于,less than”;
                           “gt”意为“大于,greater than”;
                           “eq”意为“等于,equal”;
                             “le”意为“小于等于,less than or equal”;
                           “ge”意为“大于等于,greater or equal”;
                           “ne”意为“不等于, not equal”;
                            “cmp”意为“比较,返回 1, 0, or -1,compare”。
                     函数:length(),这个函数可以返回变量打印出来的长度。
                           chop()。这个函数将会节掉字符串中的最后一个字符.
                           chomp(),这个函数仅仅将字符串末尾的换行符裁掉。
                           substr()这个函数可以从一个字符串中截取一段长度的字符串并将其返回。$h="hello all"; $i=substr($h,3,5) 就是"lo al"。
                            defined(),这个函数用来判断一个数据是否已经定义。在perl中,一个数据如果没有定义,那么他将会是一个叫做undef的特殊值。


数组:变量名字前有@的变量即为数组
      数组初始化使用 @数组名(),()内可为空可为数据。
      引用数组时用 $数组名[标记],表示这里是引用数组中的单个元素。如果表示一组数据则可以用@数组名[标记1,标记2。。。]  若引用时用 @数组名 则表示返回数组的元素个数
       数组操作符
数组之间相互拷贝 @a=@b
                    从数组尾追加元素可以@c=(@c,"hello");也可以用追加函数push,如(@c,"hello");
          从数组的开头追加入元素 unshift(@c,"hello");
          从数组的最后取出一个元素 pop(@a);
          从数组的开头取出一个元素shift( @a);
                    splice函数有三个作用:第一个作用是向数组中间的一部分插入内容splice(@d,2,2,@e); 即从@d的第二个开始(不包括第二个)插入,不过先删除两个再插。
                                         第二个功能是删除 splice(@d,2,6); 即从@d的第二个(不包括第二个)开始删,向后删6个。
                                         第三个功能就是删除到末尾 splice(@d,2,6);即从@d的第二个(不包括第二个)开始删,删到尾。
          join函数:有两个参数 第一个参数是合并时放在元素之间的分割符,第二个是进行操作的数组。如my @g=(1,2,3); join(" ",@g); 可以得到“1 2 3”
          under函数:undef(@a); 的作用是把@a的内容清空
          hop函数:hop(@a); 的作用是把数组内每个元素的末尾去一个字符。
          chomp函数:chomp(@a); 的作用则是把数组内的每一个元素的末尾的换行符去掉。
                    scalar函数:这个函数取得数组的长度。
                

哈希表:哈希表是一种很特别的数据结构,也叫散列(Set)或者关连数组Associated Array。
        用“%哈希表名”定义,如%var11=("hello"=>"哈罗","nihao"=>"你好");
        用下列方式引用 print $var11{"hello"};  # 输出 哈罗 $var11{"nihao"}="你好";
        存取哈希: $hash{$some_key}  
$some_key为字符串
                   foreach $keys_values (keys(%hash))
                        { print "$keys_values \t $hash{$keys_values}\n" }

         keys()函数:取得哈希表的KEYS

         values()函数:取得哈希表的values

         each()函数:
              一般只在while 循环中使用each,作用类同foreach
              while (($key, $value) = each %hash)
                {print “$key => $value\n”; }
         exists()函数:查看hash 中是否存在某个key。if(exists $hash{Tome}){ print "ok";}else {print "no"}
         delete()函数:delete 函数将某个给定的key(包括其对应的value)从hash 中删除。(如果不存在这个key,则什么也不做;不会有警告或者
错误信息。)

句柄:句柄是一种特殊的数据,用来保存系统资源的指针,例如文件,目录,管道,socket等等。
      句柄类型没有引导字符。一般情况下大家习惯使用大写字母来标明句柄类型。
       例如下面的例子打开一个文件,读出一行,然后关闭。 这里<>起从句柄中读出一行的作用。
      open(FILEHANDLE,"test.htm");
      $templine=;
      close(FILEHANDLE);

     
指针:perl里面的指针分为两种类型,一种成为软指针,另一种称为硬指针。
      硬指针:在perl里面使用“\”来生成指针。如下面的例子:
     $vavr13="hello";
     $pointerto=\$var13;
      访问指针指向的数据可以使
用下面的方法:print $$pointerto; 也就是加上一个$就可以了。
      perl里面的指针与c里面的不同,perl里面的指针是有引用计数的。
       也就是说,如果一个数据可以记住自己被几个指针引用,当没有指针引用时这个 数据会自动释放内存。

一个简单的查找范文
#!/usr/bin/perl
my $file = "/tmp/sample2.txt";
open( FH, "<$file" ) or die "Open file error: $!\n";
my $cap2_flag = 0;
while ( my $line = ) {
  if ( $line =~ /swatch/ ) {
      $line = "SEGR\n";
      print $line;
      next;
   }
#print $line;
}
close FH;

perl中文匹配:
#!c:\perl\bin\perl.exe -w
use Encode;
$re=Encode::decode('GB2312','作业完成状态: 成功');
my $file = 'a.log';
open( FH, "<$file" ) or die "Open file error: $!\n";
my $cap2_flag = 0;
while ( my $line = )
{
        $in=Encode::decode('GB2312',$line);
        if ( $in =~ /$re/ )
      {
      print "$line\n";
      next;
   }
}
close FH;

perl+xml+utf-16+中文搜索:

#!c:\perl\bin\perl.exe -w
use Encode;
$re="作业完成状态: 成功";
open( FH, "< encoding(utf16)","BEX_CHENGZI-BACKUP_01662.xml" ) or die "Open file error: $!\n";
my $cap2_flag = 0;
while ( my $line = )
{
    $in=encode("gbk",$line);
    if ( $in =~ /$re/ )
    {
    print $re,"ok\n";
    next;
    }
}
close FH;

阅读(832) | 评论(0) | 转发(0) |
0

上一篇:(szx)ubuntu9.04

下一篇:(szx)solaris 02: SAMP平台

给主人留下些什么吧!~~