1.3 标准文件句柄:
243[oracle@oadb 1]$ cat data.txt
234
[oracle@oadb 1]$ cat muncher.pl
while (<STDIN>){
print $_ + 9;
};
[oracle@oadb 1]$ cat data.txt
234
[oracle@oadb 1]$ perl muncher.pl <data.txt >a.txt
[oracle@oadb 1]$ cat a.txt
243[oracle@oadb 1]$
1.3.2 输入和输出操作:
[oracle@oadb 1]$ cat a2.pl
open (A,"aa");
$line=<A>;
print $line."
";
[oracle@oadb 1]$ perl a2.pl
1234567
[oracle@oadb 1]$ cat a3.pl
open (A,"aa");
@line=<A>;
print @line;
[oracle@oadb 1]$ perl a3.pl
1234567
abcdefg
[oracle@oadb 1]$ cat bb
9999999999
8888888888
[oracle@oadb 1]$ perl a4.pl aa bb
$_ is 1234567
$_ is abcdefg
$_ is 9999999999
$_ is 8888888888
$bytes=read(FILEHANDLE,$buffer,$length [,$offset])
$bytes=sysread(FILEHANDLE,$buffer,$length [,$offset])
[oracle@oadb 1]$ perl a5.pl
1234567890
$bytes is 7
$buffer is 1234567
[oracle@oadb 1]$ cat a5.pl
my $buffer;
$bytes=read(STDIN,$buffer,7);
print "$bytes is $bytes
";
print "$buffer is $buffer
";
[oracle@oadb 1]$
默认时,所读取的数据将被放在$buffer的开始部分,覆盖$buffer中原有的内容。
可以通过可选的数值型参数$offset来改变函数的这种行为,指定所读物的数据写入可选的被指定的开始位置。
[oracle@oadb 1]$ cat a5.pl
my $buffer="1234567";
$bytes=read(STDIN,$buffer,5,3);
print "$bytes is $bytes
";
print "$buffer is $buffer
";
[oracle@oadb 1]$ perl a5.pl
abcdefg1234567
$bytes is 5
$buffer is 123abcde
read()和sysread()的区别:
read()读取所需的实际字节数或读到文件尾才返回
sysread()函数会返回部分数据
[oracle@oadb 1]$ cat a5.pl
my $buffer="1234567";
$bytes=read(STDIN,$buffer,30,3);
print "$bytes is $bytes
";
print "$buffer is $buffer
";
[oracle@oadb 1]$ perl a5.pl
abcdefg
此时不返回数据
[oracle@oadb 1]$ cat a5.pl
my $buffer="1234567";
$bytes=sysread(STDIN,$buffer,30,3);
print "$bytes is $bytes
";
print "$buffer is $buffer
";
[oracle@oadb 1]$ perl a5.pl
abcdefg
$bytes is 8
$buffer is 123abcdefg
[oracle@oadb 1]$
$bytes=syswrite(FILEHANDLE,$data [,$length [,$offset]]);
1.3.3 检测文件尾
1.3.4 行尾之处的混乱:
在UNIX 系统上,行以换行符(LF
)结尾
Windows 上是
1.3.5 打开和关闭文件:
[oracle@oadb 1]$ cat a7.pl
open (FH,">message.txt") or die $!;
print FH "this is the first line.
";
print FH "And this is the second line.
";
1.3.6 缓冲和堵塞
1.4 使用IO::Handle模块和IO::File模块的面向对象语法:
在本书的后面我们会使用perl5 的面向对象的扩展功能,尽管你不需要知道太多创建面向对象模块的知识,
但你需要基本理解如何使用面向对象模块和它们的语法。
1.4.1 对象和引用:
[oracle@oadb 1]$ cat a1.pl
my @array=(1,4,7,2,5,8);
my $array=@array;
print "----------------
";
print $array;
print "
";
print "----------------
";
print $array->[2];
print "
";
print $$array[3];
print "
";
[oracle@oadb 1]$ perl a1.pl
----------------
ARRAY(0x9d95b8)
----------------
7
2
对象(object)也是一个引用,只不过具有一些额外的位。
对象带有"是什么模块创建它"的相关信息,它以这种方式被"神圣化"(blessed)而居于特定模块的软件包中。
$object->print_record();##调用print_record()方法
你可能有时会看到一个方法被调用时具有参数,像下面这样:
负责将一般引用转化为"神圣化"的引用的函数自然被称为bless()
$object->{last_name};
使用对象不同于一般引用的是它们具有方法(method),方法调用使用->符号,但后面紧跟着一个子例程名和可选的子例程的子例程风格的参数:
$object->print_record();##invoke the print_record() 方法
你可能有时看到一个方法被调用时具有参数,像下面这样:
$object->print_record(encoding=>'EBCDID');
[oracle@oadb 1]$ cat BigDatabase.pm
package BigDatabase;
our $VERSION="2.0";
sub new{
my $class=shift;
my %p=@_;
my $self={
version => $VERSION,
debug => $p{debug}
};
bless $self,$class;
return $self;
};
sub print_record{
my $self=shift;
my %p=@_;
my $var=$p{data};
return $self->{debug} + $var;
};
1;
[oracle@oadb 1]$ cat a2.pl
use BigDatabase;
my $object=BigDatabase->new(debug=>890);
print $object->print_record(data=>56);
print "
";
print "------------------------------
";
print BigDatabase::print_record($object);
print "------------------------------
";
[oracle@oadb 1]$ perl a2.pl
946
------------------------------
890------------------------------
为了创建对象,必须调用它的一个构造函数(constructor)。构造函数是一个从模块名调用的方法调用,
例如,创建一个新的BigDatabase对象,代码如下:
$object=BigDatabase->new(); ##call the new() 构造器
构造函数是一个类方法(class method)的特例,经常被命名为new(). 然而,任意的子例程名都是可能的,
1.4.2 IO::Handle模块和IO::File模块