Какая самая маленькая программа для анализа заголовка сообщения электронной почты? - PullRequest
4 голосов
/ 17 декабря 2008

домашнее задание: http://www.cs.rit.edu/~waw/networks/prob1.082.html

Хорошо, я все еще не понимаю, почему этот вопрос был задан для моего класса передачи данных и сетей, но вот вопрос из моей домашней работы:

  1. Напишите компьютерную программу, которая читает заголовок сообщения электронной почты и удаляет все строки, кроме тех, которые начать с

    From :, To :, Subject: и Cc:.

КОНКУРС - Кто может написать самый короткий программа, которая делает это.

Поэтому, подумав немного, я решил, что следующий код на Perl настолько мал, насколько я мог это сделать.

#!/usr/bin/perl

while (<>) { print "$_" if ($_ =~ m/^(To:|From:|Subject:|Cc:)/); }

Все, что это делает, действует как фильтр, для которого единственным выходом являются строки, начинающиеся с From :, To :, Subject: и Cc:, как указано в вопросе. Поскольку никаких конкретных подробностей нет, я думаю, что приведенный выше код работает, по крайней мере, для правильного ответа на вопрос.

Теперь, мне интересно, насколько маленькая программа могла бы быть написана для этого? Я могу понять, если никто не хочет публиковать код, потому что они думают, что я буду использовать его для назначения, но я более или менее ищу предложения и методы, которые могли бы помочь мне написать самую короткую возможную программу.

Кроме того, я совершенно точно уверен, что он ссылается на фактическую длину кода. Он упомянул, что скриптовые языки были подходящим вариантом, поэтому я сомневаюсь, что он рассматривает что-то вроде накладных расходов, связанных с переводчиком. Это также означает, что ему все равно, какой язык используется.

Спасибо за внимание!

РЕДАКТИРОВАТЬ: Спасибо за предложения! Я уже давно читаю вопросы здесь, надеюсь, в будущем я смогу внести еще больший вклад. Кроме того, некоторые из предложений я урезал свой код Perl до 55 байт. Я не думаю, что нам нужно иметь дело с чем-то вроде многострочного заголовка.

БОНУС: Кто может найти вескую причину, почему это было задано в классе, где мы обсуждаем такие вещи, как коммутация пакетов и архитектура клиент / сервер?

EDIT2: Для протокола, мой профессор сказал, что кто-то сделал это с чем-то вроде 55 байтов. Единственный способ, которым я вижу это как возможное, - это если бы он только попросил простую реализацию, подобную приведенной выше.

Ответы [ 4 ]

10 голосов
/ 17 декабря 2008

Несколько советов:

  • print "$_" равно print
  • while (<>) {...} можно заменить, добавив -n к опциям в строке #! /
  • $ _ = ~ m // равно //
  • Вы печатаете четыре :, где один достаточно хорош.

Что-то вроде

#!/usr/bin/perl -n
print if /^(To|From|Subject|Cc):/;
6 голосов
/ 17 декабря 2008

ОК, вот программа многострочного сопоставления:

$/="";$_=<>;print$&while/^(To|From|Subject|Cc):.*\n( .*\n)*/mg

Вы хотели коротко, не красиво, верно; -)

3 голосов
/ 17 декабря 2008

Почему вы пытаетесь сначала получить самую короткую возможную программу? Начните с правильного решения, а затем отредактируйте его, чтобы вы больше не могли его удалить. Синтаксис и типизация не будут узким местом для правильного решения. Даже если ваша программа длиннее, чем у других, если вы единственный, кто делает это правильно, вы все равно выиграете. :)

Прочитайте RFC 2822, "Формат интернет-сообщения" , чтобы увидеть, что вам нужно.

Затем посмотрите на существующие библиотеки для разбора электронной почты, которые уже существуют, чтобы увидеть махинации, с которыми им приходится обращаться. Как только вы думаете, что у вас есть решение, потому что вы следуете RFC, начните работать со всеми сломанными почтовыми программами.

Если вы просто пытаетесь выполнить работу, используйте правильный инструмент. Это работа для почты, если вы просто хотите поиграть с сообщениями, но если вам нужно написать жесткий код, который будет работать на всех сообщениях, проходящих через вашу сеть, то что-то вроде qsmtp (mod_perl для MTA ) может быть, что вы хотите.

Что касается того, почему вы должны это делать, что сказал инструктор, когда вы спросили? Вы должны привыкнуть задавать желаемое конечное состояние и ограничения для любого задания, будь то в школе или на «реальной» работе.


Вот правильная программа для правильного завершения задачи. У меня это немного долго, потому что я также читаю все электронные письма из источника (это может быть почти любой распространенный формат хранения электронной почты, такой как mbox, maildir и т. Д.), И я извлекаю только заголовок из каждого сообщения. Это всего 51 символ:

 formail -s formail -c -XTo: -XFrom: -XCc: <my_inbox

Если вы предпочитаете Perl-решение, поэтому у вас есть немного больше контроля над выводом, вот и это:

#!/usr/bin/perl

use Email::Folder;

my $folder = Email::Folder->new($ARGV[0]);

foreach my $message ( $folder->messages )
    {
    print
        join "\n",
        map {
            my $h = $message->header( $_ );
            defined $h ? "$_: $h " : ();
            } 
        qw(From To Cc);

    print "\n\n";
    }   
0 голосов
/ 17 декабря 2008

Что ж, если у вас есть заголовок в строке с одним элементом в строке (To :, From: и т. Д.) С именем $ head, то в Powershell это будет:

$ head.Split ("` n ") | ? {$ _ -match "[To | From | Subject | Cc]:"}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...