Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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 读取不同机器上生成的文件的不同行为_Perl_Readfile - Fatal编程技术网

Perl 读取不同机器上生成的文件的不同行为

Perl 读取不同机器上生成的文件的不同行为,perl,readfile,Perl,Readfile,我有一个包含几百个文本文件的文件夹。每个文件都有相同的格式,例如名为ATextFile1.txt的文件读取 ATextFile1.txt 09 Oct 2013 1 2 3 4 ... 我有一个简化的Perl脚本,用于读取文件并在终端窗口中将其打印出来: #!/usr/bin/Perl use warnings; use strict; my $fileName = shift(@ARGV); open(my $INFILE, "<:encoding(UTF-8)", $file

我有一个包含几百个文本文件的文件夹。每个文件都有相同的格式,例如名为
ATextFile1.txt
的文件读取

ATextFile1.txt  09 Oct 2013
1
2
3
4
...
我有一个简化的Perl脚本,用于读取文件并在终端窗口中将其打印出来:

#!/usr/bin/Perl

use warnings;
use strict;

my $fileName = shift(@ARGV);

open(my $INFILE, "<:encoding(UTF-8)", $fileName) || die("Cannot open $fileName: $!.\n");

foreach (<$INFILE>){
   print("$_");  # Uses the newline character from the file
}
经过一些测试,它似乎只打印文本的第一行,其中前4个字符被RegEx中可以表示为
/[0-9][0-9]16/
的内容覆盖。如果在我的Perl脚本中,我将输出语句替换为
print(“\t$”),我将以下行打印到标准输出:

2016    ATextFile1.txt  09 Oct 2013

这些文件中的每一个都可以使用任何标准文本编辑器正常读取,但由于某些原因,我的Perl脚本似乎无法正确读取和写入文件。任何帮助都将不胜感激(我希望这是我明显缺少的东西)。提前谢谢

请注意,如果要将UTF-8字符打印到
STDOUT
,则需要使用

binmode STDOUT, ':encoding(utf8)';
事先

看起来你的Mac文件的结尾就是CR。据我所知,最新版本的Macintosh系统使用LF作为行尾(与Linux相同),但MacOS9仅使用CR,而Windows在文件中使用两个字符CR LF,当perl在Windows平台上运行时,PerlIO层将其转换为LF

如果文件中没有换行符,那么Perl将把整个文件作为一条记录读取,并且打印它将把所有行覆盖在另一行之上

只要文件相对较小,使用相同的Perl代码读取任何一种文件格式的最简单方法就是读取整个文件并在CR或LF上拆分它。根据输入文件的来源,任何其他内容都需要不同的代码

请尝试此版本的代码

use strict;
use warnings;

my @contents = do {
  open my $fh, '<:encoding(utf8)', $ARGV[0];
  local $/;
  my $contents = <$fh>;
  split /[\r\n]+/, $contents;
}

print "$_\n" for @contents;
我已经创建了Windows、Linux和Mac风格的文本文件,这个程序与所有这些文件都运行良好,但我无法检查编码中包含0x0D或0x0A的UTF-8字符是否正确传递,因此请小心

更新2


简单考虑一下,当然,除了这些字符本身之外,没有包含CR或LF的UTF-8编码。ASCII范围之外的所有字符只包含设置了最高位的字节,因此它们超过了
0x80
,并且永远不能是
0x0D
0x0A

使用数据::转储程序$数据::转储程序::Useqq=1;打印转储程序$这似乎是朝着正确方向迈出的一步。我得到我现在的输出类型有什么原因吗?我真的需要开始阅读中间Perl,因为我知道
Data::Dumper
很早就已经讨论过了。经过一些修改,您的方法运行得非常好。谢谢出于好奇,您能否解释一下打印的数字(即2016年)是什么意思或它来自何处?它可能是您数据文件的最后一行。当CR发送到终端时,后面的字符只是放在同一行的开头,而不是应该放在下一行的开头。因此,如果您打印2013年10月9日的
ATextFile1.txt
,然后打印
CR
2016
,原始行的
ATex
将被数字覆盖,整个文件输出后剩下的就是最长文本行的结尾。
use strict;
use warnings;

my @contents = do {
  open my $fh, '<:encoding(utf8)', $ARGV[0];
  local $/;
  my $contents = <$fh>;
  split /[\r\n]+/, $contents;
}

print "$_\n" for @contents;
use strict;
use warnings;

open my $fh, '<:encoding(UTF-8):eol(LF)', $ARGV[0];
binmode STDOUT, ':encoding(utf8)';

print while <$fh>;