由于我的同事不知道Perl,他要求我对这个潜在的雇员写的一些代码(非现场)的批评,所以我看了一下,告诉他我的问题(主要的是它最初没有评论它不像我们给他们足够的时间)。
然而,代码工作,所以我不喜欢说没有没有一些更多的输入。另一个问题是,这个代码基本上看起来我是如何在C中编码它。已经有一段时间,因为我做了Perl(我没有做很多,我更多的是一个Python bod的快速脚本),但我似乎回忆起这是一个比这家伙使用的更具表达力的语言。
我正在寻找来自真正的Perl编码器的输入,以及如何改进的建议(以及为什么Perl编码器应该知道改进的方法)。
你也可以嘲笑是否用完全不同的语言写一种语言的人应该(或不应该雇用)。我对你的论点感兴趣,但这个问题主要是对代码的批判。
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,Numeric ID: [User ID] [Name] [Level] [Numeric ID] pax,0: [pax] [Pax Morgan] [admin] [0] gt,George " rubbish,1: [gt] [ Turner,George ] [user] [1] ms,2: [ms] [Mark "X-Men" Spencer] [guest user] [2] ab,"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,1) eq " ") { $line = substr ($line,1); next; } $field = ""; $minlen = 0; # Detect quoted field or otherwise. if (substr ($line,1) eq "\"") { $line = substr ($line,1); $pastquote = 0; while ($line ne "") { # Special handling for quotes (\\ and \"). if (length ($line) >= 2) { if (substr ($line,2) eq "\\\"") { $field = $field . "\""; $line = substr ($line,2); next; } if (substr ($line,2) eq "\\\\") { $field = $field . "\\"; $line = substr ($line,2); next; } } # Detect closing quote. if (($pastquote == 0) && (substr ($line,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,1) eq ",")) { $line = substr ($line,1); last; } $field = $field . substr ($line,1); $line = substr ($line,1); } } else { while ($line ne "") { if (substr ($line,") { $line = substr ($line,1); last; } if ($pastquote == 0) { $field = $field . substr ($line,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,length ($field)-1); next; } last; } print " [$field]\n"; } } close (IN);
解决方法
现在,该代码看起来很像C,但我认为它也很好Perl太。如果你雇用一个好的程序员,在他的皮带下一点Perl练习,他会赶上好。人们抱怨缺乏正则表达式,这将使事情在辅助区域更简单,但我不希望任何人解析该脏数据的正则表达式解决方案。我不想读它或维护它。
我经常发现反向问题更麻烦:聘请一个好的程序员谁编写良好的Perl代码,但团队的其余部分只知道Perl的基础,不能跟上。这与格式不良或结构不良无关,只是一个高级主题(例如关闭)的技能水平。
事情在这场辩论中变得有点热,所以我想我应该更多地解释一下我如何处理这种事情。我不认为这是一个regex /无正则表达式的问题。我不会按照候选人的方式编写代码,但这并不重要。
我写了相当多的肮脏的代码太。在第一遍,我通常更多地考虑结构和过程而不是语法。我后来回来收紧。这并不意味着候选人的代码是任何好处,但对于在面试中做的第一次通过,我不会太苛刻地判断。我不知道他写了多少时间等等,所以我不根据我会有很长时间工作的东西来判断。面试问题总是奇怪的,因为你不能做真正的工作真正的工作。我可能会失败一个关于写一个CSV解析器的问题,如果我不得不从头开始,并在15分钟内完成。事实上,我浪费了比今天是一个总的头部与一些代码。
我去看看代码Text::CSV_PP,Pure Perl表哥Text::CSV_XS.它使用正则表达式,但是很多正则表达式处理特殊情况,在结构中与这里提供的代码没有什么不同。它是很多代码,它是复杂的代码,我希望我从来没有再看。
我倾向于不喜欢的是面试答案,只处理给定的输入。这在现实世界中几乎总是错误的事情,你必须处理你可能还没有发现的情况,你需要灵活性来处理未来的问题。我发现,从Stackoverflow的很多答案也缺失了。解决方案的思维过程更能告诉我。人们比他们改变他们对事物的想法更容易掌握语言。我可以教人们如何写更好的Perl,但我不能改变他们的wetware大部分。这来自疤痕和经验。
由于我不是在那里看候选人的代码解决方案或问他跟进问题,我不会推测为什么他写的方式,他做了。对于我在这里看到的一些其他解决方案,我可以在面试中同样苛刻。
事业是一个旅程。我不期望每个人都是一个上师或有相同的经验。如果我注销人,因为他们不知道一些伎俩或成语,我不给他们继续他们的旅程的机会。候选人的代码将不会赢得任何奖品,但显然足以让他进入最后三个考虑提议。那个家伙在那里上了楼,试过,比我在生活中看到的许多代码好多了,这对我来说足够好了。