Один из моих коллег недавно дал интервью некоторым кандидатам на работу, и один сказал, что у них очень хороший опыт в 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);