设为首页 收藏本站
查看: 1379|回复: 0

[经验分享] Perl——数组及哈希的创建和引用

[复制链接]

尚未签到

发表于 2018-8-30 12:38:49 | 显示全部楼层 |阅读模式
  语法
  创建'引用'仅有两种方法,使用它也是两种。
  一、创建引用
  1、创建规则 1
  如果你在一个变量前加一个'\'号,你就得到了这个变量的'引用'。
  $aref = \@array;         # $aref 保存着指向@array的'引用'
  $href = \%hash;          # $href 保存着指向%hash的'引用'
  当你把'引用'保存在类似 $aref 或 $href的变量中,你就可以象操作其他标量一样copy或保存它。
  $xy = $aref;             # $xy 现在保存了指向 @array 的'引用'
  $p[3] = $href;           # $p[3] 现在保存了指向 %hash 的'引用'
  $z = $p[3];              # $z 现在保存了指向 %hash 的'引用'
  这些例子展示了如何创建命名变量的'引用',但是有时候,我们创建的数组或哈希没有名字。这个和你使用没有放到变量中去的字符串'/n'或数字'80'类似。
  2、创建规则 2
  [ ITEMS ] 创建了一个新的、匿名的数组,并返回一个指向这个数组的'引用'。 { ITEMS } 创建了一个新的、匿名的哈希,并返回那个哈希的一个'引用'。
  $aref = [ 1, "foo", undef, 13 ];
  # $aref 保存了这个数组的'引用'
  $href = { APR =>; 4, AUG =>; 8 };
  # $href 保存了这个哈希的'引用'
  从规则 2 中得到的'引用'和从规则 1 中得到的'引用'是同一种类型的:
  # 这里:
  $aref = [ 1, 2, 3 ];
  # 和上面一样:
  @array = (1, 2, 3);
  $aref = /@array;
  前面一种方法是后面两行的缩写,除了第一种方法没有创建一个多余的数组变量@array。
  如果你只是编写符号 [], 你将得到一个新的、空匿名数组。如果你使用符号 {},就能得到一个新的、空匿名哈希。
  二、使用引用
  当你创建了一个'引用'后,你可以对它做什么操作呢?它是标量,你可以象处理任何标量一样保存和取回它。除此之外,还有两种使用方法:
  1、使用规则 1
  你可以始终用一个带有大括号的数组'引用',来替换一个数组的名字。例如,用 @{$aref} 代替 @array。
  下面是一个用法的一些例子:
  数组:
  @a              @{$aref}                一个数组
  reverse @a      reverse @{$aref}        对一个数组做倒序排序
  $a[3]           ${$aref}[3]             数组中的一个成员
  $a[3] = 17;     ${$aref}[3] = 17        对一个成员赋值
  上面每行中,两个表达式实现的是同一种功能。左边那个是对数组@a操作,右边那个是对'引用'$aref所指向的数组操作。它们对数组产生相同的作用。
  使用哈希的'引用'和数组的'引用'完全一样。
  %h              %{$href}              一个哈希
  keys %h         keys %{$href}         从哈希中将键取出来
  $h{'red'}       ${$href}{'red'}       哈希中的一个成员
  $h{'red'} = 17  ${$href}{'red'} = 17  对一个成员赋值
  你对一个'引用'无论想做什么,使用规则 1 已经告诉你怎么做了。 你只要象使用常规的数组或哈希一样编写Perl代码,然后把数组或哈希的名字用 {$reference}来替代。‘当我只有一个'引用'时,怎么来遍历整个数组?’你这样写:
  for my $element (@array) {
  ...
  }
  接着用'引用'替代数组名@array:
  for my $element (@{$aref}) {
  ...
  }
  ‘怎当我只有一个'引用'时,怎么来打印一个哈希的内容?’先写一个打印整个哈希的代码:
  for my $key (keys %hash) {
  print "$key =>; $hash{$key}/n";
  }
  然后用'引用'代替那个哈希的名字:
  for my $key (keys %{$href}) {
  print "$key =>; ${$href}{$key}/n";
  }
  2、使用规则 2
  使用规则 1 是你真正需要的,因为它告诉了你怎么来处理一个'引用',而它对几乎任何的'引用'都有效。但是我们通常做的事情只是和数组或哈希中的一个成员有关,使用规则 1 却是很笨重的方法,所以还有简单的方法。
  ${$aref}[3] 太难阅读,所以我们这样写 $aref->[3]。
  ${$href}{red} 写的太笨重, 所以我们这样写 $href->{red}。
  如果 $aref 保存的是一个数组的'引用',那么 $aref->[3] 就是这个数组的第四个成员。不要和 $aref[3] 相混淆,这个代表的是一个完全不同的数组的第四个成员,这个迷惑的数组是@aref。 变量 $aref 和 @aref 是完全不相关的,就像 $item 和 @item 一样。
  同样的, $href->{'red'} 是哈希'引用' 的变量$href的一部分,甚至这是一个没有名字的哈希。而$href{'red'} 是另一个容易混淆的命名哈希 %href 的一部分。很容易忘记写上符号' ->',如果出现这种情况,当你的程序从一个你不想取数据的数组和哈希中取出了成员,你会得到奇怪的计算结果。
  例子
  让我们来看一个例子:
  首先,记住 [1, 2, 3] 创建了一个匿名数组,包含了 (1, 2, 3),然后返回一个数组的'引用'。
  现在想一下:
  @a = ( [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
  );
  @a 是一个拥有三个成员的数组,每一个成员是另一个数组的'引用'。
  $a[1] 是其中的一个'引用'。它指向一个数组,这个数组包含了(4, 5, 6),因为这是一个数组的'引用',使用规则 2 告诉我们可以这样写 $a[1]->[2],用来取得这个数组的第三个成员。  $a[1]->[2] 值是6。 同样的,$a[0]->[1] 值是 2。这里我们就像在使用一个二维数组;你可以是用 $a[ROW]->[COLUMN] 来取得或设置数组中任何一行任何一列中的成员。
  这些符号看起来还是有些麻烦,所以还有更加简单的用法:
  箭头符号规则
  在两个下标之间的箭头是可选的。
  我们可以用这个写法$a[1][2]来代替$a[1]->[2];它们是相同的。相对于$a[0]->[1] = 23,我们这样写$a[0][1] = 23;它们也是相同的。
  现在它们看起来真的象二维数组了!
  你可以发现为什么箭头这么重要。没有它们,我们必须这样写${$a[1]}[2],而不是$a[1][2]。对于三维数组,它们使我们可以简单地写成$x[2][3][5]而不是写成难读的${${$x[2]}[3]}[5]方式。
  三、其他细节:
  你可以对任何东西创建'引用',包括标量,函数和其他的引用。
  在 使用规则 1 中,当大括号里面是一个象$aref这样的标量变量时,你可以省略掉这个大括号。例如, @$aref 和 @{$aref}是一样的,$$aref[1] 和 ${$aref}[1]是一样的。 如果你是初学者,建议你还是养成加上大括号的习惯。
  下面的操作不会copy '引用'指向的数组:
  $aref2 = $aref1;
  你将得到两个'引用',它们都指向同一个数组。如果你修改了$aref1->[23]的值,那么你查看变量$aref2->[23]时,它也相应地变了。
  要copy这个数组,你需要这样
  $aref2 = [@{$aref1}];
  使用符号 [...] 来创建一个新的匿名数组, 而且这个新的数组的'引用'被赋值给了$aref2 。 这个新的数组用'引用'$aref1所指向的数组的内容来初始化。
  同样的,要copy一个匿名哈希,你需要这样
  $href2 = {%{$href1}};
  如果要判断一个变量保存的内容是不是'引用',使用函数ref 。如果它的参数是'引用',返回的值是'真'。实际上,它做得更好:如果是一个哈希的引用,它返回'HASH',如果是一个数组的引用,那么就返回'ARRAY'。
  如果你想像字符串一样使用'引用'的话,你得到的字符串就像
  ARRAY(0x80f5dec)   or    HASH(0x826afc0)
  如果看到一个像这样的字符串,你应该知道你错误地输出了一个'引用'。
  这种显示方式的另一个作用是你可以用eq来比较两个'引用',看它们是不是指向相同的东西。(你通常可以使用 == 来比较,因为它更会)
  你可以像使用'引用'一样来使用一个字符串。如果你使用"foo"作为一个数组的'引用',它就是指向数组 @foo的一个引用。这被称为'软引用'或‘符号引用 '。 使用申明 use strict 'refs' 可以取消这个功能,如果你不小心使用了它,会导致各种可能的错误。
  四、遍历二维Hash
  foreach my $key1 (keys %hash)
  {
  my $hash2 = $hash{$key1};
  foreach my $key2 (sort{$hash2->{$b}$hash2->{a}} keys %$hash2)
  {
  print $key1.”\t”.$key2.”\t”.$hash2->{$key2}.”\n”;
  }
  }


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-558953-1-1.html 上篇帖子: 【Perl】二维数组 下篇帖子: 复习perl..
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表