perlopentut - 云端在线

这是可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行的命令 perlopentut,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


perlpentut - 在 Perl 中打开文件和管道的简单方法

商品描述


每当您在 Perl 中对文件进行 I/O 操作时,您都是通过 Perl 中称为
文件句柄. 文件句柄是外部文件的内部名称。 它的工作是
“打开”函数使内部名称和外部名称之间建立关联,
打破这种关联是“关闭”功能的工作。

为方便起见,Perl 设置了一些特殊的文件句柄,这些句柄在
你跑。 其中包括“STDIN”、“STDOUT”、“STDERR”和“ARGV”。 由于这些是预
打开后,您可以立即使用它们,而无需费心打开它们
你自己:

print STDERR "这是一条调试信息。\n";

print STDOUT "请输入:";
$响应= // 死“怎么没有输入?”;
print STDOUT "谢谢!\n";

尽管 ( ) { ... }

从这些示例中可以看出,“STDOUT”和“STDERR”是输出句柄,“STDIN”和
“ARGV”是输入句柄。 它们都是大写字母,因为它们被保留给
Perl,很像@ARGV 数组和 %ENV 哈希。 他们的外部协会是
由您的外壳设置。

您需要自己打开所有其他文件句柄。 虽然有很多
变体,最常见的调用 Perl 的方式 打开() 函数带有三个参数和
一个返回值:

" OK = 打开(处理, 模式, 路径名)”

地点:

OK 如果打开成功,将是一些定义的值,但如果失败则为“undef”;

处理
应该是一个未定义的标量变量,如果它被“打开”函数填充
成功;

MODE
是打开文件的访问模式和编码格式;

路径名
是要打开的文件的外部名称。

“打开”函数的大部分复杂性在于许多可能的值
MODE 参数可以承担。

在我们向您展示如何打开文件之前的最后一件事:打开文件(通常)
在 Perl 中自动锁定它们。 有关如何锁定,请参阅 perlfaq5。

开幕时间 文本


开幕时间 文本 阅读
如果要从文本文件中读取,请先以只读模式打开它,如下所示:

我的 $filename = "/some/path/to/a/textfile/goes/here";
我的 $encoding = ":encoding(UTF-8)";
我的 $handle = undef; # 这将在成功时填写

open($handle, "< $encoding", $filename)
|| die "$0: 无法打开 $filename 进行读取:$!";

与 shell 一样,在 Perl 中,“<”用于以只读模式打开文件。 如果它
成功,Perl 为你分配一个全新的文件句柄并填入你之前的
带有对该句柄的引用的未定义 $handle 参数。

现在,您可以在该句柄上使用“readline”、“read”、“getc”和“sysread”等函数。
可能最常见的输入函数是一个看起来像运算符的函数:

$line = readline($handle);
$line = <$handle>; # 一样

因为“readline”函数在文件末尾或出错时返回“undef”,你将
有时会看到它是这样使用的:

$line = <$handle>;
如果(定义 $line){
# 用 $line 做一些事情
}
其他{
# $line 无效,所以跳过它
}

您也可以通过这种方式在未定义的值上快速“死亡”:

$line = <$handle> // 死“找不到输入”;

但是,如果命中 EOF 是预期的正常事件,您不想简单地退出
因为你的输入用完了。 相反,您可能只想退出输入循环。
然后,您可以测试以查看实际错误是否导致循环终止,然后采取行动
因此:

而 (<$句柄>) {
# 对 $_ 中的数据做一些事情
}
如果($!){
die "从 $filename 读取时出现意外错误:$!";
}

A 备注 on 编码: 每次都必须指定文本编码似乎有点麻烦
打扰。 为“打开”设置默认编码,以便您不必为每个
时间,您可以使用“打开”编译指示:

使用 open qw<:encoding(UTF-8)>;

完成后,您可以安全地省略开放模式的编码部分:

打开($句柄,“<”,$文件名)
|| die "$0: 无法打开 $filename 进行读取:$!";

但是不要在没有先设置默认编码的情况下使用裸的“<”。 除此以外,
Perl 无法知道您拥有的文本文件的多种可能风格中的哪一种,并且
Perl 不知道如何将文件中的数据正确映射为实际字符
它可以与。 其他常见的编码格式包括“ASCII”、“ISO-8859-1”、
“ISO-8859-15”、“Windows-1252”、“MacRoman”,甚至“UTF-16LE”。 查看更多
关于编码。

开幕时间 文本 写作
当您想写入文件时,您首先必须决定如何处理任何现有的
该文件的内容。 您在这里有两个基本选择:保留或破坏。

如果你想保留任何现有的内容,那么你想在 append 中打开文件
模式。 与在 shell 中一样,在 Perl 中,您可以使用“>>”以追加模式打开现有文件。
如果文件不存在,“>>”会创建该文件。

我的 $handle = undef;
我的 $filename = "/some/path/to/a/textfile/goes/here";
我的 $encoding = ":encoding(UTF-8)";

open($handle, ">> $encoding", $filename)
|| die "$0: 无法打开 $filename 进行追加:$!";

现在您可以使用“print”、“printf”、“say”、“write”或
“系统写入”。

如上所述,如果文件不存在,那么追加模式打开将创建
给你。 但是如果文件已经存在,它的内容是安全的,因为
您将在旧文本的末尾添加新文本。

另一方面,有时您想破坏可能已经存在的任何东西。 到
在开始写入之前清空文件,您可以在只写模式下打开它:

我的 $handle = undef;
我的 $filename = "/some/path/to/a/textfile/goes/here";
我的 $encoding = ":encoding(UTF-8)";

open($handle, "> $encoding", $filename)
|| die "$0: 无法在写打开模式下打开 $filename: $!";

这里 Perl 的工作方式就像 shell 一样,因为 ">" 破坏了现有文件。

与追加模式一样,当您以只写模式打开文件时,您现在可以写入
该文件句柄使用“print”、“printf”、“say”、“write”或“syswrite”中的任何一个。

读写模式呢? 你应该假装它不存在,因为打开
读写模式下的文本文件不太可能执行您想要的操作。 参见 perlfaq5
细节。

开幕时间 二进制


如果要打开的文件包含二进制数据而不是文本字符,则“MODE”
“开放”的论点有点不同。 而不是指定编码,你告诉
Perl 你的数据是原始字节。

我的 $filename = "/some/path/to/a/binary/file/goes/here";
我的 $encoding = ":raw :bytes"
我的 $handle = undef; # 这将在成功时填写

然后像以前一样打开,根据需要选择“<”、“>>”或“>”:

open($handle, "< $encoding", $filename)
|| die "$0: 无法打开 $filename 进行读取:$!";

open($handle, ">> $encoding", $filename)
|| die "$0: 无法打开 $filename 进行追加:$!";

open($handle, "> $encoding", $filename)
|| die "$0: 无法在写打开模式下打开 $filename: $!";

或者,您可以通过以下方式在现有句柄上更改为二进制模式:

binmode($handle) || 死“不能binmode处理”;

这对于 Perl 已经为您打开的句柄特别方便。

二进制模式(标准输入) || 死“不能binmode STDIN”;
二进制模式(标准输出) || 死“不能binmode STDOUT”;

您还可以传递“binmode”一个显式编码以动态更改它。 这不是
完全是“二进制”模式,但我们仍然使用“binmode”来做到这一点:

binmode(STDIN, ":encoding(MacRoman)") || 死“不能binmode STDIN”;
binmode(STDOUT, ":encoding(UTF-8)") || 死“不能binmode STDOUT”;

一旦您以正确的模式正确打开二进制文件,您就可以使用所有相同的
Perl I/O 功能与您在文本文件上使用的一样。 但是,您可能希望使用固定大小的
“读取”而不是可变大小的“读取行”作为您的输入。

以下是如何复制二进制文件的示例:

我的 $BUFSIZ = 64 * (2 ** 10);
我的 $name_in = "/some/input/file";
我的 $name_out = "/some/output/flie";

我的($in_fh,$out_fh,$buffer);

打开($in_fh,“<”,$name_in)
|| die "$0: 无法打开 $name_in 进行阅读:$!";
打开($out_fh, ">", $name_out)
|| die "$0: 无法打开 $name_out 进行写入:$!";

对于我的 $fh ($in_fh, $out_fh) {
binmode($fh) || 死“binmode 失败”;
}

而(读($in_fh,$buffer,$BUFSIZ)){
除非(打印 $out_fh $buffer){
die "无法写入 $name_out: $!";
}
}

关闭($in_fh) || die "无法关闭 $name_in: $!";
关闭($out_fh) || die "无法关闭 $name_out: $!";

开幕时间 管道


即将公布。

低级 文件 针脚开路 通过 系统打开


即将公布。 或删除。

使用 onworks.net 服务在线使用 perlpentut



最新的 Linux 和 Windows 在线程序