Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在Perl';s文件阅读器?_Perl - Fatal编程技术网

有没有办法在Perl';s文件阅读器?

有没有办法在Perl';s文件阅读器?,perl,Perl,我通过CGI-in在perl中读取一个文本文件,注意到当该文件保存在mac的textEdit中时,可以识别行分隔符,但当我上传一个直接从excel导出的CSV时,却无法识别。我猜这是一个\n vs.\r问题,但这让我想到,如果我不想要默认情况下它正在查找的行终止符标记,我不知道如何指定我想要的行终止符标记 是的。您需要覆盖$/的值。从 $/ 输入记录分隔符,默认为换行符。这影响了Perl关于“行”是什么的概念。工作原理类似于awk的RS变量,包括在设置为空字符串时将空行视为终止符。(空行不能包含

我通过CGI-in在perl中读取一个文本文件,注意到当该文件保存在mac的textEdit中时,可以识别行分隔符,但当我上传一个直接从excel导出的CSV时,却无法识别。我猜这是一个\n vs.\r问题,但这让我想到,如果我不想要默认情况下它正在查找的行终止符标记,我不知道如何指定我想要的行终止符标记

是的。您需要覆盖
$/
的值。从

$/

输入记录分隔符,默认为换行符。这影响了Perl关于“行”是什么的概念。工作原理类似于awk的RS变量,包括在设置为空字符串时将空行视为终止符。(空行不能包含任何空格或制表符。)您可以将其设置为多字符字符串以匹配多字符终止符,或将其设置为未定义以读取文件结尾。如果文件包含连续的空行,则将其设置为“\n\n”意味着与设置为“”略有不同。设置为“”将把两个或多个连续的空行视为一个空行。设置为“\n\n”将盲目地假定下一个输入字符属于下一段,即使它是换行符。(助记符:引用诗歌时划出行边界。)

local$/;#启用“slurp”模式
本地$uu=;#整个文件现在在这里
s/\n[\t]+//g;
记住:$/的值是一个字符串,而不是正则表达式。awk必须做得更好。:-)

将$/设置为整数引用、包含整数的标量或可转换为整数的标量将尝试读取记录而不是行,最大记录大小为引用的整数。因此:

local $/ = \32768; # or \"32768", or \$var_containing_32768
open my $fh, "<", $myfile or die $!;
local $_ = <$fh>;
local$/=\32768;#或\“32768”,或\$var\u包含\$32768

打开我的$fh,“是。您将要覆盖来自的
$/
的值

$/

默认情况下,输入记录分隔符为换行符。这会影响Perl对“行”的理解。其工作原理与awk的RS变量类似,包括将空行视为终止符(如果设置为空字符串)(空行不能包含任何空格或制表符)您可以将其设置为多字符字符串以匹配多字符终止符,也可以将其设置为未定义以读取文件的结尾。如果文件包含连续的空行,则将其设置为“\n\n”表示与设置为“”略有不同。设置为“”将把两个或多个连续的空行视为单个空行。设置为“\n\n“将盲目地假设下一个输入字符属于下一个段落,即使它是换行符。(助记符:/quote poetry时划定行边界。)

local$/#启用“slurp”模式
本地$u=;#整个文件现在在这里
s/\n[\t]+//g;
请记住:$/的值是一个字符串,而不是正则表达式。awk必须更好地用于某些方面。:-)

将$/设置为整数引用、包含整数的标量或可转换为整数的标量将尝试读取记录而不是行,最大记录大小为引用的整数。因此:

local $/ = \32768; # or \"32768", or \$var_containing_32768
open my $fh, "<", $myfile or die $!;
local $_ = <$fh>;
local$/=\32768;#或\“32768”,或\$var\u包含\$32768

打开my$fh,“变量有多个名称:

  • $/
  • $RS
  • $INPUT\u RECORD\u分隔符
对于较长的名称,您需要:

use English;
请记住仔细本地化:

{
local($/) = "\r\n";
...code to read...
}

变量有多个名称:

  • $/
  • $RS
  • $INPUT\u RECORD\u分隔符
对于较长的名称,您需要:

use English;
请记住仔细本地化:

{
local($/) = "\r\n";
...code to read...
}

如果正在使用CRLF行终止符读取文件,则可以使用CRLF规程打开该文件,或将句柄的binmode设置为自动转换

open my $fh, '<:crlf', 'the_csv_file.csv' or die "Oh noes $!";

:crlf
模式通常是Win32 Perl环境中的默认模式,在实践中效果非常好。

如果您正在读取带有crlf行终止符的文件,可以使用crlf规程打开该文件,或者将句柄的binmode设置为自动转换

open my $fh, '<:crlf', 'the_csv_file.csv' or die "Oh noes $!";

:crlf
模式通常是Win32 Perl环境中的默认模式,在实践中效果很好。

要读取CSV文件,请遵循Robert-p在其评论中的建议,并使用CSV模块

但是,对于从具有不同行尾的文件中读取行的一般情况,我通常要做的是将整个文件拖出并在
\R
上拆分。如果它不是一个千兆字节的文件,那应该是最安全、最简单的方法

因此:

或者在脚本中:

{
  local $/ = undef;
  open F, $YOUR_FILE or die;
  @lines = split /\R/, <F>;
  close F;
}
{
本地$/=undef;
打开F$,你的文件或死亡;
@行=拆分/\R/;
关闭F;
}
\R
适用于Unix LF(
\x0A
)、Windows/Internet CRLF,也适用于CR(
\x0D
),后者在90年代被Mac使用,但实际上仍被一些Mac程序使用

从:

\R匹配一般换行符;也就是说,任何被认为是断线的东西 按Unicode排序。这包括\v匹配的所有字符 (垂直空白)和多字符序列“\x0D\x0A” (回车后接换行符,有时称为网络) 换行符;它是Microsoft文本文件中使用的行尾序列 以二进制模式打开)


或者在Brian D Foy的文章中看到关于
\R
的更详细、详尽的解释:其中甚至有一些有趣的视频。

要阅读CSV文件,请遵循Robert-p在评论中的建议,并使用CSV模块

但是,对于从具有不同行尾的文件中读取行的一般情况,我通常要做的是将整个文件拖出并在
\R
上拆分。如果它不是一个千兆字节的文件,那应该是最安全、最简单的方法

因此:

或者在脚本中:

{
  local $/ = undef;
  open F, $YOUR_FILE or die;
  @lines = split /\R/, <F>;
  close F;
}
{
本地$/=undef;
打开F$,你的文件或死亡;
@行=拆分/\R/;
C