perl学习之裸字

use strict包含3个部分。其中之一(use strict "subs")负责禁止乱用的裸字

这是什么意思呢?

如果没有这个限制,下面的代码也可以打印出"hello"。

my $x = hello;
print "$x\n";    # hello

这样使用不符合我们平常把字符串放在引号里的习惯,但是Perl默认是允许(使用)裸字——没有引号的单词——来作为字符串。

上面的代码输出"hello"。

当然至少在脚本顶部默认添加"hello"函数之前(是这样):

sub hello {
  return "zzz";
}

my $x = hello;
print "$x\n";    # zzz

在新版本中,Perl看到了hello()函数,调用它(函数)并将结果赋值给$x。

之后,如果有人将这个函数放在文件的结尾(赋值之后),Perl在赋值的时候就看不到函数,又回到老样子了:把"hello"赋给$x。

是的,你肯定不想自己陷入麻烦。那么请在代码中使用use strict来禁止裸字hello出现在代码中,从而避免困惑。

use strict;

my $x = hello;
print "$x\n";

会给出如下错误:

Bareword "hello" not allowed while "strict subs" in use at script.pl line 3.
Execution of script.pl aborted due to compilation errors.

裸字的正确使用

即便开启了use strict "subs"还是有些地方可以使用裸字。

首先,用户自定义的函数名就是裸字。

同样,在提取哈希表元素花括号里也使用了裸字,以及胖箭头=>的左边也可以没有引号。

use strict;
use warnings;

my %h = ( name => ‘Foo‘ );

print $h{name}, "\n";

上面代码中的"name"都是裸字,它们在use strict的时候也是有效的。

时间: 2024-10-28 16:11:03

perl学习之裸字的相关文章

PERL学习笔记---正则表达式的应用

使用m//匹配 //这是m//(模式匹配)的一种简写.同qw//操作一样,可以使用任何成对的分隔符.因此,可以使用m(fred), m<fred>, m{fred}, m[fred],或者m,fred,, m!fred!, m^fred^,其它非成对的分隔符也可以 不区分大小写:/i if(/yes/i) {#大小写无关 print “In that case, I recommend that you go bowling.\n”;} 匹配任何字符:/s 默认情况下,点(.)不匹配换行符,这

Perl学习笔记(一)--简介

1. 查看当前所用Perl版本号 ? 1 perl –v 2.  一个简单的Perl程序 ? 1 2 3 print "hello world"; #这是注释 执行它: ? 1 Perl helloWorld.txt 文件名后缀可以是pl可以是txt 3. 一个稍微复杂点的Perl程序 ? 1 2 3 4 5 6 @line = `perldoc -u -f atan2`; //运行一个外部命令,通过反引号来调用,将输出结果一行行依次存储在@line这个数组变量中 foreach(@l

perl学习笔记--搭建开发环境

windows下perl开发环境搭建 perl下载地址:http://www.activestate.com/developer-tools 各个插件的安装方法:(通过代理上网的方法) 方法一:padwalker的安装步骤 1. padwalker下载地址: http://www.bribes.org/perl/ppm/ 2. 解压下载的文件 4. 拷贝 blib/lib/PadWalker.pm 到 Perl/lib(你的安装路径)5. 拷贝 blib/arch/auto/PadWalker

Perl 学习笔记-高级控制结构

1.unless控制结构 类似于独立的else语句; 要么条件为真, 要么执行语句块内的代码;  unless(<condition>){code...;} 等价于  if(<condition>){}else{code...;}  也就是当条件为假是执行. unless (0) { print "Hello"; #Hello } 2. until控制结构 until就是改装过的while, 区别在于它在条件为假是执行代码块. $i = 2;$j = 10; u

perl学习 之:my local our

范围声明 和全局声明类似,词法范围声明也是在编译时起作用的.和全局声明不同的是,词法范围声明的作用范围是从声明开始到闭合范围的最里层(块,文件,或者 eval--以先到者为准).这也是为什么我们称它为词法范围,尽管"文本范围"可能更准确些,因为词法范围这个词实在和词法没什么关系.但是全世界的计算机科学家都知道"词法范围"是什么意思,所以在这里我们还是用这个词. Perl 还支持动态范围声明.动态范围同样也伸展到最里层的闭合块,但是这里的"闭合"是

继续Perl学习 递归

有一段时间学习PYTHON,很伤心啊,版本太新,好多东西用起来不方便. 还是继续用我的小***perl吧,我相信perl会解决掉我遇到的大部分问题! 一.统计随机数出现频次 --源代码 --- 结果显示 二.递归应用,阶乘算法 --代码 -- 结果

perl学习之:use and require

本文和大家重点学习一下Perl use和require用法对比,这两个函数都是一个意思,加载和引用Perl的模块,或者是子程序,区别在于Perl use是在当前默认的里面去寻找,一旦模块不在指定的区域内的化,用Perl use是不可以引入的. Perl use和require用法对比 对比(一)说明: 这两个函数都是一个意思,加载和引用Perl的模块,或者是子程序, 区别在于Perl use是在当前默认的里面去寻找,一旦模块不在指定的区域内的化,用Perl use是不可以引入的 第一.Perl

perl学习笔记之:模式匹配,模块,文档

Perl语言的最大特点,也是Perl作为CGI首选语言的最大特点,是它的模式匹配操作符.Perl语言的强大的文本处理能力正是通过其内嵌的对模式匹配的支持体现的.模式通过创建正则表达式实现.Perl的正则表达式与模式匹配的特点一是内嵌于语言之中,而不是通过库或函数来实现,因此使用更简便:二是比一般的正则表达式与模式匹配功能强大. 模式匹配操作符简介 操作符 意义 实例 =~ 匹配(包含) !~ 不匹配(不包含) m// 匹配 $haystack =~ m/needle/ $haystack =~

perl学习之文件句柄filehandle

句柄handle 分为文件句柄和目录句柄,文件句柄实际上包含文件,进程和套接字的读写. 文件句柄的操作步骤 open(FD,"filename"); @lines=<FD>; close(FD); open()由以下几个用法 open(FD,"> filename") 写数据进文件 open(FD,">> filename") 追加数据进文件 open(FD,"filename") 读文件 ope