82870034 发表于 2018-8-30 11:06:05

perl自学笔记整理二

  开篇:如果说perl世界里,标量指的是单数的话,那么复数指的就是列表和数组。
  列表指的是标量的有序集合;
  数组则指的是存储列表的变量;
  无论列表还是数组都可以包含无数多个元素。
  一)访问数组中的元素
  1) 访问数组中的元素
  例如:
  # cat a1.pl
  #!/usr/bin/perl
  #a1
  $fred = "yabba";      #将值yabba赋值给数组$fred的第零个元素$fred ;
  $fred = "dabba";
  $fred = "doo";
  foreach(0..2) {
  print "$fred[$_]\n";
  }
  # perl a1.pl
  yabba
  dabba
  doo
  $number = 2.7881;
  print $fred[$number - 1];   #结果和print $fred相同。
  $blank = $fred[ 142_857 ];    #未使用的数组元素,会得到 undef 的结果
  $blanc = $mel;                        #未使用的标量 $mel, 也会得到 undef 的结果。
  2、特殊的数组索引值
  例如:
  $num = @fred;      #数组@fred中元素的个数为$num个,取数组中元素的总个数!!!
  $rocks = 'bedrock';            #第一个元素
  $rocks = 'slate';                  #第二个元素
  $rocks = 'lava';                  #第三个元素
  $rocks = 'crushed rock';    #第四个元素
  $rocks = 'schist';                #第一百个元素,现在中间有95个 undef 元素
  $#rocks            #表示数组中最后一个元素的索引值:99
  $rocks[-1]      # -1表示数组中的最后一个元素;
  $rocks[-2]         # -2表示中间的元素;
  $rocks[-3]      # -3表示第一个元素;
  3、列表直接量
  在圆括号中用逗号隔开的一系列值。
  例如:
  (1, 2, 3)
  (1, 2, 3,)            #相同的三个数字(末尾的逗号会被忽略)
  ("fred", 4.5)
  (1..100)      #100个整数构成的列表
  ( )            #空列表;零个元素
  (1..5)
  (1.7..5.9)
  (0, 2..6, 10, 12)      #与(0, 2, 3, 4, 5, 6, 10, 12)相等
  ("zhangsan", "lisi", "wangwu", "zhaoliu")
  4、qw简写
  qw(zhangsan lisi wangwu zhaoliu)
  qw!zhangsan lisi wangwu zhaoliu!
  qw/zhangsan lisi wangwu zhaoliu/
  qw"zhangsan lisi wangwu zhaoliu"
  qw#zhangsan lisi wangwu zhaoliu#
  qw$zhangsan lisi wangwu zhaoliu$
  qw%zhangsan lisi wangwu zhaoliu%
  注意:不管怎么说,对于qw引起来的内容,Perl都会将其当成单引号内的字符串来处理(所以,在qw构建的列表中,不能像双引号一样使用\n或$fred).其中的空白符会被抛弃。和单引号内的字符串一样,两个连续的反斜线,表示一个真实的反斜线
  5、列表的赋值
  ($fred, $barney, $dino) = ("flintstone", "rubble", undef )
  ($betty, $betty) = ($betty, $betty);      #互换两者的值
  ($fred, $barney) = qw;    #忽略掉末尾两个元素
  ($wilma, $dino) = qw;    # $dino被设为undef
  @rocks = qw/ bedrock slate lava/;
  @tiny = ( );
  @giant = 1..1e5;
  @stuff = (@giant, undef, @gaint);
  $dino = "granite";
  @quarry = (@rocks, "crushed rock", @tiny, $dino);
  @copy = @quarry;   #将数组@quarry复制给@copy
  6、pop、push、shift和unshift对比总结
  # cat a2.pl
  #!/usr/bin/perl
  #本程序演示pop , push, shift, unshift的功能
  print "The first, show pop function.\n";
  my @array = 1..5;
  print "The origin \@arry contains : @array\n";
  my $a=1;
  while (@array) {
  print "$a --> @array \n";
  pop @array;
  $a += 1;
  }
  print "------------------------------------- \n";
  print "The second, show push function.\n";
  my @array1 = undef;
  print "The origin \@array1 contains : @array1\n";
  my $b=1;
  while ($b1 2 3 4 5
  2 --> 1 2 3 4
  3 --> 1 2 3
  4 --> 1 2
  5 --> 1
  -------------------------------------
  The second, show push function.
  The origin @array1 contains :
  1 -->1
  2 -->1 2
  3 -->1 2 3
  4 -->1 2 3 4
  5 -->1 2 3 4 5
  -------------------------------------
  The third, show shift function.
  The origin @array2 contains : 1 2 3 4 5
  1 --> 1 2 3 4 5
  2 --> 2 3 4 5
  3 --> 3 4 5
  4 --> 4 5
  5 --> 5
  -------------------------------------
  The fourth, show unshift function.
  1 --> 1
  2 --> 2 1
  3 --> 3 2 1
  4 --> 4 3 2 1
  5 --> 5 4 3 2 1
  8、splice操作符
  9、字符串中的数组内插
  @rocks= qw( bedstone redstone greenstone yellowstone whitestone);
  print "The stones are : @rocks \n";      #数组内插后,各个元素会以空格隔开,但是首尾元素前后不会加空格,需要的话                                 可以自行添加。
  @fred = qw(hello dolly);
  $y = 2;
  $x = "This is $fred's place";            #
  $x = "This is $fred[$y -1]'s place";   #打印结果同上
  @fred = qw(eating rcks is wrong);
  $fred = "right";      #接下来我想打印出"this is right"
  print "this is $fred\n";   # 用到了 $fred, 打印 "wrong"
  print "this is ${fred}\n";   # 打印 "right" (用花括号避开误解)
  print "this is $fred"."\n";       #还是打印 "right" (用分开的字符串避开误解)
  print "this is $fred\\n";    #还是打印"right" (用反斜线避开误解)
  10、foreach控制结构
  foreach 控制变量 (数组或列表) {
  循环体执行语句;
  }
  11、perl最喜欢用的默认变量: $_
  例如:
  foreach (1..10) {
  print "I can count to $_\n";#如果你在循环开头位置未指定控制变量,那么perl会默认使用$_
  }
  或者
  $_ = "123";
  print ;         #这里会直接打印123
  12、reverse操作符
  reverse会读取数组的值,并按相反顺序赋值。
  比如:
  @fred = (1..5);
  @fred_new = reverse @fred;
  print "@fred_new\n";      #会打印出5 4 3 2 1
  @aaa = reverse 1..5;      #同上
  注意:reverse会返回次序相反的列表, 但它并不会修改传进来的参数。假如返回值无处可去,那么这种操作也就变得毫无意义:
  reverse @fred;      #错误: 这不会修改 @fred
  @fred = reverse @fred;      #这样才好
  13、sort操作符
  sort操作符,一般对列表(也可以是数组)元素排序,默认是按ASCII码排序即:(数字-->大写字母-->小写字母,标点符号随机到各处)。
  相对@rocks数组内元素排序
  sort @rocks;    #错误
  @rocks = sort @rocks;   #这样是正确的。
  14、each操作符
  15、标量上下文与列表上下文
  16、在标量上下文中使用产生列表的表达式
  例如
  @backwards = reverse qw / yabba dabba doo /;
  #会变成 doo, dabba, yabba
  $backwards = reverse qw/ yabba dabba doo /;
  #会变成 oodabbadabbay
  17、在列表上下文中使用产生标量的表达式
  @betty = ( );    #清空一个数组的方法
  18、强制指定标量上下文
  偶尔在列表上下文的地方,你想要强制引入标量上下文,这可以使用伪函数scalar.
  例如:
  @rocks = qw( talc quartz jade obsidian );
  print "How many rocks do you have? \n";
  print "I have", @rocks, " rocks!\n";      #错误, 这会输出各种石头的名称
  print "I have", scalar @rocks, " rocks!\n";   #对了,这就可以打印除石头的种数了。
  19、列表上下文中的
  @lines = ;    # 读入所有行
  chomp(@lines);      # 去掉所有的换行符
  chomp(@lines = );    #读入所有行, 换行符去除。

页: [1]
查看完整版本: perl自学笔记整理二