第三章 Perl语言(一)-名字和变量

和口语类似,Perl语言由几个互相关联的小部分组成。
但是也有不同,口语能在概念模糊甚至轻微误解的情况下进行交流,但Perl做不到,计算机语言要求必须准确。得益于Perl的设计特点,你无需掌握Perl语言的所有细节就能写出有用的代码,但你必须明白Perl各个部分之间是如何协同工作的。

名字

名字在Perl程序里随处可见,你可以为变量、函数、包、类甚至文件句柄取个名字,这样就能更好的识别它。Perl里规定有效的名字都是以字母或下划线开头,可以包含字母、数字、和下划线。当启用utf8后,还可以使用UTF-8字符作为名字。

这些名字都是有效的:

my $name;
my @_private_names;
my %Names_to_Addresses;
sub anAwkwardName3;

# with use utf8; enabled
package Ingy::Döt::Net;

而这些是无效的命名:

my $invalid name;
my @3;
my %~flags;
package a-lisp-style-name;

名字的存在主要是为了方便程序员。起个好名字能帮助程序员区分和理解程序(提高可读性)。Perl也允许你以动态生成和外部输入的内容作为名字,这个特性得益于Perl的“符号查找”机制。“符号查找”机制提供了高度灵活性,但是却也带来了安全风险,而且还会让降低代码可读性,所以不建议使用。

名字和记号

变量的名字总会带着一个记号,这个记号标识了变量值的类型。
标量类型用美元符号标识;数组类型用@符号标识;哈希类型用%标识:

my $scalar;
my @array;
my %hash;

不同记号有不同的命名空间,所以可以用不同的记号声明相同名字的变量,但是代表的东西可不一样啊。例如:

my ($bad_name, @bad_name, %bad_name);

这表示了3个完全不同的变量:一个标量,一个数组,一个哈希。Perl不会搞错,但是读代码的人却可能会搞错,所以不建议这样使用。

使用什么记号,取决于你期望什么。如果你要访问数组或哈希中的单个值就使用美元记号($):

my $hash_element = $hash{ $key };
my $array_element = $array[ $index ]
$hash{ $key } = 'value';
$array[ $index ] = 'item';

如果你要访问数组或哈希中的多个值,就必须使用@记号,这个操作也叫做切片:

my @hash_elements = @hash{ @keys };
my @array_elements = @array[ @indexes ];

名字空间

名字多了就容易重复,为了管理名字,Perl提供了一个叫命名空间的机制。命名空间就是一个全局唯一的名称集合。命名空间分层组织,不同层次使用双冒号(::)连接。如:

DessertShop::IceCream    表示甜点商店(DessertShop)里冰激凌(IceCream)的命名空间

在对应命名空间内,我们可以直接使用层级中成员的名字进行访问;但在对应的命名空间外,则必须使用完整的名字(完全限定名)来访问。
比如若处于DessertShop::IceCream的名字空间中,(假设里面有个名叫add_sprinkles()函数),我们可以直接使用add_sprinkles()调用该函数。如果不在这个命名空间内则需要使用完全限定名DessertShop::IceCream::add_sprinkles()来调用该函数。

一个包就代表一层命名空间。Perl约定所有包的名字都是以大写字母开头。
Perl中所有的命名空间都是全局可见的。通过使用完整名字可以访问任何命名空间。

变量

在Perl里,一个变量就是一个值容器。我们当然可以不使用变量,去直接操作值,但是绝大多数程序都会使用变量来抽象逻辑。用变量来代表值会让程序更有效,更抽象。
比如我们会用a,b,c来代表三角形的三边长来表述勾股定理,而不是使用具体数值。

变量作用域

所谓变量的作用域就是指在这个范围内你可以访问该变量。你遇到的作用域通常就是指词法作用域,词法作用域是代码块(花括号{ }之间),或者是整个文件:

package Store::Toy;
my $discount = 0.10;
package Store::Music;
# 仍然可以访问$discount,package声明并不影响词法作用域
say "Our current discount is $discount!";

我们可以使用代码块来限定词法作用域:

package Store::Toy
{
my $discount = 0.10;
}
package Store::Music
{
# $discount 这里不可见
}
package Store::BoardGame;
# $discount 仍然不可见

变量记号

我们已经知道不同的记号代表不同类型的变量值。对不同记号的变量赋值也就指定了不同的语境:

#对列表类型(切片)赋值就给定了列表语境,这样就会在列表语境下调用 some_function()
@values[ @indexes ] = some_function()

#对标量赋值就给定了标量语境,这样就是在标量的语境下对右边的表达式求值
my $element = @values[ @indices ]

匿名变量

Perl的变量并不一定要有名字。正如前面所说,名字的存在是为了帮助程序员理解程序,提高可读性。在创建变量时不给予名字那么这个变量就叫匿名变量。匿名变量只能通过引用访问。

变量,类型,和语境

了解变量类型,记号和语境之间的联系对深入理解Perl是必需的。
变量就是一个存储值的容器。在perl的设计中,容器的类型是不可变的。比如我们无法让一个标量类型的变量转换成数组类型。但对变量施加一个特定值类型的操作时将导致一些行为的转变以适应期望类型。
比如在标量语境中数组将返回元素的数量:

my $count = @items;

这个例子中 $count 仍然是标量类型,它不会变成数组。@items是数组,在标量语境会返回元素的数量(标量类型)以适应$count。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容