Perl文件I/O

转载出处:http://www.yiibai.com/perl/perl_files.html

处理文件的基本原理很简单:你关联与外部实体(通常是文件)的文件句柄,然后使用各种在Perl的运算符和函数内与句柄相关联的数据流中存储的数据读取和更新。

一个句柄是一个名为Perl的内部结构,关联物理文件名称。所有的文件句柄是读/写访问,所以你可以读取和更新与句柄相关联的任何文件或设备的能力。然而,当你关联的文件句柄,你可以在被打开的文件句柄指定的模式。

三个基本文件的句柄是:STDINSTDOUT 和 STDERR.

打开和关闭文件

Per有以下两个函数以及多形式可以用来打开任何新的或现有的文件。

open FILEHANDLE, EXPR
open FILEHANDLE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE

这里的FILEHANDLE是由open函数返回的文件句柄和expr是打开文件的文件名和模式的表达式。

以下是语法在只读模式打开file.txt的。这里比<signe少表明该文件是只读模式打开

open(DATA, "<file.txt");

这里DATA将用于读取文件的文件句柄。下面的例子,这将打开一个文件,将其内容打印在屏幕上。

#!/usr/bin/perl

open(DATA, "<file.txt");

while(<DATA>)
{
   print "$_";
}

Open函数

以下是语法打开file.txt写入模式。这里比>signe少表示该文件是以写入模式打开。

open(DATA, ">file.txt");

这个例子实际上截断(清空)文件打开前用于写入,这可能不是预期的效果。如果你想打开一个文件进行读取和写入,你可以把前一个加号>或<字符。

例如,要为更新打开一个文件而不会截断它:

open(DATA, "+<file.txt");

首先要截断该文件:

open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!";

您可以在追加模式打开一个文件。在这种模式下写入指向将被设置到文件的末尾。

open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!";

双重>>符号表示打开追加文件,文件指针放置在结尾,让你可以立即开始追加信息。然而,你不能读取它,除非你也将在它前面的加号:

open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!";

以下是表了不同模式的可能值:

Entities	Definition < or r		Read Only Access - by www.yiibai.com
> or w		Creates, Writes, and Truncates
>> or a		Writes, Appends, and Creates
+< or r+	Reads and Writes
+> or w+	Reads, Writes, Creates, and Truncates
+>> or a+	Reads, Writes, Appends, and Creates

Sysopen函数

sysopen函数是主要open函数相似,但它使用系统open()函数,使用系统函数的参数提供给它的参数:

例如,要打开一个文件用于更新,从打开模拟+<文件名格式:

sysopen(DATA, "file.txt", O_RDWR);

或截断,然后再更新文件:

sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );

您可以使用O_CREAT创建一个新文件,O_WRONLY只写模式和O_RDONLY打开文件 - 打开文件在只读模式。

PERMS 参数指定指定的文件的权限,如果它要创建,默认情况下是0x666

Value		Definition O_RDWR		Read and Write
O_RDONLY	Read Only
O_WRONLY	Write Only
O_CREAT		Create the file
O_APPEND	Append the file
O_TRUNC		Truncate the file
O_EXCL		Stops if file already exists
O_NONBLOCK	Non-Blocking usability

Close函数

要关闭一个文件句柄,因此脱离了相应的文件句柄,你使用close函数刷新文件句柄的缓冲和关闭系统的文件描述符。

close FILEHANDLE
close

如果没有指定的文件句柄(FILEHANDLE)的话关闭当前选择的文件句柄。只有当它能够成功地刷新缓冲区并关闭该文件,它返回true。

close(DATA) || die "Couldn't close file properly";

读取和写入的文件句柄

当你有一个打开文件句柄,你需要能够读取和写入信息。也有一些不同的方式读取和写入文件的数据。

<FILEHANDL> 操作符

从一个打开文件句柄读取信息的主要方法是<FILEHANDLE>操作符,在标量上下文中,它返回一个文件句柄一行。例如:

#!/usr/bin/perl

print "What is your name?\n";
$name = <STDIN>;
print "Hello $name\n";

当您使用<FILEHANDLE>操作符在一个列表上下文,它返回从指定的文件句柄的行列表。例如,导入到一个数组从一个文件的所有行:

#!/usr/bin/perl

open(DATA,"<import.txt") or die "Can't open data";
@lines = <DATA>;
close(DATA);

getc函数

getc函数返回从指定的文件句柄或STDIN,如果没有指定一个单一的字符:

getc FILEHANDLE
getc

如果有错误,或者文件句柄在文件的末尾,然后返回UNDEF。

read函数

read函数读取缓冲句柄的信息块:该函数用于从文件中读取的二进制数据。

read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH

数据读取的长度定义的长度(LENGTH),如果没有偏移指定的数据放置在标量(SCALAR)开始。否则,数据将被放置在标量抵消后的字节。该函数返回零上读取文件结束成功的字节数,或者undef如果有一个错误。

print函数

写入信息反馈的主要功能是为所有不同的方法用于从文件句柄读取信息的打印功能。

print FILEHANDLE LIST
print LIST
print

打印功能打印文件句柄,或当前输出句柄(默认为STDOUT),计算值列表。例如:

print "Hello World!\n";

拷贝文件

这里是例如打开一个现有的文件file1.txt和读取一行行,并生成另一个副本file2.txt

#!/usr/bin/perl

# Open file to read
open(DATA1, "<file1.txt");

# Open new file to write
open(DATA2, ">file2.txt");

# Copy data from one file to another.
while(<DATA1>)
{
   print DATA2 $_;
}
close( DATA1 );
close( DATA2 );

重命名一个文件

下面是一个例子,它告诉我们如何重命名一个文件file1.txt为file2.txt。假设文件在/usr/test目录。

#!/usr/bin/perl

rename ("/usr/test/file1.txt", "/usr/test/file2.txt" );

这个函数重命名需要两个参数,它只是重命名现有文件

删除一已存在的文件

下面是一个例子,它展示了如何使用的unlink函数删除一个文件file1.txt。

#!/usr/bin/perl

unlink ("/usr/test/file1.txt");

定位文件中位置

你可以用它来tell 函数知道一个文件的当前位置,seek 函数指向内部文件的特定位置。 

tell 函数

第一个要求是在一个文件中,你使用TELL函数找到位置:

tell FILEHANDLE
tell

这将返回文件指针的位置,以字节为单位,如果没有指定,在句柄指定或当前的默认选中的文件句柄,

seek 函数

seek 寻求函数定位文件指针到指定的数字在一个文件中的字节:

seek FILEHANDLE, POSITION, WHENCE

该函数使用的fseek系统的功能,有同样的相对位置功能,以三个不同点:开始,结束,当前位置。您可以通过指定一个值自何处(WHENCE)。

零设置相对定位文件开始。例如,该行设置文件指针在256个字节的文件。

seek DATA, 256, 0;

获取文件信息

你可以测试在Perl中的某些功能使用统称为 - X测试的一系列测试运营商非常快速。

例如,进行快速测试的各种文件的权限,你可能会使用这样的脚本:

#/usr/bin/perl

my (@description,$size);
if (-e $file)
{
   push @description, 'binary' if (-B _);
   push @description, 'a socket' if (-S _);
   push @description, 'a text file' if (-T _);
   push @description, 'a block special file' if (-b _);
   push @description, 'a character special file' if (-c _);
   push @description, 'a directory' if (-d _); # by www.yiibai.com
   push @description, 'executable' if (-x _);
   push @description, (($size = -s _)) ? "$size bytes" : 'empty';
   print "$file is ", join(', ',@description),"\n";
}

这里是功能列表,你可以检查文件

Operator Description -A 	Age of file (at script startup) in days since modification.
-B 	Is it a binary file?
-C 	Age of file (at script startup) in days since modification.
-M 	Age of file (at script startup) in days since modification.
-O 	Is the file owned by the real user ID?
-R 	Is the file readable by the real user ID or real group?
-S 	Is the file a socket?
-T 	Is it a text file?
-W 	Is the file writable by the real user ID or real group?
-X 	Is the file executable by the real user ID or real group?
-b 	Is it a block special file?
-c 	Is it a character special file?
-d 	Is the file a directory?
-e 	Does the file exist?
-f 	Is it a plain file? # by www.yiibai.com
-g 	Does the file have the setgid bit set?
-k 	Does the file have the sticky bit set?
-l 	Is the file a symbolic link?
-o 	Is the file owned by the effective user ID?
-p 	Is the file a named pipe?
-r 	Is the file readable by the effective user or group ID?
-s 	Returns the size of the file, zero size = empty file. 
-t 	Is the filehandle opened by a TTY (terminal)?
-u 	Does the file have the setuid bit set?
-w 	Is the file writable by the effective user or group ID?
-x 	Is the file executable by the effective user or group ID?
-z 	Is the file size zero?

在目录中工作

以下是通常操作目录的标准功能。

opendir DIRHANDLE, EXPR  # To open a directory
readdir DIRHANDLE        # To read a directory
rewinddir DIRHANDLE      # Positioning pointer to the begining
telldir DIRHANDLE        # Returns current position of the dir
seekdir DIRHANDLE, POS   # Pointing pointer to POS inside dir
closedir DIRHANDLE       # Closing a directory.

下面是一个例子,它打开一个目录,并列出此目录内的所有文件。

#!/usr/bin/perl

opendir (DIR, '.') or die "Couldn't open directory, $!";
while ($file = readdir DIR)
{
  print "$file\n";
}
closedir DIR;

另一个例子,打印C源代码文件列表,您可以使用:

#!/usr/bin/perl

opendir(DIR, '.') or die "Couldn't open directory, $!";
foreach (sort grep(/^.*\.c$/,readdir(DIR)))
{
   print "$_\n";
}
closedir DIR;

你可以创建一个新的目录,使用mkdir 函数:

你可以删除一个目录,使用rmdir 函数

你可以改变一个目录,使用chdir 函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值