perl5中新功能: 为列表添加数组元素

以下文章是perl5的读书笔记,原文自http://perldoc.perl.org/perlreftut.html

1. 为什么要用列表的数组元素?

   假设有如下的数据

  北京, 中国

  天津,中国

 东京,日本

 首尔,韩国

 如果存储到列表中,则希望是这样的:

 中国 => 北京,天津

日本=>东京

韩国=>首尔

在perl4中,你只能把=>后面的元素当作字符串处理,每次处理时,要把字符串取出,排序,然后再存取.对于perl来讲,这些操作本应该是内至的,现在作到了.

2. 创建一个带有数组元素的列表

   1)  perl的引用符号 "/"

         你可以用符号 "/" 创建一个对数组,列表或者普通变量的引用如

        $aref = /@array;  #对数组的引用

       $href=/%list; #对列表的引用

      $scalar=/$var; //对普通变量的引用的

     引用可以传递:

    $xy = $aref; # $xy 建立的对@array的引用

   $p[3] = $href; #$p[3] 建立对%list的引用

   $z=$p[3] ;# $z同样建立了对%list的引用

   引用和C语言的指针比较相似,不同的是,引用自身带有变量类型.如

   print  $aref;  得到的结果是 ARRAY(0x275d18)

   print $href; 得到的结果是 HASH(0x1830ef4)

  2) 用[...]建立对无名数组的引用 ,用{key=>value,...}建立对无名列表的引用

     如:  $aref = [1,2,"foo",undef,13];

            $href={key1=>Val1,key2=>val2};

  效果如同

     @array = (1,2,"foo",undef,13);

    $aref=/@array;

  3) 使用引用访问对象

    对于数足,可以使用:

       @a   等同  @{$aref}

       reverse @a        reverse @{$aref}

      $a[3]         ${$aref}[3]

      $a[3] = 127;     ${$aref}[3] = 17

对于hash表,情况很相似

    %h            %{$href}

   keys %h     keys %{$href}

   $h{'red'}   ${$href}{'red'} 

  $h{'red'}=7    ${$href}{'red'}=7

  也可以用在任何你想用的地方,如

  for my $elment(@{$aref}){

}

   想c语言的指针一样,perl也可以使用"->"引用其子对象如

  ${$aref}[3]             ==          $aref->[3]

  ${$href{red}         ==          $href->{red}

  你还可以创建多伪数组

  @a = ( [1,2,3],[4,5,6],[7,8,9]);

  $a[n] 就是一个对子数组的引用,可以用${$a[n]}[n] 或者$a[n]->[n] 来存取对象

  他也支持混合的array和hash混合的现象,如

@a = ( [1,2,3,5],
       {a=>'a',b=>'b'}
);

可以用 $a[0]->[1](${$a[0]}[0]) , $a[1]->{a} ( ${a[0]}{a} ) 访问

对于大于两级 的引用"->"是可以省略的,$a[0]->[1] 可写成$a[0][1],${${$a[0]}[1]}[2] 可写成$a[0][1][2];

3 具体的解决方案

   回过头看看我们开始的程序应该怎么写:

  my %table;

print "input lick /"city,country/". and end input press enter directly/n";

  while(<>) {

  chomp;
if($_ eq "") {last;}

  my ($city,$country) = split /,[ ]*/;

   $table{$country} = [] unless exists $table{$country}; #如果不存在,就创建一个空的无记名列表引用

  push @{$table{$country}},$city;

}

#输出

foreach $country (sort keys %table) {

    print "$country: ";

   my @cities = @{$table{$country}};

   print join ', ',sort @cities;

  print "./n";

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值