English 中文(简体)
拆除柏尔线的新方法
原标题:
  • 时间:2009-05-19 09:24:15
  •  标签:

我保存一份能够从各种来源获得其投入的文字,并按行各业。 视实际使用的来源而定,分界线可能是不一式的,视窗式的,甚至,对一些综合投入而言,是混合的(!)。

在阅读档案时,情况就是如此:

@lines = <IN>;
process(@lines);

...

sub process {
    @lines = shift;
    foreach my $line (@{$lines}) {
        chomp $line;
        #Handle line by line
    }
}

So, what I need to do is replace the chomp with something that removes either Unix-style or Windows-style linebreaks. I m coming up with way too many ways of solving this, one of the usual drawbacks of Perl :)

您对如何克服一般突破的无端做法有何看法? 什么是最有效的?

Edit: 略微澄清——方法过程从某个地方获得一份线表,上读。 每一行可能

  • No trailing linebreaks
  • Unix-style linebreaks
  • Windows-style linebreaks
  • Just Carriage-Return (when original data has Windows-style linebreaks and is read with $/ = )
  • An aggregated set where lines have different styles
最佳回答
问题回答

每当我通过投入,想去除或取代特性时,我就通过像这样的小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小小。

sub clean {

    my $text = shift;

    $text =~ s/
//g;
    $text =~ s/
//g;

    return $text;
}

这种做法可能并不乐观,但多年来,对我来说,这种方法毫无作用。

$line =~ s/[
]+//g;

www.un.org/Depts/DGACM/index_spanish.htm 注:文档:由于设计错误和未保存的错误,没有建议Slurp。 File:Slurper :Tiny ,代替。

回答

use File::Slurp ();
my $value = File::Slurp::slurp($filename);
$value =~ s/R*//g;

文件:Slurp摘要从文件IO中删除,只是为了你而返回。

<>0>

  1. 重要的是,鉴于多线插图,添加<代码>/g,否则它只会取代第1<>> >冒犯性质。

  2. 此外,删除了<条码>,因为我们希望删除all<>。 网上休息,而不仅仅是在“<条码>上<>任何含义之前的线性突破。

  3. 在多线插座中,$string的末端表示,这将产生问题。

  4. 第3点意味着,第2点的假设是,你也希望使用<代码>/m,否则,美元对于与“t”、1条线路或单行处理相关的任何实际操作来说,基本上毫无意义,或者说,实际上理解<代码><>$并设法找到<代码>的“OS” R* 处理$

<>Examples

while( my $line = <$foo> ){
      $line =~ $regex;
}

Given the above notation, an OS which does not understand whatever your files or delimiters, in the default scenario with the OS s default delimiter set for $/ will result in reading your whole file as one contiguous string ( unless your string has the $OS s delimiters in it, where it will delimit by that )

因此,在这种情况下,所有这些地方都无用:

  • /R*$// : Will only erase the last sequence of R in the file
  • /R*// : Will only erase the first sequence of R in the file
  • 12?15?/: 只有删除第1条<代码>01215,12/code>, 或>>>>><15序列,1512>>>><15>。

  • www.un.org/Depts/DGACM/index_russian.htm 如果档案中没有按顺序排列的15$OSDELIMITER,那么,除本办的外,还将删除NO线。

似乎没有人听说过我所说的话,比如说,这就是:testedNOT去除线索。 顺便说一遍,你发现它留下了线索。

#!/usr/bin/perl 

use strict;
use warnings;

my $fn =  TestFile.txt ;

my $LF = "12";
my $CR = "15";

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 : 
";

    local $/ = $osDelimiter;

    open my $fh,  < , $filename;
    while ( my $line = <$fh> )
    {

        $line =~ s/R*$//;
        print ">|" . $line . "|<";

    }
    print "Done.

";
}


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 };
    }
}

www.un.org/Depts/DGACM/index_french.htm Unprocessed production, see here:

请注意,当然还有某些工作组合,但很可能是你自行测试的组合。

请注意,在这项产出中,所有结果必须采用以下表格:<代码>>和>;>>;>;>;>>; with ,视为有效产出。

http://www.un.org/Depts/DGACM/index_french.htm 在全部产出来源中,应当有:

  1. Nothing between {1} and {2}
  2. only |<>| between {1} and {2}

例如,你可以:

chomp(@lines);

或:

$_=join("", @lines);
s/[
]+//g;

或:

@lines = split /[
]+/, join("", @lines);

在档案中直接使用:

perl -e  $_=join("",<>); s/[
]+//g; print  <a.txt |less

perl -e  chomp(@a=<>);print @a  <a.txt |less

3. 扩大Ted Cambron的回答,并在此提及: 如果你把所有线都不加区别地从进入案文的nk中分离出来,那么,如果你在案文后面投出空文,你将最终接手段落。 这是我使用的:

sub cleanLines{

    my $text = shift;

    $text =~ s/
/ /; #replace 
 with space
    $text =~ s/
/ /; #replace 
 with space
    $text =~ s/  / /g; #replace double-spaces with single space

    return $text;
}

最后一种替代措施是使用高温湿度,以便继续找到双层空间,直到它们全部更换为止。 (有效替代单一空间的任何东西)





相关问题
热门标签