2017 年的注释:由于设计错误和未维护的错误,不推荐使用 File::Slurp。请改用File::Slurper或Path::Tiny。
延伸你的答案
use File::Slurp ();
my $value = File::Slurp::slurp($filename);
$value =~ s/\R*//g;
File::Slurp 抽象出 File IO 的东西,只为你返回一个字符串。
笔记
重要的是要注意添加/g
,没有它,给定一个多行字符串,它只会替换第一个违规字符。
此外,删除$
对于此目的是多余的,因为我们想要删除所有换行符,而不仅仅是$
在此操作系统上的任何含义之前的换行符。
在多行字符串中,$
匹配字符串的结尾,这将是有问题的)。
第 3 点意味着第 2 点是在假设您还想使用的前提下做出/m
的$
并设法找到\R*
继续进行的$
例子
while( my $line = <$foo> ){
$line =~ $regex;
}
鉴于上述符号,操作系统不理解您的文件 '\n' 或 '\r' 分隔符,在默认情况下,操作系统的默认分隔符设置为$/
将导致将整个文件作为一个连续的字符串读取(除非您的字符串中有 $OS 的分隔符,它将由它分隔)
所以在这种情况下,所有这些正则表达式都是无用的:
/\R*$//
:只会擦除\R
文件中的最后一个序列
/\R*//
:只会擦除\R
文件中的第一个序列
/\012?\015?//
: When 只会擦除第一个012\015
, \012
, or\015
序列,\015\012
将导致要么 要么\012
被\015
发射。
/\R*$//
: 如果文件中恰好没有 '\015$OSDELIMITER' 的字节序列,那么除了操作系统自己的换行符之外,不会删除任何换行符。
似乎没有人明白我在说什么,所以这里是示例代码,经过测试不会删除换行符。运行它,你会看到它留下了换行符。
#!/usr/bin/perl
use strict;
use warnings;
my $fn = 'TestFile.txt';
my $LF = "\012";
my $CR = "\015";
my $UnixNL = $LF;
my $DOSNL = $CR . $LF;
my $MacNL = $CR;
sub generate {
my $filename = shift;
my $lineDelimiter = shift;
open my $fh, '>', $filename;
for ( 0 .. 10 )
{
print $fh "{0}";
print $fh join "", map { chr( int( rand(26) + 60 ) ) } 0 .. 20;
print $fh "{1}";
print $fh $lineDelimiter->();
print $fh "{2}";
}
close $fh;
}
sub parse {
my $filename = shift;
my $osDelimiter = shift;
my $message = shift;
print "Parsing $message File $filename : \n";
local $/ = $osDelimiter;
open my $fh, '<', $filename;
while ( my $line = <$fh> )
{
$line =~ s/\R*$//;
print ">|" . $line . "|<";
}
print "Done.\n\n";
}
my @all = ( $DOSNL,$MacNL,$UnixNL);
generate 'Windows.txt' , sub { $DOSNL };
generate 'Mac.txt' , sub { $MacNL };
generate 'Unix.txt', sub { $UnixNL };
generate 'Mixed.txt', sub {
return @all[ int(rand(2)) ];
};
for my $os ( ["$MacNL", "On Mac"], ["$DOSNL", "On Windows"], ["$UnixNL", "On Unix"]){
for ( qw( Windows Mac Unix Mixed ) ){
parse $_ . ".txt", @{ $os };
}
}
对于CLEARLY Unprocessed输出,请参见此处:http ://pastebin.com/f2c063d74
请注意,某些组合当然有效,但它们很可能是您自己天真地测试过的组合。
请注意,在此输出中,所有结果必须>|$string|<>|$string|<
采用NO LINE FEEDS的形式才能被视为有效输出。
并且$string
是一般形式{0}$data{1}$delimiter{2}
,在所有输出源中,应该有:
{1}
和之间没有{2}
- 仅
|<>|
在{1}
和之间{2}