Должны ли мы нанять кого-то, кто пишет C на Perl?

55

Один из моих коллег недавно дал интервью некоторым кандидатам на работу, и один сказал, что у них очень хороший опыт в Perl.

Поскольку мой коллега не знал Perl, он попросил меня критиковать какой-то код, написанный (вне сайта) этим потенциальным прокатом, поэтому я посмотрел и рассказал ему о своих проблемах (главное, что он изначально не было комментариев, и это не так, как мы дали им достаточно времени).

Тем не менее, код работает, поэтому я не могу сказать "нет" без лишних входных данных. Еще одна проблема заключается в том, что этот код в основном выглядит точно, как я его код в C. Это было время, поскольку я сделал Perl (и я не делал много, я больше Python bod для быстрых скриптов), но мне кажется напомнить, что это был гораздо более выразительный язык, чем то, что использовал этот парень.

Я ищу информацию от реальных Perl-кодеров и предложения о том, как ее можно улучшить (и почему кодер Perl должен знать этот способ улучшения).

Вы также можете воскресить лирику о том, должны ли люди, которые пишут один язык на совершенно другом языке, (или не должны наниматься). Я интересуюсь вашими аргументами, но этот вопрос прежде всего предназначен для критики кода.

Спецификация должна была успешно обрабатывать CSV файл следующим образом и выводить отдельные поля:

User ID,Name , Level,Numeric ID
pax, Pax Morgan ,admin,0
gt,"  Turner, George" rubbish,user,1
ms,"Mark \"X-Men\" Spencer","guest user",2
ab,, "user","3"

Результат должен был быть чем-то вроде этого (потенциальный код найма действительно выводит это):

User ID,Name , Level,Numeric ID:
   [User ID]
   [Name]
   [Level]
   [Numeric ID]
pax, Pax Morgan ,admin,0:
   [pax]
   [Pax Morgan]
   [admin]
   [0]
gt,"  Turner, George  " rubbish,user,1:
   [gt]
   [  Turner, George  ]
   [user]
   [1]
ms,"Mark \"X-Men\" Spencer","guest user",2:
   [ms]
   [Mark "X-Men" Spencer]
   [guest user]
   [2]
ab,, "user","3":
   [ab]
   []
   [user]
   [3]

Вот код, который они отправили:

#!/usr/bin/perl

# Open file.

open (IN, "qq.in") || die "Cannot open qq.in";

# Process every line.

while (<IN>) {
    chomp;
    $line = $_;
    print "$line:\n";

    # Process every field in line.

    while ($line ne "") {
        # Skip spaces and start with empty field.

        if (substr ($line,0,1) eq " ") {
            $line = substr ($line,1);
            next;
        }

        $field = "";
        $minlen = 0;

        # Detect quoted field or otherwise.

        if (substr ($line,0,1) eq "\"") {
            $line = substr ($line,1);
            $pastquote = 0;
            while ($line ne "") {
                # Special handling for quotes (\\ and \").

                if (length ($line) >= 2) {
                    if (substr ($line,0,2) eq "\\\"") {
                        $field = $field . "\"";
                        $line = substr ($line,2);
                        next;
                    }
                    if (substr ($line,0,2) eq "\\\\") {
                        $field = $field . "\\";
                        $line = substr ($line,2);
                        next;
                    }
                }

                # Detect closing quote.

                if (($pastquote == 0) && (substr ($line,0,1) eq "\"")) {
                    $pastquote = 1;
                    $line = substr ($line,1);
                    $minlen = length ($field);
                    next;
                }

                # Only worry about comma if past closing quote.

                if (($pastquote == 1) && (substr ($line,0,1) eq ",")) {
                    $line = substr ($line,1);
                    last;
                }
                $field = $field . substr ($line,0,1);
                $line = substr ($line,1);
            }
        } else {
            while ($line ne "") {
                if (substr ($line,0,1) eq ",") {
                    $line = substr ($line,1);
                    last;
                }
                if ($pastquote == 0) {
                    $field = $field . substr ($line,0,1);
                }
                $line = substr ($line,1);
            }
        }

        # Strip trailing space.

        while ($field ne "") {
            if (length ($field) == $minlen) {
                last;
            }
            if (substr ($field,length ($field)-1,1) eq " ") {
                $field = substr ($field,0, length ($field)-1);
                next;
            }
            last;
        }

        print "   [$field]\n";
    }
}
close (IN);
  • 22
    Это выглядит чистым и структурированным для меня. Это хорошие вещи.
  • 45
    Этот код едва ли квалифицируется как код Perl.
Показать ещё 15 комментариев
Теги:

23 ответа

171
Лучший ответ

Я советую людям никогда не нанимать программистов на Perl, программистов C или Java-программистов и т.д. Просто нанимайте хороших людей. Программисты, которых я нанял для написания Perl, также были квалифицированы на разных языках. Я нанял их, потому что они были хорошими программистами, и хорошие программисты могут иметь дело с несколькими языками.

Теперь этот код очень похож на C, но я думаю, что он тоже отлично подходит для Perl. Если вы нанимаете хорошего программиста, с небольшой практикой Перла под его поясом, он наверстает упущенное. Люди жалуются на отсутствие регулярных выражений, что упростит ситуацию в вспомогательных областях, но я бы ни на что не захотел использовать регулярное выражение для разбора этих грязных CSV-данных. Я бы не хотел его читать или поддерживать.

Я часто нахожу, что обратная проблема более хлопотная: нанять хорошего программиста, который пишет хороший код Perl, но остальная часть команды знает только основы Perl и не может идти в ногу со временем. Это не имеет никакого отношения к плохому форматированию или плохой структуре, просто уровню навыков с продвинутыми темами (например, закрытием).


В этих дебатах ситуация немного нагревается, поэтому я думаю, что я должен больше объяснить, как я занимаюсь этим делом. Я не рассматриваю это как проблему с регулярным выражением/безрежимом. Я бы не написал код так, как это сделал кандидат, но это не имеет особого значения.

Я пишу довольно немного дерьмового кода. На первом проходе я обычно думаю больше о структуре и процессе, чем синтаксисе. Я возвращаюсь позже, чтобы затянуть это. Это не значит, что код кандидата полезен, но для первого прохода, сделанного в интервью, я не сужу его слишком жестко. Я не знаю, сколько времени ему пришлось писать и т.д., Поэтому я не считаю это основанием для чего-то, над чем я мог бы долго работать. Интервью вопросы всегда странно, потому что вы не можете делать то, что вы действительно делаете для реальной работы. Вероятно, у меня тоже не возник вопрос о написании парсера CSV, если бы мне пришлось начинать с нуля и делать это через 15 минут. В самом деле, я потратил больше времени, чем сегодня, на то, чтобы быть абсолютным болваном с некоторым кодом.

Я пошел посмотреть код Text:: CSV_PP, двоюродный брат Pure Perl на Text:: CSV_XS. Он использует регулярные выражения, но много регулярных выражений, которые обрабатывают особые случаи, и в структуре не отличается от кода, представленного здесь. Это много кода, и это сложный код, который, я надеюсь, мне никогда не придется снова смотреть.

То, что я склоняю к неприятностям, - это ответы на интервью, которые касаются только данного ввода. Это почти всегда неправильное дело в реальном мире, где вам приходится обращаться с делами, которые вы еще не обнаружили, и вам нужна гибкость для решения будущих проблем. Я нахожу, что у вас много ответов на Stackoverflow. Мысленный процесс решения более мне говорит. Люди становятся опытными на языке легче, чем они меняют, как они думают о вещах. Я могу научить людей писать лучше Perl, но я не могу изменить их wetware по большей части. Это происходит от шрамов и опыта.

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

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

  • 2
    Ваш последний пункт противоречит вашему первоначальному аргументу. Если у вас есть хороший программист на Perl и вы нанимаете хороших программистов в свою команду, у них не должно возникнуть проблем стать хорошими программистами на Perl, а наличие рок-звезды, ведущей их, может привести только к более быстрым и лучшим результатам.
  • 27
    Мой последний пункт ничего не противоречит. Рок-звезда не означает, что они эффективные коммуникаторы или наставники, или что они не придурки для людей, которые, по их мнению, уступают. Хороший программист - это не то же самое, что хороший член команды.
Показать ещё 19 комментариев
87

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

 #!/usr/bin/env perl

 use strict;
 use warnings;

 use Text::CSV;

 my $parser = Text::CSV->new({
     allow_whitespace   => 1,
     escape_char        => '\\',
     allow_loose_quotes => 1,
 });

 while(my $line = <>){
     $parser->parse($line) or die "Parse error: ". $parser->error_diag;
     my @row = $parser->fields;
     print $line;
     print "\t[$_]\n" for @row;
 }
  • 25
    Единственный правильный ответ для разбора CSV в Perl - использовать модуль. CSV противен, и легко делать небольшие ошибки. Пусть кто-то еще с этим справится (у них уже есть).
  • 12
    Это единственный правильный ответ. Тратит меньше времени, и на самом деле будет работать. И незнакомые люди, читающие ваш код, не умрут от явной путаницы, когда им придется позже отлаживать ваш анализатор CSV (потому что они это сделают).
Показать ещё 3 комментария
45

Я бы сказал, что писать C в Perl - это гораздо лучшая ситуация, чем писать Perl в C. Как часто воспитывается в подкасте SO, понимание C является достоинством, которое не все разработчики (даже некоторые хорошие) имеют в настоящее время. Возьмите их и купите для них Perl Best Practices, и вы будете установлены. После передового опыта копия Intermediate Perl, и они могли бы работать.

  • 4
    Я хотел бы +2 или что-то. это здравый совет.
  • 1
    Я согласен, что C является частью хорошего фундамента для любого разработчика.
44

Это не ужасно идиоматический Perl, но это не совсем ужасный Perl (хотя он может быть гораздо более компактным).

Два предупреждающих колокола - строка shebang не включает '-w', и нет ни 'use strict;', ни 'use warnings;'. Это очень старый стиль Perl; хороший код Perl использует оба предупреждения и строгий.

Использование дескрипторов старого стиля больше не рекомендуется, но это не так уж плохо (это может быть код, написанный более 10 лет назад, возможно).

Неиспользование регулярных выражений несколько более удивительно. Например:

# Process every field in line.
while ($line ne "") {
    # Skip spaces and start with empty field.

    if (substr ($line,0,1) eq " ") {
        $line = substr ($line,1);
        next;
    }

Это можно было бы написать:

while ($line ne "") {
    $line =~ s/^\s+//;

Это отбивает все ведущие пробелы с помощью регулярного выражения, не делая повторный цикл кода вокруг цикла. Хорошая часть остальной части кода принесет пользу и из тщательно написанных регулярных выражений. Это характерная идиома Perl; удивительно видеть, что они не используются.

Если эффективность была заявленной проблемой (причина не для использования регулярных выражений), тогда вопросы должны быть "вы ее измеряли" и "какую эффективность вы обсуждаете - машина или программист"?

Число рабочих кодов. Более или менее идиоматический код лучше.

Также, конечно, есть модули Text:: CSV и Text:: CSV_XS, которые могут использоваться для обработки синтаксического анализа CSV. Было бы интересно узнать, знают ли они о модулях Perl.


Существует также несколько обозначений для обработки котировок в цитированных полях. В коде предполагается, что обратная косая черта подходит; Я считаю, что Excel использует двойные кавычки:

"He said, ""Don't do it"", but they didn't listen"

Это может быть сопоставлено:

$line =~ /^"([^"]|"")*"/;

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

Некабельное поле будет соответствовать:

$line =~ /^([^,]*)(?:,|$)/;

Это значительно короче, чем показано в цикле и подстроке.


Здесь версия кода, использующая механизм escape-кодов обратной косой черты, используемый в коде в вопросе, выполняет ту же работу.

#!/usr/bin/perl -w

use strict;

open (IN, "qq.in") || die "Cannot open qq.in";

while (my $line = <IN>) {
    chomp $line;
    print "$line\n";

    while ($line ne "") {
        $line =~ s/^\s+//;
        my $field = "";
        if ($line =~ m/^"((?:[^"]|\\.)*)"([^,]*)(?:,|$)/) {
            # Quoted field
            $field = "$1$2";
            $line = substr($line, length($field)+2);
            $field =~ s/""/"/g;
        }
        elsif ($line =~ m/^([^,]*)(?:,|$)/) {
            # Unquoted field
            $field = "$1";
            $line = substr($line, length($field));
        }
        else {
            print "WTF?? ($line)\n";
        }
        $line =~ s/^,//;
        print "   [$field]\n";
    }
}
close (IN);

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

  • 6
    Что ж, сейчас ему меньше 30 лет, но когда вам придется вернуться к добавлению / x после обзора команды, он снова всплывет. Затем, после того, как / x покажется беспорядочным, вы убираете регулярные выражения, помещая их в скаляры с помощью qr //, вы добавляете немного больше. Но, может быть, вы получите часть этого обратно, когда используете \ G, чтобы вам не нужно было изменять строку $, но тогда никто не помнит, как работает \ G. :)
  • 3
    Я был бы обеспокоен, если бы кто-нибудь сделал 30-символьное регулярное выражение более чем на 30 строк с / х - я уверен, что это можно было бы сделать, но это не было бы более читабельным (не в такой степени). Но я согласен - компактность - это переменная величина (или качество).
Показать ещё 2 комментария
29

Не использовать строгие/предупреждающие предупреждения, систематическое использование substr вместо regexp, без использования модулей. Это определенно не тот, у кого есть "очень хороший опыт Perl". По крайней мере, не для реальных проектов Perl. Как и вы, я подозреваю, что это, вероятно, программист на C с базовыми знаниями Perl.

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

27

Мне все равно, использовал ли он регулярные выражения или нет. Мне также все равно, выглядит ли его Perl C или нет. Вопрос, который действительно имеет значение, - это хороший Perl? И я бы сказал, что это не так:

  • Он не использовал use strict
  • Он не включал предупреждения.
  • Он использует старую версию с двумя аргументами open.
  • Комментарий "open file" повреждает и создает впечатление, что код, который он обычно пишет, не содержит комментариев.
  • Код трудно поддерживать
  • Был ли он разрешен использовать модули CPAN? Хороший программист Perl сначала посмотрел бы на эту опцию.
  • 7
    Я думаю, что ответ на вопрос № 6 (или был воспринят как) "нет". Спецификация настолько проста и бессмысленна, что я думаю, что это более продвинутая версия вопроса FizzBuzz. Лично я представил бы две версии: одну, которая показала, что у меня были необходимые знания для самостоятельного решения проблемы (ручной анализ CSV), и другую, которая показала, как я действительно буду это делать в производственной среде (используя CPAN).
  • 4
    вы слишком много выводите из комментария "открыть файл". Я часто обрисовываю то, что я хочу написать, сначала размещая такие комментарии, а затем заполняя код. Я делаю шаги вниз, затем я кодирую.
Показать ещё 4 комментария
23

Я должен (вроде) не согласен с большинством мнений, выраженных здесь.

Поскольку рассматриваемый код может быть выражен гораздо более компактным и поддерживаемым в идиоматическом Perl, вам действительно нужно задать вопрос о том, сколько времени кандидат потратит на разработку этого решения и сколько времени было потрачено кем-то на полпути, используя идиоматический Perl.

Я думаю, вы обнаружите, что этот стиль кодирования может быть огромной тратой времени (и, следовательно, деньгами компании).

Я не утверждаю, что каждый программист на Perl должен grok язык, который, к сожалению, был бы надуманным - но они должны знать достаточно, чтобы не тратить много времени на повторное внедрение функций основного языка в свой код снова и снова.

РЕДАКТИРОВАТЬ Глядя на код снова, я должен быть более решительным: хотя код выглядит очень чистым, это на самом деле ужасно. Сожалею. Это не Perl. Знаете ли вы высказывание "вы можете программировать Fortran на любом языке"? Да, ты можешь. Но вы не должны.

  • 0
    +1 по понятным причинам
  • 0
    Вы не можете делать ничего хорошего в таком языке, пока не будете готовы отпустить знакомое и полностью принять конструкты
Показать ещё 1 комментарий
13

Это случай, когда вам нужно следить за программистом. Спросите его , почему он написал это так.

Может быть, есть очень веская причина. Возможно, это необходимо для того, чтобы следовать тому же поведению, что и существующий код, и поэтому он сделал трансляцию по очереди для полной совместимости. Если да, дайте ему баллы за достойное объяснение.

Или, может быть, он не знает Perl, поэтому он узнал это в тот день, чтобы ответить на вопрос. Если да, дайте ему очки за быстрые и проворные навыки обучения.

Единственный дисквалифицирующий комментарий может быть "Я всегда программирую Perl таким образом. Я не понимаю этого регулярного выражения".

9

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

Если этот человек считает, что у него очень хороший опыт в Perl, и он пишет Perl вот так, он, вероятно, является жертвой Эффект Даннинга-Крюгера.

Итак, это не аренда.

9

Это работает? Он написал это в приемлемый период времени? Считаете ли вы его поддерживаемым?

Если вы можете ответить мне на эти три вопроса, вы можете пройти мост смерти (*).

  • 6
    Груженая или порожняя ласточка? ... да да и пограничный.
  • 3
    ааааааааааааааргхх .. (вы только что упали в овраг)
Показать ещё 1 комментарий
9

Я бы сказал, что его код является адекватным решением. Это работает, не так ли? И есть преимущество в ремонтопригодности, написав "longhand", а не как несколько символов кода, как вы можете.

Девизом Perl является " Там больше, чем один способ сделать это." Perl на самом деле не разбирается в стиле кодирования, как это делают некоторые языки (мне тоже нравится Python, но вы должны признать, что люди могут получить вид снобизма при оценке того, является ли код "pythonic" или нет).

  • 0
    Есть разница между наличием поддерживаемого кода и кода, который прописан в каждом кусочке. Если вы поддерживаете Perl-код, вы должны знать Perl достаточно, чтобы он не записывался таким образом. Мне было бы трудно поддерживать его как есть, потому что, ну, он не выглядит как обычный perl.
8

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

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

  • 0
    Это на самом деле до трех человек, все, кто соответствует основным требованиям (в том числе увлеченность и способность к обучению). Сейчас мы просто ищем различия между ними. Это хорошее замечание о регулярных выражениях.
5

Только начальный блок указывает, что он пропустил основы Perl.

    while ($line ne "") {
    # Skip spaces and start with empty field.

    if (substr ($line,0,1) eq " ") {
        $line = substr ($line,1);
        next;
    }

Это должно быть, по крайней мере, написано с использованием регулярного выражения для удаления ведущего пробела. Мне нравится ответ от jrockway best, модуль rock. Хотя я бы использовал регулярные выражения для этого, что-то вроде.

#!/usr/bin/perl -w
#
# $Id$
#

use strict;

open(FD, "< qq.in") || die "Failed to open file.";
while (my $line = <FD>) {
    # Don't like chomp.
    $line =~ s/(\r|\n)//g;
    # ".*?[^\\\\]"  = Match everything between quotations that doesn't end with
    # an escaped quotation, match lazy so we will match the shortest possible.
    # [^",]*?       = Match strings that doesn't have any quotations.
    # If we combine the two above we can match strings that contains quotations
    # anywhere in the string (or doesn't contain quotations at all).
    # Put them together and match lazy again so we can match white-spaces
    # and don't include them in the result.
    my $match_field = '\s*((".*?[^\\\\]"|[^",]*?)*)\s*';
    if (not $line =~ /^$match_field,$match_field,$match_field,$match_field$/) {
        die "Invalid line: $line";
    }
    # Put values in nice variables so we don't have to deal with cryptic $N
    # (and can use $1 in replace).
    my ($user_id, $name, $level, $numeric_id) = ($1, $3, $5, $7);
    print "$line\n";
    for my $field ($user_id, $name, $level, $numeric_id) {
        # If the field starts with a quotation,
        # strip everything after the first unescaped quotation.
        $field =~ s/^"(.*?[^\\\\])".*/$1/g;
        # Now fix all escaped variables (not only quotations).
        $field =~ s/\\(.)/$1/g;
        print "   [$field]\n";
    }
}
close FD;
  • 1
    Из многих постов кажется, что многие против использования регулярных выражений, но, глядя на примеры данных и результаты, я думаю, что регулярные выражения хороши. Так как образец не является действительным csv-файлом, Text :: CSV сломается на мусоре 'gt, Turner, George', user, 1 '. Он будет отображать: [gt] ["Turner] [George" мусор] [user] [1] Однако он должен убрать текст 'мусора' из строки. Иди с регулярным выражением, живи немного!
5

Простите этого парня. Я бы не посмел разобрать CSV с регулярным выражением, хотя это можно сделать.

DFA в структурированном коде более очевидна, чем здесь регулярное выражение, а перевод DEF → регулярных выражений нетривиальен и склонен к глупым ошибкам.

5

Я бы не согласился с кандидатом. Ему или ей не нравятся идиомы Perl, что приведет к субоптимальному коду, меньшей эффективности работы (все эти ненужные строки должны быть написаны!) И неспособность читать код, написанный опытным кодером Perl (который, конечно же, использует регулярные выражения и т.д. в целом).

Но он работает...

  • 0
    Это несколько необоснованных предположений, основанных на таких небольших доказательствах.
  • 2
    Брайан: Если вы нанимаете кого-то, вы должны основывать свое суждение на любой имеющейся у вас информации. Я могу ошибаться, но лучше уволить хорошего программиста, чем нанимать плохого.
Показать ещё 3 комментария
3

Код не только показывает, что кандидат действительно не знает Perl, но все те строки, которые говорят $line = substr ($line,1), ужасны на любом языке. Попробуйте разобрать длинную строку (скажем, несколько тысяч полей), используя этот тип подхода, и вы поймете, почему. Он просто показывает, какую проблему Джоэл Спольский обсудил в этот пост.

3

Возможно, попросите его написать больше версий одного и того же кода? Когда вы сомневаетесь в найме, задайте больше вопросов кандидату.

3

Тот факт, что он не использовал ни одного элемента регулярного выражения в коде, должен заставить вас задавать ему много вопросов о том, почему он так писал.

Возможно, он Джейми Завински или поклонник, и у него не было больше проблем?

Я не обязательно говорю, что весь синтаксический анализ должен представлять собой огромное количество нечитаемых регулярных выражений CSV, таких как ("([^"]*|"{2})*"(,|$))|"[^"]*"(,|$)|[^,]+(,|$)|(,) или одно из многих похожих регулярных выражений, но, по крайней мере, для прохождения строк или вместо использования substring().

1

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

Если бы мы смотрели на более сложную/большую часть кода, я бы сказал, что комментарии нужны. Но для that (особенно так, как это было написано - хорошо написано), я так не думаю.

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

1

Решающим моментом здесь является, естественно, после того, как он работает так, как ожидалось, независимо от того, поддерживается ли код.

  • Вы поняли это?
  • Вы почувствовали бы себя комфортно, исправляя в нем ошибку?

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

Затем, возможно, вам захочется научить его регулярным выражениям, но только внимательно: -)

1

Как не Perl (? программист?), я должен сказать, что это, наверное, самый читаемый Perl, который я когда-либо читал!:)

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

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

Показать ещё 1 комментарий
1

Очевидным может быть вопрос, если вы не используете Perl в своей компании в первую очередь, неважно, насколько хорош его код Perl?

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

  • 1
    Это хороший момент, за исключением того факта, что мы используем Perl. Эта позиция является засыпкой для того, кому пришлось, скажем так, уйти в спешке. Я мог запутать вас. Я не делал Perl какое-то время, но моя группа коллег использует его.
  • 0
    Ах, тогда честно. :) Поскольку вы и интервьюер, очевидно, не используете Perl, я предположил, что это просто не имеет отношения к работе.
0

Хмм, я ничего не вижу в запросе, что цитаты должны быть удалены, а слова должны быть удалены. В входном файле было слово "мусор", и оно не было на выходе.

Я видел, что CSV файлы, экспортированные с кавычками, ожидали бы те же самые кавычки. Если бы ваша спецификация заключалась в том, чтобы удалить кавычки и посторонние слова прошлых цитат, возможно, эта работа будет необходима.

Я бы посмотрел на это и многословие. Ищите кого-то ленивого (комплимент в Perl).

open (IN, "csv.csv");
while (<IN>) {
    #print $_;
    chomp;
    @array = split(/,/,$_);
    print "[User Id] =  $array[0]  [Name] = $array[1]  [Level] =  $array[2] [Numeric ID] = $array[3]\n";    
}
  • 0
    Слово «мусор» в данных появилось в виде ряда данных, таких как: ,"George Turner" rubbish, Это плохо сформированные данные CSV. Предполагается, что CSV должен иметь либо простой текст между запятыми, либо текст в кавычках между запятыми; это имеет некоторые из обоих. Один из законных способов обработки искаженных данных - игнорирование неверной части (отсюда «Джордж Тернер», выбранный в ответе); другой - потреблять его и рассматривать результат как законный (отсюда и «мусор Джорджа Тернера», как вы, кажется, предпочитаете). Тег «мусор» предполагает, что первое было уместно; вопрос можно обсудить с интервьюером.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню