Perl-不允许同一行显示两次

时间:2015-08-30 00:11:07

标签: macos bash perl

我有一个perl脚本,我想阻止输入,如

var snd = new Audio("data:audio/wav;base64,omitted, see jsfiddle");
var beepcount = 0;
var beep = function() {
    if ((beepcount++ % 5) < 3) {
        snd.play();
    }
    setTimeout(beep,200);
}
beep();

从两次显示相同的行,所需的输出

Referer: http://www.apple.com/.
Referer: http://www.apple.com/diversity/.
Referer: http://www.apple.com/diversity/.
Referer: http://www.apple.com/diversity/.
Referer: http://www.apple.com/.
Referer: http://www.apple.com/apple-events/september-2015/.

另外,我怎么能摆脱“。”在每一行的结尾? 提前谢谢!

2 个答案:

答案 0 :(得分:2)

首先问问自己,如何使用铅笔和纸张解决这个问题,您可以在源页面上一次发现一行,然后将其写入另一页。您可以使用白板暂时跟踪事物。

  1. 从源页面读取一行。
  2. 如果以前没有看到该线(即,它没有写在白板上),请将其写入新的纸张。 (当然,你读过的第一行从未见过。)
  3. 将您刚阅读的行保存在白板上。
  4. 阅读源页面的下一行。
  5. 在白板上查看它是否写在那里。
  6. 如果未在白板上书写,请将其写在目的地页面上。
  7. 删除白板并写下您刚读过的线条,以便日后再次查看。
  8. 只要源页面上的行仍有待阅读,就重复此步骤。
  9. 所以这是该算法的Perl实现。但是,可以用多种语言实现相同的算法。

    open my $infile, '<', shift or die $!;
    my $whiteboard = q{};
    while( <$infile> ) {
        print unless $_ eq $whiteboard;
        $whiteboard = $_;
    }
    

    这可以写成像这样的Perl单行:

    perl -ne 'print unless defined $tmp && $tmp eq $_; $tmp = $_;' filename.txt
    

    问题的第二部分是如何消除尾随点。因此,对于第一个示例,您可能会这样做:

    open my $infile, '<', shift or die $!;
    my $whiteboard = q{};
    while( <$infile> ) {
        s/\.$//;
        print unless $_ eq $whiteboard;
        $whiteboard = $_;
    }
    

    或者作为一个单行:

    perl -ne 's/\.$//; print unless defined $tmp && $tmp eq $_; $tmp = $_;' filename.txt
    

答案 1 :(得分:0)

如果您不关心订单,可以试试这个:

perl -nale 's/\.$//; $h{$_}++; END{foreach(keys %h){print}}' /path/to/file

使用s/\.$//;删除行尾的.。并使用哈希删除重复的行。