简述perl的引用(包括标量、数组、hash等数据类型的引用)

2023-11-07

perl的引用,类似C语言的指针;意义都是指向一个内存空间的地址。比如下述例子中,脚本输出的信息SCALAR(0x7836d0)代表标量数据的存储地址;ARRAY(0x93d6d0)代表数组数据的存储地址。

引用一般会包含“定义引用”,“解引用”两个步骤。“定义引用”是为数据定义内存地址;“解引用”是取内存地址里的数据。

引用的变量是标量类型,那么解引用就必须用标量符号$;
引用的变量是数组类型,那么解引用就必须用数组符号@;
引用的变量是散列类型,那么解引用就必须用散列符号%;
….
总之,解引用和定义引用的数据类型,要保持一致。

另外,解引用的过程中,要关心地址的个数,从而决定是用标量还是数组收集。

perl的引用

qilei@AFAAW-704030720:~/array_2d$ cat 1.pl
#!/usr/bin/perl
use strict;
use warnings;

my $value = 10;
my $pointer = \$value;
print "Pointer Address $pointer of $value \n";
print "What Pointer *($pointer) points to $$pointer\n";

qilei@AFAAW-704030720:~/array_2d$ ./1.pl
Pointer Address SCALAR(0x7836d0) of 10
What Pointer *(SCALAR(0x7836d0)) points to 10
qilei@AFAAW-704030720:~/array_2d$

数组的解引用

引用的变量是数组类型,那么解引用就必须用数组符号@。
非数组类型的引用变量同理,即解引用和定义引用的数据类型都要注意保持一致。

qilei@AFAAW-704030720:~/array_2d$ cat 2.pl
#!/usr/bin/perl
use strict;
use warnings;

my @names =(1,2,3);
print "$#names\n@names\n";
my $address = \@names;
sub listem{
   my ($list) = @_;
   print $list."\n";
   print (@$list[1],"\n");
}
&listem(\@names);
qilei@AFAAW-704030720:~/array_2d$ ./2.pl
2
1 2 3
ARRAY(0x93d6d0)
2
qilei@AFAAW-704030720:~/array_2d$

二维数组的引用

qilei@AFAAW-704030720:~/array_2d$ cat run.pl
#!/usr/bin/perl
use strict;
use warnings;

my @array1=("a1","b1","c1","d1");
my @array2=("a2","b2","c2","d2");
my @array3=("a3","b3","c3","d3");
my @array_2d=(@array1,@array2,@array3);
print "@array_2d";
print "\n";
print "$array_2d[1]";
print "\n";
################
@array_2d=(\@array1,\@array2,\@array3);
print "@array_2d";
print "\n";
print "$array_2d[1]";
print "\n";
print "$array_2d[1][1]";
print "\n";
qilei@AFAAW-704030720:~/array_2d$ ./run.pl
a1 b1 c1 d1 a2 b2 c2 d2 a3 b3 c3 d3
b1
ARRAY(0x175a6e0) ARRAY(0x175a788) ARRAY(0x175a878)
ARRAY(0x175a788)
b2
qilei@AFAAW-704030720:~/array_2d$

hash(哈希,又叫散列)的引用

hash数据类型,不能直接用print "%var"去打印。究其原因,个人暂时理解为,hash数据存储方式与标量数组不一样,是key和value组合在一起的;所以不能直接打印。此时用Data::Dumper package打印hash数据,方便阅读。

但是,通过实践发现,print %var;也可以打印hash数据,但是格式不好看,不容易阅读。

qilei@AFAAW-704030720:~/array_2d$ cat 3.pl
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my %parameters=("p1"=>"xx1",
                "p2"=>"xx2",
                "p3"=>"xx3");
print %parameters;
print "\n";
print Dumper(\%parameters);
print "\n";
print "$parameters{p2}";
print "\n";

my $address = \%parameters;
print Dumper($address);
print "\n";
print %$address;
print "\n";
print $$address{p3};
print "\n";
qilei@AFAAW-704030720:~/array_2d$ ./3.pl
p3xx3p1xx1p2xx2
$VAR1 = {
          'p3' => 'xx3',
          'p1' => 'xx1',
          'p2' => 'xx2'
        };

xx2
$VAR1 = {
          'p3' => 'xx3',
          'p1' => 'xx1',
          'p2' => 'xx2'
        };

p3xx3p1xx1p2xx2
xx3
qilei@AFAAW-704030720:~/array_2d$
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简述perl的引用(包括标量、数组、hash等数据类型的引用) 的相关文章

随机推荐

  • 补码的除法运算

    补码的除法运算是将两个数都使用补码的形式来进行计算 和原码的除法相比 补码的除法运算中被除数 除数以及余数都采用双符号位的形式参与计算 最后得到的余数符号位就代表着最终结果的符号位 加减交替法 题目 假设机器字长为5位 x 0 1000 y
  • C++类中的三大函数(构造,析构,拷贝)

    下面一段话与大家共勉 每个人的一生都会遇到很多边界 有些边界可以突破 有些则不能 那些无法突破的边界就是你的极限 而划分边界的标准就是 阈值 每次突破阈值之后 人生轨迹就会发生剧烈变化 其间需要你做出很多思考和判断 直到最后找到自己的极限
  • 类模板特例化

    参考来源 C primer 中文版第5版 P626 1 举个例子 为标准库hash模板定义一个特例化版本 可以用它来将Sales data对象保存在无序容器中 默认情况下 无序容器使用hash
  • Rancher持续集成部署K8S集群的脚本

    文章目录 1 概要 2 安装 2 1 Rancher CLI安装 2 2 kubectl 安装 3 Rancher CLI 配置API Key 3 1 添加API key 3 2 测试API key 3 3 配置部署镜像的脚本 3 3 1
  • gcc常用命令的使用

    一 简介 gcc提供了30多条警告信息和3个警告级别 使用它们有助于增强程序的稳定性和可移植性 此外 gcc还对标准的C和C 语言进行了大量的扩展 提高了程序的执行效率 有助于编译器进行代码优化 能够减轻编程的工作量 二 gcc常用的编译选
  • 高性能MySQL实战(一):表结构

    最近因需求改动新增了一些数据库表 但是在定义表结构时 具体列属性的选择有些不知其所以然 索引的添加也有遗漏和不规范的地方 所以我打算为创建一个高性能表的过程以实战的形式写一个专题 以此来学习和巩固这些知识 一 实战 我使用的 MySQL 版
  • 计算机外部设备IO接口

    计算机外部设备IO接口 常见接口 术语 常见接口 接口 特点 USB 通用串行总线 Universal Serial Bus 高速率 热插拔 雏菊链 最新版本 USB 4 SCSI 小型计算机系统接口 Small Computer Syst
  • rocketmq安装、启动

    1 下载 gt wget http mirror bit edu cn apache rocketmq 4 4 0 rocketmq all 4 4 0 source release zip gt unzip rocketmq all 4
  • 做一个合格的开发,从玩转Apipost开始

    前言 也是有一段时间没更文了 最近忙于跟生活对线 今天给大家带来的是一个宝贝 Apipost 这东西做啥用 这东西做啥用 这东西做啥用 这东西做啥用 在了解这个apipost的作用之前 先听我说 谢谢你因为有你 温暖了四季 身为后端研发的我
  • 全栈之前端

    关注回复 学习交流群 加入 安全开发运维 答疑交流群 原文连接 全栈之前端 2 CSS3基础知识之选择器学习本章将主要介绍CSS选择器类型 id 类 属性伪类和伪元素及关系选择器 它是CSS规则的第一部分 常常用于元素和其他部分组合起来告诉
  • 弹球小游戏

    创建loginBall类实现开始游戏界面 package 弹球小游戏 import javax swing import java awt public class loginBall JFrame JF new JFrame 弹球小游戏
  • MySQL行转列与列转行(实现过程)

    最近工作用到了好几次列转行 做个小总结 顺道也总结一下行转列 行转列 转换之前的表格 第三 四列分别为特征和数值 图1 首先看第一次的执行sql select id name case 特征 when 年龄 then 数值 else 0 e
  • java每五分钟执行_java关于Timer schedule执行定时任务 1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等...

    1 在应用开发中 经常需要一些周期性的操作 比如每5分钟执行某一操作等 对于这样的操作最方便 高效的实现方式就是使用java util Timer工具类 private java util Timer timer timer new Tim
  • TARS-PHP,TarsPHP: TARS-PHP是针对php使用tars二进制协议,以及tars平台整体运维、RPC等一系列能力的解决方案...

    TARS PHP TARS PHP是针对php使用tars二进制协议 以及tars平台整体运维 RPC等一系列能力的解决方案 它主要由如下的几个部分组成 如果你想要快速的体验tars server 请进入examples目录 里面有详尽的三
  • 七十三.JAVA典型的数组处理

    public class LianXi public static void main String args 声明数组 int a 创建数组 a new int 10 初始化数组 for int i 0 i lt 10 i a i 0 数
  • git在Windows 下和Linux下换行符问题

    git config
  • 完全理解二叉树(下)——平衡二叉树、二叉排序树、哈夫曼树

    完全理解二叉树 上 二叉树的概念 遍历 构造以及线索化 完全理解二叉树 中 二叉树与树 森林的转化及遍历 1 平衡二叉树 二叉树可以用于查找元素 对于如下这颗二叉树 对其的遍历相当于对链表的遍历 因此找到元素5需要从头开始 查找5次 但是如
  • 全网最详细的下载、安装和使用绘图神器draw.io(drawio),它比visio,processon,wps,亿图图示等更好用,最重要的是它免费

    文章目录 1 引言 2 下载draw io 3 安装draw io 4 使用draw io 5 其他下载和安装draw io方式 6 在线draw io 1 引言 记得大学写毕业论文时就用到了流程图 因为它是不可或缺的一种论文配图 流程图除
  • 2023 VScode安装教程【超详细】看这一篇就够了

    一 VScode下载 1 进入VScode官网 官网地址 https code visualstudio com 点击 Download 进入下载 不要点击 Download for Windows Stable Build 否则它会自动帮
  • 简述perl的引用(包括标量、数组、hash等数据类型的引用)

    perl的引用 数组的解引用 二维数组的引用 hash哈希又叫散列的引用 perl的引用 类似C语言的指针 意义都是指向一个内存空间的地址 比如下述例子中 脚本输出的信息SCALAR 0x7836d0 代表标量数据的存储地址 ARRAY 0