文件句柄相关变量

对应的官方手册:http://perldoc.perl.org/perlvar.html#Variables-related-to-filehandles

默认情况下:

  • $/:输入行的分隔符以换行符为单位,可以使用$/指定
  • $\:print输出行的分隔符为undef,可以使用$\指定,例如指定换行符"\n"
  • $,:print输出列表(也就是每个逗号分隔的部分)的字段分隔符为undef,可以使用$,指定,例如指定空格
  • $":默认在双引号上下文中,数组被输出的时候是使用空格作为分隔符的,可以使用$"指定列表分隔符
  • $.:当前处理到的行号$.。它是一个行号计数器。文件句柄关闭时会重置行号
    • 由于读取文件的输入符号<>从不会显式关闭文件句柄,所以从命令行ARGV读取的文件行号会不断增加
  • $ARGV:表示当前处理的命令行参数中的文件,注意区分:
    • @ARGV表示命令行参数
    • $ARGV[N]表示的是@ARGV数组中的某个元素
    • $ARGV是命令行参数中各文件列表,perl当前正在处理的文件
  • $|:控制写入或输出数据时是否先放进缓冲再刷入文件句柄
    • 值为0时,表示先缓存,缓冲了一段数据之后再刷入文件句柄通道
    • 值为非0时,表示直接刷入文件句柄通道
    • 在使用管道、套接字的时候,建议设置为非0值,以便数据能立刻被处理
    • 该变量只对写数据或输出有效,对读取操作无效

注意:输出的分隔符只适用于print,不适用say。

例如:

1.指定输出行分隔符$\。这样每次输出的时候,会自动在输出语句的尾部加上这个分隔符。可以指定多个字符作为分隔符。

{
my $\ = "\n";
print "new line1";
print "new line2";
print "new line3";
# 可以指定多个字符:$\ = "YYY"
}

上面将换行输出各行。

2.指定输出字段分隔符$,。这样print语句中每个逗号隔开的地方都会按照指定的分隔符输出。

{
my $,="-";
print "new field1","new field2","new field3","\n";
# 可以指定多个字符:$, = "YYY"
}

上面将输出:new field1-new field2-new field3

3.数组输出字段分隔符$"。当print的输出列表中有数组,且数组使用双引号包围的时候(即双引号上下文中数组替换),默认数组元素是使用空格分隔的,该分隔符指定元素之间的分隔符。

#!/usr/bin/perl
{
$"="x";
@arr=qw{perl python shell};
print "@arr","\n";
}

上面将输出:"perlxpythonxshell"。

4.$.表示当前处理到的行号。文件句柄关闭时会重置行号,但重新打开文件句柄时不会重置。但由于读取文件的输入符号<>从不会显式关闭文件句柄,所以ARGV读取的文件行号会不断增加。

#!/usr/bin/perl

# 打开文件,看行号
open LOG1,"<","test.log";
while(<LOG1>){
print "Line $.: $_";
}
print "---------------------\n";
close LOG1; # 关闭上面的文件句柄后,再打开一次文件句柄,行号重置
open LOG2,"<","test.log";
while(<LOG2>){
print "Line $.: $_";
}
print "---------------------\n";
close LOG2; # 从<>读内容,行号一直变大
while(<>){
print "Line $. from $ARGV: $_";
}

5.$/控制的是输入行分隔符。在读取文件的时候,通过该特殊变量可以控制如何分行。

例如,以下是test1.log文件的内容:

a
b
x
c
d
x
e

以下是15.plx的源代码:

$/="x";
while(<>){
print "Line $.: $_","\n";
}

执行的结果:

注意换行符"x"也会保留在行中。

伪文件句柄DATA

经常地,想要在源码文件里读取一些文件数据来进行测试,这时可以直接使用一个预定义的伪文件句柄DATA。

... some code ...

从__DATA__或__END__开始的数据都将被DATA文件句柄读取,直到文件结尾
__DATA__
...一些待读取数据...

当perl编译器遇到__DATA____END__了,就意味着代码到此结束,下面的数据都将作为当前文件内有效的DATA文件句柄的数据流。

例如:

#!/usr/bin/perl

while(<DATA>){
chomp;
print "read from DATA: $_\n";
} __DATA__
first line in DATA
second line in DATA
third line in DATA
last line in DATA

Inline::Files

DATA伪文件句柄的一个缺点是从遇到__DATA____END__起直到文件的尾部,都属于DATA文件句柄的内容,也就是说在源代码文件中只能定义一个伪文件句柄。

在CPAN上有一个Inline::Files模块,它可以在同一个源代码文件中定义多个伪文件句柄。需要先安装:

cpan install Inline::Files

例如:

use Inline::Files;
use 5.010; say "@main::FILE1";
say "@main::FILE2"; while(<FILE1>){
say "$_";
} while(<FILE2>){
say "$_";
} __FILE1__
first line in FILE1
second line in FILE1
third line in FILE1
__FILE2__
first line in FILE2
second line in FILE2
third line in FILE2

它像ARGV一样,在运行程序初始阶段就打开这些虚拟文件句柄,并将每个虚拟文件句柄保存到@<PACKNAME>::<HANDLE>中。例如,上面的是示例是在main包中定义了FILE1和FILE2两个文件句柄,那么这两个文件句柄将保存到@main::FILE1@main::FILE2中,并在处理某个文件句柄的时候,将其保存到标量$main::FILE1$main::FILE2中。

可以同时定义多个名称相同的虚拟文件系统。例如:

__FILE1__
...
__FILE2__
...
__FILE1__
...

这时在@<packname>::FILE1数组中就保存了两个元素,当处理第二个FILE1的时候,将自动重新打开这个文件句柄。

一般来说,这些就够了,更多详细的用法请参见官方手册:Inline::Files

Perl文件句柄相关常量变量的更多相关文章

  1. history and its relevant variables in Linux/GNU and Mac OS history命令以及相关环境变量

    对于Terminalor们,history命令并不陌生,什么!n, !!更是很常用的,而且您在命令行敲的cmds是默认保存在/home/$USER/.bash_history(linux) /User ...

  2. perl选项、特殊变量、一些函数参考手册

    perl一行式程序系列文章:Perl一行式 本文用来收集Perl一行式中涉及到的一些选项.特殊变量的说明,可以用来做速查手册. 本文会逐渐更新. 第一次学Perl一行式时,请直接忽略本文内容,并直接从 ...

  3. perl学习之内置变量

    Perl内置特殊变量   一.正则表达式特殊变量:1.$n  :包含上次模式匹配的第n个子串2.$& :前一次成功模式匹配的字符串3.$`  :前次匹配成功的子串之前的内容4.$’ :前次匹配 ...

  4. Swift入门学习之一常量,变量和声明

    版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/6059421.html Swift入门学习之一常量,变量和 ...

  5. 速战速决 (1) - PHP: 概述, 常量, 变量, 运算符, 表达式, 控制语句

    [源码下载] 速战速决 (1) - PHP: 概述, 常量, 变量, 运算符, 表达式, 控制语句 作者:webabcd 介绍速战速决 之 PHP 概述 常量 变量 运算符 表达式 控制语句 示例1. ...

  6. Swift学习(四)常量&变量&基础数据类型

    常量和变量 常量: 使用let关键词来声明一个常量 所指向的是一个特定类型的值,如数字10或者字符”hello”,常量的值是不能够被二次修改的 编程时使用常量能够让代码看起来更加安全和简洁! let ...

  7. 关于Makefile.am中与Build相关的变量设置 AM_CPPFLAGS

    http://tonybai.com/2010/10/26/about-variables-related-to-building-in-makefile-am/ 关于Makefile.am中与Bui ...

  8. C#1 输入输出 常量变量

    C#  输入输出  常量变量 //输出 Console.WriteLine("这是一行文字"); 自动回车的. Console.Write("Hello world&qu ...

  9. JAVA_SE基础——7.常量&变量

    上一篇,我讲了标识符&关键字    这篇我来解释下变量&常量~~~ 变量与常量这两个概念相信大家都不会感到陌生,在数学中就已经涉及了变量与常量.理解变量与常量,可以举这样一个例子: 例 ...

随机推荐

  1. go 函数类型

    在go中,函数也可以被当成数据类型 e.g:下面有两个函数,+.-,然后定义了一个函数类型FuncType1,然后对funcType1附于不同的函数,则funcType1就可以执行相应的函数 pack ...

  2. ExtJS中listener方法和handler方法的区别

    listener方法和handler方法的区别在文档中的说明的太玄乎了,看不懂 listeners监听能够对一个click Event事件添加任意多个的事件响应处理函数 而handler处理只能够通过 ...

  3. python之路(八)-迭代器&生成器

    迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外,迭代器的一大优点是 ...

  4. C++中_cplusplus及Extern "C"的理解

    一.意义 Extern "C":告诉编译器,这部分代码按C语言的方式进行编译,而不是C++的.   _cplusplus:.cpp文件默认定义的宏.用来判断是否为.cpp文件. 二 ...

  5. 打造自己Django博客日记

    本教程使用的开发环境 本教程写作时开发环境的系统平台为 Windows 10 (64 位),Python 版本为 3.5.2 (64 位),Django 版本为 1.10.6. 建议尽可能地与教程的开 ...

  6. vuex简单使用

    1.创建src/store/index.js----仓库所在地----暴露store 2.main.js入口文件处引入store,挂载到Vue根实例中 3.创建store/movie.js-----电 ...

  7. 9-Unittest+HTMLTestRunner不能生成报告解决方法

    1.问题现象 在使用HTMLTestRunner生成测试报告时,出现程序运行不报错,但不能生成报告的情况. 刚开始找了很久没发现问题,后来加上打印信息,发现根本没执行生成报告这部分代码.最后网上找到原 ...

  8. 一把梭系列 之 颜值不够VsCode来凑

    如果您的孩子不适应编译型语言怎么办? 如果您的孩子贪玩不想花多时间在编程上怎么办? 如果您还没有孩子怎么办? 如果您夜晚兼职觉不够睡又怎么办? 不妨试试 “ 拍 簧 片 ”. 妈了巴子的有点麻烦,但别 ...

  9. [转] 如何用kaldi训练好的模型做特定任务的在线识别

    转自:http://blog.csdn.net/inger_h/article/details/52789339 在已经训练好模型的情况下,需要针对一个新任务做在线识别应该怎么做呢? 一种情况是,用已 ...

  10. 【javascript】谈谈HTML5: Web-Worker、canvas、indexedDB、拖拽事件

    前言:作为一名Web开发者,可能你并没有对这个“H5”这个字眼投入太多的关注,但实际上它早已不知不觉进入到你的开发中,并且总有一天会让你不得不正视它,了解它并运用它   打个比方:<海贼王> ...