我觉得这一系列的标题应该是:PERL,从入门到放弃

USE IT OR U WILL LOSE IT

参考资料:

https://qntm.org/files/perl/perl.html

在线perl编译器:

https://www.tutorialspoint.com/execute_perl_online.php


use strict;
use warnings;
# no block comments # variables: use 'my' for declaration
# 1. scalars: undef(like NULL), number, string, reference to any other variables
# no distinguish between float and int
my $num = 12.34;
# use '.' for string concatenation
my $str = "hello, "."m'lady";
print $str."\n";
# no boolean type. but "false" in condition means: 0,"","0",undef
# 2. arrays: use @variableName
# trailing comma is OK
my @arr = (1, "hi", 3,);
# use '$' because it's scala when retrived
print $arr[0]."\n";
# negative index means retriving from backend
print "$arr[-2]\n";
# '' will not interpret, just output raw string
# "" will interpret variables
# they're same: print 'Hello \$str \@arr'
print "Hello \$str \@arr" # OPERATORS
# Numerical operators: <, >, <=, >=, ==, !=, <=>, +, *
# String operators: lt, gt, le, ge, eq, ne, cmp, ., x

啦啦啦今天继续啊

数组长度:

my @arr = (2, "Hi", "my", "lady", "!");
# the length of array
print scalar @arr;
print "\n";
# the end index of array. aka, length-1
print $#arr;
  • hash Tables:
use strict;
use warnings; # hash variable
my %hashTable = ("1st" => "hi",
"2nd" => "my",
"3rd" => "lady");
# since some element is a scalar
print $hashTable{"1st"};
use strict;
use warnings; my %hashTable = (1=>"hi", 2=>"my", "3rd"=>"lady"); # convert to array
my @arr = %hashTable;
# 1hi2my3rdlady
print @arr;
# output 1
print $arr[0]; # 索引时hash用{},array[],""有无无所谓;构建时两者都用() 
#print $hashTable{1};
#print $hashTable{"1"};
  • list  

列表指的是用()构建的东西,array和hash都是。列表可以作为一个元素放在列表中间,但是会失去层次结构。hash的话,

use strict;
use warnings; my @array = (
"apples",
"bananas",
(
"inner",
"list",
"several",
"entries",
),
"cherries",
);
my $i = 0;
while ($i <= $#array) {
print "array[$i] is ".$array[$i]."\n";
$i = $i + 1;
}

但其实list与array还是不同的,如下例:

my @arr = ("alpha", "beta", "gamma", "pie");
# 这里得到arr的长度
my $num = @arr;
print "$num\n";
# output: pie $num1存的是最后一项
my $num1 = ("alpha", "beta", "gamma", "pie");
print "$num1\n";

Every expression in Perl is evaluated either in scalar context or list context

而对很多函数来说,对scalar和list的处理方式是不同的,如reverse:

# link. no reverse
print reverse "hello, my lady", 3, " ";
print "\n";
# reverse each letter
my $scalar = reverse "hello, my lady";
print "$scalar\n";

可以在前面强制加scalar,让函数可以按照scalar的方式处理:

print scalar reverse "hello world"; # "dlrow olleh"  

而在下面的例子中,给$outer[3]赋值时,由于它是scalar,所以取得的值只能是数组长度,而非数组。

my @outer = ("Sun", "Mercury", "Venus", undef, "Mars");
my @inner = ("Earth", "Moon"); $outer[3] = @inner; print $outer[3]; # "2"  

好吧,为了解决这个问题,使用引用:

my $colour    = "Indigo";
# add reference
my $scalarRef = \$colour;
print $colour; # "Indigo"
print $scalarRef; # e.g. "SCALAR(0x182c180)"
print ${ $scalarRef }; # "Indigo"
# 如果不会混淆,可以省略{}
print $$scalarRef; my @colours = ("Red", "Orange", "Yellow", "Green", "Blue");
my $arrayRef = \@colours; print $colours[0]; # direct array access
print ${ $arrayRef }[0]; # use the reference to get to the array
print $arrayRef->[0]; # exactly the same thing my %atomicWeights = ("Hydrogen" => 1.008, "Helium" => 4.003, "Manganese" => 54.94);
my $hashRef = \%atomicWeights; print $atomicWeights{"Helium"}; # direct hash access
print ${ $hashRef }{"Helium"}; # use a reference to get to the hash
print $hashRef->{"Helium"}; # exactly the same thing - this is very common

我们希望定义自己的数据类型,类似C++里类的概念,所以我们这样做:

# Braces denote an anonymous hash
my $owner1Ref = {
"name" => "Santa Claus",
"DOB" => "1882-12-25",
}; my $owner2Ref = {
"name" => "Mickey Mouse",
"DOB" => "1928-11-18",
}; # Square brackets denote an anonymous array
my $ownersRef = [ $owner1Ref, $owner2Ref ]; my %account = (
"number" => "12345678",
"opened" => "2000-01-01",
"owners" => $ownersRef,
);

注意,这里$owner1Ref和$owner2Ref存的其实是一个匿名hash的引用,$ownersRef存的则是匿名array的引用。既然时候引用,

它们的实际值就是地址。所以%account中才能够保存完整的信息。等价于:

my %account = (
"number" => "31415926",
"opened" => "3000-01-01",
"owners" => [
{
"name" => "Philip Fry",
"DOB" => "1974-08-06",
},
{
"name" => "Hubert Farnsworth",
"DOB" => "2841-04-09",
},
],
); 

如何打印?使用->

print "Account #", $account{"number"}, "\n";
print "Opened on ", $account{"opened"}, "\n";
print "Joint owners:\n";
print "\t", $account{"owners"}->[0]->{"name"}, " (born ", $account{"owners"}->[0]->{"DOB"}, ")\n";
print "\t", $account{"owners"}->[1]->{"name"}, " (born ", $account{"owners"}->[1]->{"DOB"}, ")\n";

  

  

  

perl-basic-数据类型&引用的更多相关文章

  1. Delphi、C C++、Visual Basic数据类型的对照 转

    Delphi.C C++.Visual  Basic数据类型的对照 变量类型 Delphi C/C++ Visual Basic 位有符号整数 ShortInt char -- 位无符号整数 Byte ...

  2. [Perl系列—] 2. Perl 中的引用使用方法

    Perl 中的引用,为什么要使用引用? 对于熟悉C语言的开发人员来说, 指针这个概念一定不陌生. Perl 的引用就是指针,能够指向变量.数组.哈希表甚至子程序. Perl5中的两种Perl引用类型为 ...

  3. perl 对象 bless 引用

    [root@dr-mysql01 ~]# cat aa.pl use LWP::UserAgent; use Data::Dumper; my $ua = LWP::UserAgent->new ...

  4. perl 函数回调 引用$client->run(sub {$client->sync});

    匿名函数引用: [root@wx03 wx]# perl a1.pl CODE(0x2077b30) test [root@wx03 wx]# cat a1.pl $ref= sub {return ...

  5. 【转载】Perl中的引用

    为什么使用引用? 在perl4中,hash表中的value字段只能是scalar,而不能是list,这对于有些情况是很不方便的,比如有下面的数据: Chicago, USAFrankfurt, Ger ...

  6. perl 中的引用

    perl 语言中的引用共分为两类: 声明引用时只需要在对象的前面加上反斜杠 第一列是数组的引用: 代码示例: , , ); my $array_ref = \@array; 第二种是哈希的引用 代码示 ...

  7. perl的匿名引用

    perl中列表不能嵌套,只能通过引用的方式构建复杂的结构.引用其实就是c中的指针,只不过perl中对指针,也就是一个地址的声明和取值有自己的一套方法. 1.先复习普通标量的引用方法: [vagrant ...

  8. perl 引用(数组和hash引用) --- perlreftut - Mark 的一个简单的'引用'教程 ---Understand References Today. --Mark Jason Dominus, Plover Systems (mjd-perl-ref+@plover.com)

    https://blog.csdn.net/fangwei1235/article/details/8570886 首页 博客 学院 下载 论坛 APP 问答 商城 活动 VIP会员 招聘 ITeye ...

  9. Java入门(6)——集合、基本数据类型和引用数据类型的相互转换

    集合: 1.HashMap ---->  类 概述: 通过key可以找到value, key就是键, values就是值. 俗称键值对. 特点: 无序的    值可以重复  键不可以重复的  如 ...

  10. 6、perl创建模块(Exporter)及路径 引用 嵌套 查询模块

    参考博客:http://www.cnblogs.com/xudongliang/tag/perl/ 1.perl 模块的创建以及制定perl 模块的路径 (1)创建一个Myfun.pm模块. #/us ...

随机推荐

  1. CS round--36

    https://csacademy.com/contest/round-36/summary/ C题是一个贪心,最坏情况是,一开始肯定是每一对袜子都抽一个,然后就需要N个袜子了.后面的情况就是相同的了 ...

  2. Centos安装TensorFlow和Keras

    安装命令如下: curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python get-pip.py pip install tensor ...

  3. scp 可以在 2个 linux 主机间复制文件

    Linux scp命令用于Linux之间复制文件和目录,具体如何使用这里好好介绍一下,从本地复制到远程.从远程复制到本地是两种使用方式.这里有具体举例: ================== Linu ...

  4. Oracle中文乱码,字符集问题处理

    1. 右键计算机,选择属性,增加环境变量 NLS_LANG:SIMPLIFIED CHINESE_CHINA.ZHS16GBK 2.进入注册表,依次单击HKEY_LOCAL_MACHINE --> ...

  5. c#线程倒计时器源码

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  6. nodejs 实践:express 最佳实践(七) 改造模块 connect2 解析

    nodejs 实践:express 最佳实践(七) 改造模块 connect2 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的 ...

  7. 一个好用的压力测试工具tsung

    一个好用的压力测试工具tsung          前段时间一直在忙各种事情,快三周没弄过引擎了,今天有点时间,正好之前写的服务器引擎也到了收尾测试的阶段,于是就研究了下怎么测试服务器压力.      ...

  8. SpringBoot 2.x (14):WebFlux响应式编程

    响应式编程生活案例: 传统形式: 一群人去餐厅吃饭,顾客1找服务员点餐,服务员把订单交给后台厨师,然后服务员等待, 当后台厨师做好饭,交给服务员,经过服务员再交给顾客1,依此类推,该服务员再招待顾客2 ...

  9. angularjs e2e测试初步学习(一)

    e2e测试是从用户角度出发,认为整个系统都是一个黑盒,只有UI暴露出来. angularjs的测试框架是采用protractor. 1.创建文件 首先创建一个项目文件夹test,然后再创建两个文件,一 ...

  10. 超图supermap sdx数据库用sql实现空间查询

    在此介绍用sql对超图的空间数据库(sdx)进行空间查询,优点如下: 1.超图推荐的方式是用iobject,此方法要引入iobject 2.超图另一个推荐的方式是用iserver的REST接口,但we ...