第一章 输入/输出知识

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模块



                                    
原文地址:https://www.cnblogs.com/hzcya1995/p/13349790.html