【问题标题】:censored words in perlperl 中的审查词
【发布时间】:2015-12-08 04:44:39
【问题描述】:

我正在尝试制作一个经过审查的文字脚本, 我不知道为什么,但我的脚本没有正确审查这些词。 审查状态为80%~

这是我的代码:

    #!/usr/bin/perl -w
    use strict;

    my @text;
    my @cencoredText;

    my $file = "blabla\\text.txt";
    open(FH, "<", $file) or die "cant open file";

    while(<FH>)
    {
        push(@text,$_);
    }
    close(FH);

    my $cencoredFile = "blabla\\forbidden.txt";
    open(FH2, "<", $cencoredFile) or die "cant open file";

    while(<FH2>)
    {
        push(@cencoredText,$_);
    }

    close(FH2);

    for(my $i=0; $i<@cencoredText; $i++)
    {
        for(my $j=0; $j<@text; $j++)
        {
            $text[$j] =~ s/${cencoredText[$i]}/censored/g;
        }

    }

这两个文件打开,perl 脚本从它们那里获取信息.. 我不知道怎么了。。 谢谢!

【问题讨论】:

  • "我的脚本没有正确地审查单词。审查状态是 80%"。这是什么意思? “适当地”是什么意思?您是否尝试过打印出每一行和要检查的每个单词,以确保您的文本处理是您认为应该的?
  • 你没有咀嚼;您的“单词”末尾有换行符,因此它们不会经常匹配。
  • 我正在使用 regexboddy,是的,我打印了数组中的每个单元格,看起来还不错
  • 如果这只是一个家庭作业或玩具脚本,你的方法很好,但是don't expect a regex-based profanity filter (or any blacklist-type content filter in general) to work 100% in the wild.
  • 请不要将整个文件读入内存:这很浪费而且很少需要。相反,您应该逐行读取和处理文件。但是如果你确实需要读入一个数组,那么my @text = &lt;FH&gt;就是你想要的——没有必要在循环中调用push

标签: perl


【解决方案1】:

要回答您的直接问题,您需要在读入两个数组@text@censoredText 的每个输入行末尾的换行符chomp

...
while( <FH> ) {
    chomp;
    push(@text,$_);
}
close(FH);

my $cencoredFile = "blabla\\forbidden.txt";
open(FH2, "<", $cencoredFile) or die "cant open file";

while(<FH2>) {
    chomp;
    push(@cencoredText,$_);
}
...

与您所问的内容没有直接关系的几点:

数组真的是指示单词应该被审查的最佳数据结构选择吗?

我会说不。一个问题是,要识别应该审查的单词,您当前循环遍历@censoredText 中的每个单词,然后对于每个单词,您遍历@text 的每一行。如果你有 N 行文本和 M 个禁用词,那么你的整体复杂度为O(N*M),随着 N 和 M 的增加,这并不是很好。如果您使用哈希来表示应该被审查的单词,您可以将其减少到 O(max(N,M))

或者,您可以使用每个禁用词构建一个模式,并在整个输入文件中进行全局替换。

【讨论】:

  • 嗨,我试过了,但我仍然有未经审查的文字。在一行中,我有“嗨”这个词,该行是:“嗨,我的名字是 x,嗨,我的名字是 y”,它像这样对它进行了审查:“嗨,我的名字是 x 并且审查了我的名字是 y”跨度>
猜你喜欢
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2019-04-26
  • 2016-06-22
  • 2020-08-09
  • 1970-01-01
相关资源
最近更新 更多