- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
Perl 内置了丰富的函数用来创建,读写,管理和删除文件。
Perl 使用一种叫做文件句柄类型的变量来操作文件。
从文件读取或者写入数据需要使用文件句柄
文件句柄(file handle)是一个I/O连接的名称
Perl提供了三种文件句柄:STDIN,STDOUT,STDERR,分别代表标准输入、标准输出和标准出错输出
open FILEHANDLE, EXPR
open FILEHANDLE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE
open 函数用来打开一个文件
下面的代码使用 open 函数以只读的方式(<)打开文件 file.txt
open(DATA, "<file.txt");
< 表示只读方式
代码中的 DATA 为文件句柄用于读取文件,以下范例将打开文件并将文件内容输出:
#!/usr/bin/perl
=pod
file: mail.pl
author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
Copyright © 2015-2065 www.ddkk.com. All rights reserved.
=cut
open(DATA, "<file.txt") or die "file.txt 文件无法打开, $!";
while(<DATA>){
print "$_";
}
以下代码以写入( >`)的方式打开文件 file.txt:
open(DATA, ">file.txt") or die "file.txt 文件无法打开, $!";
> 表示写入方式
如果你需要以读写方式打开文件,可以在 >或
< 字符前添加 + 号:
open(DATA, "+<file.txt"); or die "file.txt 文件无法打开, $!";
这种方式不会删除文件原来的内容,如果要删除,格式如下所示:
open DATA, "+>file.txt" or die "file.txt 文件无法打开, $!";
如果要向文件中追加数据,则在追加数据之前,只需要以追加方式打开文件即可:
open(DATA,">>file.txt") || die "file.txt 文件无法打开, $!";
>>` 表示向现有文件的尾部追加数据,如果需要读取要追加的文件内容可以添加 + 号
open(DATA,"+>>file.txt") || die "file.txt 文件无法打开, $!";
模式 | 描述 |
---|---|
< r |
只读方式打开,将文件指针指向文件头 |
> w |
写入方式打开,将文件指针指向文件头并将文件大小截为零。 如果文件不存在则尝试创建 |
>> a |
写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之 |
+< r+ |
读写方式打开,将文件指针指向文件头 |
+> w+ |
读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建 |
+>> a+ |
读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建 |
sysopen 函数类似于 open 函数,只是它们的参数形式不一样
下面的代码以读写( +`<filename ) 的方式打开文件:
sysopen(DATA, "file.txt", O_RDWR);
如果需要在更新文件前清空文件,则代码如下:
sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );
使用O_CREAT 可以创建一个新的文件, O_WRONLY 为只写模式, O_RDONLY 为只读模式
PERMS 参数是八进制属性值,表示文件创建后的权限,默认为 0x666
模式 | 描述 |
---|---|
O_RDWR | 读写方式打开,将文件指针指向文件头 |
O_RDONLY | 只读方式打开,将文件指针指向文件头 |
O_WRONLY | 写入方式打开,将文件指针指向文件头并将文件大小截为零。 如果文件不存在则尝试创建之 |
O_CREAT | 创建文件 |
O_APPEND | 追加文件 |
O_TRUNC | 将文件大小截为零 |
O_EXCL | 如果使用O_CREAT时文件存在,就返回错误信息 它可以测试文件是否存在 |
O_NONBLOCK | 非阻塞I/O使我们的操作要么成功,要么立即返回错误,不被阻塞 |
在文件使用完后,要关闭文件,刷新与文件句柄相关联的输入输出缓冲区
close 函数可以用来关闭文件
close 函数语法如下:
close FILEHANDLE
close
FILEHANDLE 为指定的文件句柄,如果成功关闭则返回 true
通常我们使用以下代码来关闭一个文件句柄
close(FILEHANDLE) || die "无法关闭文件";
向文件读写信息有以下几种不同的方式:
<FILEHANDL>
操作符从打开的文件句柄读取信息的主要方法是 <FILEHANDLE>
操作符 在标量上下文中,它从文件句柄返回单一行
#!/usr/bin/perl
=pod
file: mail.pl
author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
Copyright © 2015-2065 www.ddkk.com. All rights reserved.
=cut
print "DDKK.COM 弟弟快看,程序员编程资料站网址?\n";
$name = <STDIN>;
print "网址:$name\n";
运行以上范例,会显示一些提示信息,当我们输入网址后 print 语句就会输出:
$ perl main.pl
DDKK.COM 弟弟快看,程序员编程资料站网址?
www.ddkk.com # 用户输入网址
网址:www.ddkk.com
使用<FILEHANDLE>
操作符时,它会返回文件句柄中每一行的列表
因此我们可以导入所有的行到数组中
新建一个文件名为 demo.txt,内容如下:
$ cat demo.txt
message:www.ddkk.com
age:29
现在读取 demo.txt 并将每一行放到 @lines 数组中:
#!/usr/bin/perl
=pod
file: mail.pl
author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
Copyright © 2015-2065 www.ddkk.com. All rights reserved.
=cut
open(DATA,"<demo.txt") or die "无法打开数据";
@lines = <DATA>;
print @lines; # 输出数组内容
close(DATA);
运行以上范例,输出结果为:
$ perl main.pl
message:www.ddkk.com
age:29
getc 函数从指定的 FILEHANDLE 返回单一的字符,如果没指定返回 STDIN:
getc FILEHANDLE
getc
如果发生错误,或在文件句柄在文件末尾,则返回 undef
read 函数用于从缓冲区的文件句柄读取信息
read 函数用于从文件读取二进制数据
read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH
print 函数用来将数据输出到输出设备中
print FILEHANDLE LIST
print LIST
print
利用文件句柄和 print 函数可以把程序运行的结果发给输出设备(STDOUT:标准输出)
#!/usr/bin/perl
=pod
file: mail.pl
author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
Copyright © 2015-2065 www.ddkk.com. All rights reserved.
=cut
print "Hello World!\n";
将一个文件拷贝为另一个文件,需要先打开已经存在的文件,读取它的每一行,然后写入到新的文件中
下面的范例,打开一个已存在的文件 demo.txt,并读取它的每一行写入到文件 demo1.txt 中
#!/usr/bin/perl
=pod
file: mail.pl
author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
Copyright © 2015-2065 www.ddkk.com. All rights reserved.
=cut
# 只读方式打开文件
open(DATA1, "<demo.txt");
# 打开新文件并写入
open(DATA2, ">demo1.txt");
# 拷贝数据
while(<DATA1>)
{
print DATA2 $_;
}
close( DATA1 );
close( DATA2 );
rename 函数可以用来重命名一个文件
下面的代码将当前目录下已存在的文件 demo1.txt 重命名为 demo2.txt
#!/usr/bin/perl
=pod
file: mail.pl
author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
Copyright © 2015-2065 www.ddkk.com. All rights reserved.
=cut
rename ("demo1.txt", "demo2.txt" );
unlink 函数可以用来删除文件
#!/usr/bin/perl
=pod
file: mail.pl
author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
Copyright © 2015-2065 www.ddkk.com. All rights reserved.
=cut
unLink("demo.txt");
Perl 中可以使用 tell 函数来获取文件指针当前的位置 可以使用 seek 函数可以用来指定文件指针的位置
tell 函数用于获取文件位置
tell FILEHANDLE
tell
如果指定 FILEHANDLE 该函数返回文件指针的位置,以字节计。 如果没有指定则返回默认选取的文件句柄。
seek() 函数是通过文件句柄来移动文件读写指针的方式来读取或写入文件的 seek() 函数以字节为单位进行读取和写入
seek FILEHANDLE, POSITION, WHENCE
FILEHANDLE
文件句柄,用于存放一个文件唯一标识符
POSITION
表示文件句柄(读写位置指针)要移动的字节数
WHENCE
表示文件句柄(读写位置指针)开始移动时的起始位置,可以取的值为0、1、2;分别表示文件开头、当前位置和文件尾
seek DATA, 256, 0;
在操作文件之前,我们可以先测试文件是否存在,是否可读写等
我们先创建一个名为 demo.txt 的文件,内容如下: 我么可以先创建 file1.txt 文件,内如如下:
$ cat demo.txt
message:www.ddkk.com
age:29
然后用下面的代码来判断 demo.txt 文件的各种信息
#!/usr/bin/perl
=pod
file: mail.pl
author: DDKK.COM 弟弟快看,程序员编程资料站(www.ddkk.com)
Copyright © 2015-2065 www.ddkk.com. All rights reserved.
=cut
my $file = "demo.txt";
my (@description, $size);
if (-e $file)
{
push @description, '是一个二进制文件' if (-B _);
push @description, '是一个socket(套接字)' if (-S _);
push @description, '是一个文本文件' if (-T _);
push @description, '是一个特殊块文件' if (-b _);
push @description, '是一个特殊字符文件' if (-c _);
push @description, '是一个目录' if (-d _);
push @description, '文件存在' if (-x _);
push @description, (($size = -s _)) ? "$size 字节" : '空';
print "$file 信息:", join(', ',@description),"\n";
}
运行以上范例,输出结果为:
$ perl main.pl
demo.txt 信息:是一个文本文件, 27 字节
操作符 | 描述 |
---|---|
-A | 文件上一次被访问的时间(单位:天) |
-B | 是否为二进制文件 |
-C | 文件的(inode)索引节点修改时间(单位:天) |
-M | 文件上一次被修改的时间(单位:天) |
-O | 文件被真实的UID所有 |
-R | 文件或目录可以被真实的UID/GID读取 |
-S | 为socket(套接字) |
-T | 是否为文本文件 |
-W | 文件或目录可以被真实的UID/GID写入 |
-X | 文件或目录可以被真实的UID/GID执行 |
-b | 为block-special (特殊块)文件(如挂载磁盘) |
-c | 为character-special (特殊字符)文件(如I/O 设备) |
-d | 为目录 |
-e | 文件或目录名存在 |
-f | 为普通文件 |
-g | 文件或目录具有setgid属性 |
-k | 文件或目录设置了sticky位 |
-l | 为符号链接 |
-o | 文件被有效UID所有 |
-p | 文件是命名管道(FIFO) |
-r | 文件可以被有效的UID/GID读取 |
-s | 文件或目录存在且不为0(返回字节数) |
-t | 文件句柄为TTY(系统函数isatty()的返回结果;不能对文件名使用这个测试) |
-u | 文件或目录具有setuid属性 |
-w | 文件可以被有效的UID/GID写入 |
-x | 文件可以被有效的UID/GID执行 |
-z | 文件存在,大小为0(目录恒为false),即是否为空文件, |
今天我在一个 Java 应用程序中看到了几种不同的加载文件的方法。 文件:/ 文件:// 文件:/// 这三个 URL 开头有什么区别?使用它们的首选方式是什么? 非常感谢 斯特凡 最佳答案 file
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我有一个 javascript 文件,并且在该方法中有一个“测试”方法,我喜欢调用 C# 函数。 c# 函数与 javascript 文件不在同一文件中。 它位于 .cs 文件中。那么我该如何管理 j
需要检查我使用的文件/目录的权限 //filePath = path of file/directory access denied by user ( in windows ) File fil
我在一个目录中有很多 java 文件,我想在我的 Intellij 项目中使用它。但是我不想每次开始一个新项目时都将 java 文件复制到我的项目中。 我知道我可以在 Visual Studio 和
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我有 3 个组件的 Twig 文件: 文件 1: {# content-here #} 文件 2: {{ title-here }} {# content-here #}
我得到了 mod_ldap.c 和 mod_authnz_ldap.c 文件。我需要使用 Linux 命令的 mod_ldap.so 和 mod_authnz_ldap.so 文件。 最佳答案 从 c
我想使用PIE在我的项目中使用 IE7。 但是我不明白的是,我只能在网络服务器上使用 .htc 文件吗? 我可以在没有网络服务器的情况下通过浏览器加载的本地页面中使用它吗? 我在 PIE 的文档中看到
我在 CI 管道中考虑这一点,我应该首先构建和测试我的应用程序,结果应该是一个 docker 镜像。 我想知道使用构建环境在构建服务器上构建然后运行测试是否更常见。也许为此使用构建脚本。最后只需将 j
using namespace std; struct WebSites { string siteName; int rank; string getSiteName() {
我是 Linux 新手,目前正在尝试使用 ginkgo USB-CAN 接口(interface) 的 API 编程功能。为了使用 C++ 对 API 进行编程,他们提供了库文件,其中包含三个带有 .
我刚学C语言,在实现一个程序时遇到了问题将 test.txt 文件作为程序的输入。 test.txt 文件的内容是: 1 30 30 40 50 60 2 40 30 50 60 60 3 30 20
如何连接两个tcpdump文件,使一个流量在文件中出现一个接一个?具体来说,我想“乘以”一个 tcpdump 文件,这样所有的 session 将一个接一个地按顺序重复几次。 最佳答案 mergeca
我有一个名为 input.MP4 的文件,它已损坏。它来自闭路电视摄像机。我什么都试过了,ffmpeg , VLC 转换,没有运气。但是,我使用了 mediainfo和 exiftool并提取以下信息
我想做什么? 我想提取 ISO 文件并编辑其中的文件,然后将其重新打包回 ISO 文件。 (正如你已经读过的) 我为什么要这样做? 我想开始修改 PSP ISO,为此我必须使用游戏资源、 Assets
给定一个 gzip 文件 Z,如果我将其解压缩为 Z',有什么办法可以重新压缩它以恢复完全相同的 gzip 文件 Z?在粗略阅读了 DEFLATE 格式后,我猜不会,因为任何给定的文件都可能在 DEF
我必须从数据库向我的邮件 ID 发送一封带有附件的邮件。 EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Adventure Works Admin
我有一个大的 M4B 文件和一个 CUE 文件。我想将其拆分为多个 M4B 文件,或将其拆分为多个 MP3 文件(以前首选)。 我想在命令行中执行此操作(OS X,但如果需要可以使用 Linux),而
快速提问。我有一个没有实现文件的类的项目。 然后在 AppDelegate 我有: #import "AppDelegate.h" #import "SomeClass.h" @interface A
我是一名优秀的程序员,十分优秀!