`
zccst
  • 浏览: 3310450 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

perl脚本——引用和指针

    博客分类:
  • perl
 
阅读更多
一、使用反斜线(\)操作符
反斜线操作符与C语言中传递地址的操作符&功能类似。一般是用\创建变量又一个新的引用。下面为创建简单变量的引用的例子:
    $variavle = 22;
    $pointer = \$variable;
    $ice = "jello";
    $iceprt = \$ice;
    引用$pointer指向存有$variable值的位置,引用$iceptr指向"jello"。即使最初的引用$variable销毁了,仍然可以通过$pointer访问该值,这是一个硬引用,所以必须同时销毁$pointer和$variable以便该空间释放到内存池中。
    在上面的例子中,引用变量$pointer存的是$variable的地址,而不是值本身,要获得值,形式为两个$符号,如下:
    #!/usr/bin/perl
    $value = 10;
    $pointer = \$value;
    printf "\n Pointer Address $pointer of $value \n";
    printf "\n What Pointer *($pointer) points to $$pointer\n"; 

    结果输出如下:

    Pointer Address SCALAR(0x806c520) of 10
    What Pointer *(SCALAR(0x806c520)) points to 10

    每次运行,输出结果中的地址会有所改变,但可以看到$pointer给出地址,而$$pointer给出$variable的值。
    看一下地址的显示,SCALAR后面一串十六进制,SCALAR说明该地址指向简单变量(即标量),后面的数字是实际存贮值的地址。
    注意:指针就是地址,通过指针可以访问该地址处存贮的数据。如果指针指向了无效的地址,就会得到不正确的数据。通常情况下,Perl会返回NULL值,但不该依赖于此,一定要在程序中把所有的指针正确地初始化,指向有效的数据项。


2,引用与数组
关于Perl语言应该记住的最重要的一点可能是:Perl中的数组和哈希表始终是一维的。因此,数组和哈希表只保存标量值,不直接存贮数组或其它的复杂数据结构。数组的成员要么是数(或字符串)要么是引用。
    对数组和哈希表可以象对简单变量一样使用反斜线操作符,数组的引用如下:
    1  #!/usr/bin/perl
    2  #
    3  # Using Array references
    4  #
    5  $pointer = \@ARGV;
    6  printf "\n Pointer Address of ARGV = $pointer\n";
    7  $i = scalar(@$pointer);
    8  printf "\n Number of arguments : $i \n";
    9  $i = 0;
    10 foreach (@$pointer) {
    11   printf "$i : $$pointer[$i++]; \n";
    12 } 

    运行结果如下:
$ test 1 2 3 4
Pointer Address of ARGV = ARRAY(0x806c378)
Number of arguments : 4
0 : 1;
1 : 2;
2 : 3;
3 : 4;    

第5行将引用$pointer指向数组@ARGV,第6行输出ARGV的地址。$pointer返回数组第一个元素的地址,这与C语言中的数组指针是类似的。第7行调用函数scalar()获得数组的元素个数,该参数亦可为@ARGV,但用指针则必须用@$pointer的形式指定其类型为数组,$pointer给出地址,@符号说明传递的地址为数组的第一个元素的地址。第10行与第7行类似,第11行用形式$$pointer[$i]列出所有元素。
    对关联数组使用反斜线操作符的方法是一样的--把所有关联数组名换成引用$poniter。注意数组和简单变量(标量)的引用显示时均带有类型--ARRAY和SCALAR,哈希表(关联数组)和函数也一样,分别为HASH和CODE。

下面是哈希表的引用的例子。

    #!/usr/bin/perl
    1  #
    2  # Using Associative Array references
    3  #
    4  %month = (
    5   '01', 'Jan',
    6   '02', 'Feb',
    7   '03', 'Mar',
    8   '04', 'Apr',
    9   '05', 'May',
    10  '06', 'Jun',
    11  '07', 'Jul',
    12  '08', 'Aug',
    13  '09', 'Sep',
    14  '10', 'Oct',
    15  '11', 'Nov',
    16  '12', 'Dec',
    17  );
    18
    19 $pointer = \%month;
    20
    21 printf "\n Address of hash = $pointer\n ";
    22
    23 #
    24 # The following lines would be used to print out the
    25 # contents of the associative array if %month was used.
    26 #
    27 # foreach $i (sort keys %month) {
    28 # printf "\n $i $$pointer{$i} ";
    29 # }
    30
    31 #
    32 # The reference to the associative array via $pointer
    33 #
    34 foreach $i (sort keys %$pointer) {
    35   printf "$i is $$pointer{$i} \n";
    36 } 


    结果输出如下:

    $ mth
    Address of hash = HASH(0x806c52c)
    01 is Jan
    02 is Feb
    03 is Mar
    04 is Apr
    05 is May
    06 is Jun
    07 is Jul
    08 is Aug
    09 is Sep
    10 is Oct
    11 is Nov
    12 is Dec

    与数组类似,通过引用访问哈希表的元素形式为$$pointer{$index},当然,$index是哈希表的键值,而不仅是数字。还有几种访问形式,此外,构建哈希表还可以用=>操作符,可读性更好些。下面再看一个例子:
    1  #!/usr/bin/perl
    2  #
    3  # Using Array references
    4  #
    5  %weekday = (
    6    '01' => 'Mon',
    7    '02' => 'Tue',
    8    '03' => 'Wed',
    9    '04' => 'Thu',
    10   '05' => 'Fri',
    11   '06' => 'Sat',
    12   '07' => 'Sun',
    13   );
    14 $pointer = \%weekday;
    15 $i = '05';
    16 printf "\n ================== start test ================= \n";
    17 #
    18 # These next two lines should show an output
    19 #
    20   printf '$$pointer{$i} is ';
    21   printf "$$pointer{$i} \n";
    22   printf '${$pointer}{$i} is ';
    23   printf "${$pointer}{$i} \n";
    24   printf '$pointer->{$i} is ';
    25
    26   printf "$pointer->{$i}\n";
    27 #
    28 # These next two lines should not show anything 29 #
    30   printf '${$pointer{$i}} is ';
    31   printf "${$pointer{$i}} \n";
    32   printf '${$pointer->{$i}} is ';
    33   printf "${$pointer->{$i}}";
    34 printf "\n ================== end of test ================= \n";
    35 

    结果输出如下:

    ================== start test =================
    $$pointer{$i} is Fri
    ${$pointer}{$i} is Fri
    $pointer->{$i} is Fri
    ${$pointer{$i}} is
    ${$pointer->{$i}} is
    ================== end of test =================

    可以看到,前三种形式的输出显示了预期的结果,而后两种则没有。当你不清楚是否正确时,就输出结果看看。在Perl中,有不明确的代码就用print语句输出来实验一下,这能使你清楚Perl是怎样解释你的代码的。

分享到:
评论

相关推荐

    Perl 语言常见问题集

    10. **脚本命令行参数**:Perl脚本可以通过@ARGV数组接收命令行参数,这在编写可定制的脚本时非常实用。 "中国IT认证实验室学习下载频道.txt"可能包含了一些学习资源链接或者教程推荐,可以帮助进一步深入学习Perl...

    Perl DBI 参考(强烈推荐)

    首先,DBI使用了类似于C语言中的指针的概念,但在Perl中称为引用,这些引用指向的对象被称为句柄。句柄是DBI中非常重要的概念,它们主要有三种类型:数据库对象句柄($dbh)、语句(查询)对象句柄($sth)和通用...

    perl速成教程

    Perl是一种强大的、灵活的脚本语言,主要用于文本处理、系统管理、网络编程和Web开发等领域。Perl由Larry Wall于1987年创建,它的设计融合了C、sed、awk等语言的特点,使得它在处理文本和数据时具有独特的优势。 在...

    Perl语言教程 Perl语言入门

    9. **引用**:Perl的引用允许你创建指向其他数据结构的指针,如 `my $ref = \$scalar;` 创建一个指向标量的引用。 10. **异常处理**:Perl使用 `eval { ... }` 语句块捕获异常,并通过 `$@` 变量获取错误信息。 ...

    perl-24学时搞定

    - 文件指针和文件模式(如`、`>`、`<>`)的理解。 - 文件测试运算符(如 `-e`、`-f`、`-d`)用于检查文件属性。 - 处理文件和目录的系统调用,如`chdir`、`mkdir`。 6. **第6学时:模式匹配** - 正则表达式...

    Perl-Tutorial

    3. **文件操作**: 打开、读取、写入和关闭文件,以及文件指针和文件测试操作。 4. **模块使用**: 如何从CPAN下载和安装模块,以及如何在程序中使用模块。 5. **面向对象编程**: 类、对象、继承、封装等面向对象编程...

    PERL编程24学时教程

    安装完成后,学习设置环境变量以确保Perl脚本能正常运行。 2. **Perl语法基础** - 学习Perl的语句结构,包括注释、变量声明、赋值操作、输入/输出语句。了解Perl中的数据类型,如标量、数组、哈希以及引用。 3. **...

    Learning perl

    6. **模块和CPAN**:Perl拥有一个庞大的第三方库—— Comprehensive Perl Archive Network (CPAN),包含数千个模块,用于扩展Perl的功能。学会如何使用`cpan`或`cpanm`安装和使用模块,是提升编程效率的关键。 7. *...

    Linux C程序设计大全

    4.4.6 const关键字修饰指针——在指针定义之前和定义之中 4.4.7 使用const关键字的意义 第5章 C语言的高级技术 第2篇 C语言开发环境 第6章 vi与vim编辑器 第7章 gcc编译器 第8章 makefile 第9章 gdb 第3篇 Linux进程...

    Note of Learning Perl--Filehandles and File Tests

    《Perl学习笔记——文件句柄与文件测试》 在Perl编程中,文件处理是不可或缺的一部分。文件句柄和文件测试是Perl操作文件的核心工具,它们允许我们...通过不断练习和理解,你将能够编写出更加灵活和可靠的Perl脚本。

    FFI-Platypus:使用FFI将Perl绑定写入非Perl库。 无需XS

    2. **导入FFI-Platypus**:在Perl脚本中使用`use FFI::Platypus;`引入模块。 3. **定义C数据类型**:根据C库的头文件,使用Perl语法定义相应的数据类型。 4. **声明C函数**:同样基于头文件,声明要调用的C函数,...

    Internet的自由语言——PHP.pdf

    PHP的语法融合了C、Java、Perl的特点,去除了C中的指针复杂性,同时具有解释性语言的便捷性。 PHP的运行机制是这样的:当用户请求一个包含PHP代码的页面时,服务器端会解析并执行这些PHP语句,将结果与HTML代码合并...

    Intermediate-Perl:练习来自O'Reilly同名书籍的解决方案

    2. **模块和CPAN**:Perl拥有丰富的模块库—— Comprehensive Perl Archive Network (CPAN),可以便捷地引入第三方代码。学会使用`cpan`或`cpanm`安装和管理模块,了解`use`和`require`关键字的差异。 3. **正则...

    Perl docs in PDF-开源

    4. **文件和I/O操作**:涵盖打开、关闭文件,读写操作,以及如何处理文件指针和文件句柄。 5. **模块和CPAN**:介绍Perl的模块系统,以及 Comprehensive Perl Archive Network (CPAN) —— 世界上最大的开源软件...

    完全用Python工作---Harness the power of Python

    例如,C语言需要处理复杂的内存管理和指针操作,而Python通过自动内存管理简化了这一过程;C++的学习曲线陡峭,而Python则更容易上手;Java虽然有着广泛的应用,但其框架如Spring复杂度较高,且Lambda表达式引入较晚...

    alx-low_level_programming

    Perl是一种功能强大的脚本语言,虽然常用于文本处理和Web开发,但它同样具有进行低级编程的能力。 Perl最初由Larry Wall设计,旨在结合AWK和sed的优点,并弥补它们的不足。Perl的语法灵活且富有表现力,这使得它在...

    boost-1-85-0.tar.gz.zip

    标题中的"boost-1-85-0.tar.gz.zip"指示我们正在处理的是Boost库的一个特定版本——1.85.0,这个版本已经被打包成两层压缩格式:首先是`.tar`,它是一个归档文件,用于将多个文件和目录组合到一起;接着是`.gz`,这...

    操作系统(内存管理)

    文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半手工地管理内存,以及如何使用垃圾收集自动管理内存。 为什么必须管理内存 内存管理是计算机编程最为基本的...

Global site tag (gtag.js) - Google Analytics