【问题标题】:Perl splits string incorrectly when loaded from file从文件加载时,Perl 错误地拆分字符串
【发布时间】:2018-02-03 22:59:06
【问题描述】:

我可能错过了一些东西,因为我今天开始使用 Perl,所以如果这很明显,请原谅。

我想从文件中加载字符串,然后逐个字符地拆分它。 我做了以下

use strict;    
open my $fh, "<", "hello.txt" || die "Cannot open file!\n";

my $data = do { local $/ ; <$fh>};
print $data;

print  join( ', ',(split( //, $data)));

close $fh;

当我执行这个脚本时,第一个打印语句打印 $data 没有问题,但是第二个打印只打印连接字符串。

Hello, world!
, 

我在装有 Strawberry Perl 的 Windows 7 机器上运行,目前我无法访问 Unix/Linux 机器,因此无法在其他地方进行测试。

【问题讨论】:

  • 提示:由于您在块内读取文件,因此也将其打开。这很好地包含(范围)$fh 到该块,并将所有相关代码拉到一起。所以,my $data = do { local $/; open my $fh ...; &lt;$fh&gt; }; 文件 is 在代码退出块时关闭,$fh 不再存在。
  • 有点题外话,但可以使用例如 VMware Player 和 Ubuntu 映像来运行 Linux,而在 Windows 中仍然可以运行。
  • 我会,但我现在有点懒惰设置它:)。

标签: string windows perl file


【解决方案1】:

这可能是回车符"\r" 的问题——Windows 行结尾是\r\n,而\r 本身会移回行首,覆盖您已经编写的内容。

您可以先chomp $data 删除行尾,但这只会删除最后一个行尾。

您还可以让 Perl 在读取文件时将 Windows \r\n 行结尾转换为 Unix \n 行结尾,方法是应用 :crlf IO 层:

open my $fh, "<:crlf", "hello.txt" or die "Cannot open file!\n";

(注意它必须是open … or die …open(…) || die …,但不能是open … || die …,因为运算符优先规则。)

【讨论】:

  • :crlf 没有改变任何东西问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2021-08-14
  • 2013-11-08
  • 2012-07-30
相关资源
最近更新 更多