zoukankan      html  css  js  c++  java
  • Perl实战(一)

    在Perl中,我们可以通过uc,lc,U,L来修改变量的值。其中uc,U可以将变量中的字母全部转换为大写。

                  lc,L可以将变量中的字母全部转换为小写。

                  $big = "U$var";       $big = uc($var);

                  $little = "L$var";       $little = lc($var);

    ucfirst和lcfirst表示只改变变量的首字母。

                  $big = ucfirst($var);     $little = lcfirst($var);

    在Perl程序中需要增加参数时,可以通过控制参数模块Getopt::long。

              #!/user/bin/perl

              use strict;

              use Getopt::Long;

              ........

              GetOptions(

                           'verbose+' => $verbose,

                           'more!'      => $more,

                           'test|t'       => $test,

                           'debug:i'    => $debug,

                           'lib=s'        => @libs,

                           'flag=s'      => \%flags,     );

    左侧变量,会加很多操作符在变量之后。右侧变量都会使用反斜杠。

    'verbose+'表示命令行参数中verbose的个数存放在$verbose中。

    'more!'中的!表示,命令行参数中,有这个参数或者没有,只有0或者1两个值,通常做某种开关使用。

    'flag=s' 变量后加=,s表示接收字符串型的变量,i表示接收整数类型变量,f表示接收浮点类型变量。如果右侧接收的是数组,

                                如@lib,则表示,选项可以多次出现, 值被依次存放在数组中。如果右侧接收的是散列,

                                如%flags,则表示,选项可以多次出现,值按键--值对的形式存放在散列中。

    'debug:i' 接有:表示接受数据,i表示整型,s表示字符串,f表示浮点。

    'test|t' 接有| 表示简写,可以将-test简写为-t。

    在Perl中加载好引用Perl子模块。可以用use/require来声明。其中两者的区别是

    1)use引入的名称不需要加后缀名,require需要。

    2)use语句是编译时引入的,require是运行时引入的。所以应用require时,不可以有子模块的中间变量等。

    3)use语句引入模块的同时,也会引入模块中的子模块。而require不会。

    4)use语句使用时,可以用::表示/,来指定目录。否则只搜索@INC路径。@INC可以通过setenv增加环境变量或在Perl中自己操作。

           use  Src::MuxTestflow;

           require("help.pl");

           my $testflow = new Src::MuxTestflow($padc);   

           #!/user/bin/perl  -w

           push(@INC,"/home/test");

    perl中的grep操作,更加简洁,快速的寻找所需行。

    perl中的匹配完全可以实现,但是perl更加简洁。

    while(<$line>)

    if($line = /(word)/i)  print $line;

    $num_apple=grep/^apple$/i,@fruits;  //只匹配apple单独行,并把个数传给num_apple

    @word = grep /(word)/, @line;     //返回匹配行到数组

    perl中的引用和解引用:

    常见数据类型的引用定义:

    数据类型           定义      举例

    标量变量           $Var                              $Pointer  =  $Var

    数组                 @Array                          $Pointer  =  @Array

    哈希变量           \%Hash                           $Pointer  =  \%Hash

    文件句柄           *FILEHANDLE                $Pointer  = 

    常量                 常量                               $Pointer  =   3.1415926

    子程序              &SubRoutine                  $Pointer  =   &SubRoutine

    reference是另一个变量的地址。reference可以指向array,hash,或perl代码段。reference使perl代码运行更快。
    一 array的reference和dereference

    1)array的reference 正常地,我们存储list的元素在array中如下:@array =  (“one”,”two”,”three”,”four”,”five”);

         使用来将array的地址赋给reference变量,如下:$array_ref = @array;

         如果你print $array_ref,将显示如下:ARRAY(0x1a2b3c);

         array的reference可以被传递给subroutine,如下: sub add_numbers {   my $array_ref =  shift;   ..... } 
         @numbers = (11,2,3,45);
         $array_ref = add_numbers(@numbers); 在以上的代码中,我们需要对array的reference进行dereference,然后才可以使用array中的元素。
          下面是传递array的reference到subroutine的优点:

    * 如果array传递给subroutine,perl将整个array重新copy到@_中,当array比较大时,这将非常的低效。

    * 当我们需要在subroutine中修改原来的array的时候,我们需要传递array的reference。

    * reference其实是构造复杂数据结构的本质。
    我们也可以将匿名的array赋给reference如下:$array_ref = (11,2,3,45)


    2)array的reference的dereference 在subroutine中,我们可以使用如下的方法来dereference array的reference:

        @{ $array_ref }; 取得第一个元素如下:$ { $array_ref }[0];

        或者可以使用perl的特殊符号来使用array的reference,如下: # Get all the elements of @numbers array. @ { $_[0] }
    # Get a particular element. This gives the first element of the array. $ { $_[0] } [0]
        注意,如果只是dereference一个简单的scalar变量,可以忽略括号,如下: @$array_ref  # same as @{ $array_ref }
    $$array_ref  # same as $ { $array_ref }
    $_[0]         # not a simple scalar variable and this cant be dereferenced,

    二 hash的reference和dereference

    hash的reference和dereference与array的一样。
    hash的reference如下: %author = ( 'name'              => "Harsha", 'designation'      => "Manager" );
    $hash_ref = \%author;
    dereference后访问元素如下: $name = $ { $hash_ref} { name };

                                             等价于 my $name =  $hash_ref->{name};
    访问所有的keys如下: my @keys = keys % { $hash_ref }; 等价于my @keys = keys %author;

    如果是简单scalar变量,可以忽略括号,如下:my @keys =  keys  %$hash_ref; $name = $$hash_ref{name};
    匿名hash的reference如下:

            my $hash_ref  =  { 'name'               => "Harsha", 'designation'       => "Manager" };
    使用如下:$name = $ { $hash_ref} { name };

    三 对reference变量使用-> 来获得属性

    my $name =  $hash_ref->{name};

    参考http://www.cnblogs.com/itech/archive/2011/04/21/2023491.html

  • 相关阅读:
    HDU2027 统计元音 一点点哈希思想
    湖南工业大学第一届ACM竞赛 数字游戏 字符串处理
    湖南工业大学第一届ACM竞赛 我素故我在 DFS
    HDU3293sort
    HDU2082 找单词 母函数
    HDU1018 Big Number 斯特林公式
    湖南工业大学第一届ACM竞赛 分糖果 位操作
    UVA 357 Let Me Count The Ways
    UVA 147 Dollars
    UVA 348 Optimal Array Multiplication Sequence
  • 原文地址:https://www.cnblogs.com/-9-8/p/4668490.html
Copyright © 2011-2022 走看看