当前位置:  开发笔记 > 编程语言 > 正文

我们应该雇用在Perl中编写C的人吗?

如何解决《我们应该雇用在Perl中编写C的人吗?》经验,为你挑选了15个好方法。

我的一位同事最近采访了一些求职者,其中一位表示他们有非常好的Perl经验.

由于我的同事不认识Perl,他要求我批评一些潜在雇员编写的(异地)代码,所以我看了一眼并告诉他我的担忧(主要的是它最初没有评论)而且它不像我们给他们足够的时间).

但是,代码有效,所以我不愿意在没有更多输入的情况下说不行.另一个问题是,这段代码基本上看起来就像我在C中编写代码一样.自从我做Perl以来已经有一段时间了(我没有做很多事情,我更喜欢Python脚本用于快速脚本)但我似乎要记住,这是一个比这个人使用的更具表现力的语言.

我正在寻找真正的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 () {
    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);

brian d foy.. 165

我建议人们永远不要雇用Perl程序员,C程序员或Java程序员,等等.只是雇用好人.我聘请编写Perl的程序员也熟练掌握其他各种语言.我雇用他们是因为他们是优秀的程序员,优秀的程序员可以处理多种语言.

现在,该代码确实看起来很像C,但我认为Perl也很好.如果你正在招聘一名优秀的程序员,在他的腰带上进行一些Perl练习,他会很好地追赶.人们抱怨缺乏正则表达式,这会使辅助领域的事情变得更简单,但我不希望任何人在解析那些脏的CSV数据时使用正则表达式解决方案.我不想阅读或维护它.

我经常发现反向问题更麻烦:聘请一位编写好Perl代码的优秀程序员,但团队的其他成员只知道Perl的基础知识并且无法跟上.这与糟糕的格式化或糟糕的结构无关,只与高级主题(例如闭包)的技能水平无关.


在这场辩论中事情变得有点激烈,所以我想我应该更多地解释一下我是如何处理这类事情的.我不认为这是正则表达式/非正则表达式问题.我不会像候选人那样编写代码,但这并不重要.

我也写了很多糟糕的代码.在第一遍,我通常更多地考虑结构和过程而不是语法.我后来回去把它收紧.这并不意味着候选人的代码是好的,但对于在面试中完成的第一次传球我不会过于严厉地判断.我不知道他有多少时间写它等等,所以我不会根据我需要很长时间才能完成的事情来判断它.面试问题总是很奇怪,因为你不能做你真正为实际工作所做的事情.如果我不得不从头开始并在15分钟内完成,我可能也不会有关于编写CSV解析器的问题.事实上,我今天浪费的不仅仅是一些带有一些代码的傻瓜.

我去看了Text :: CSV_PP的代码,Pure Perl表兄到Text :: CSV_XS.它使用正则表达式,但是许多正则表达式处理特殊情况,并且在结构上与此处提供的代码没有什么不同.这是很多代码,它是复杂的代码,我希望我再也不用看了.

我倾向于不喜欢的是面试答案,只能解决给定的输入.在现实世界中,这几乎总是错误的,你必须处理你可能还没有发现的案例,你需要灵活处理未来的问题.我发现Stackoverflow上的很多答案都缺少了.解决方案的思维过程对我来说更有说服力.人们比他们改变对事物的思考方式更容易熟练掌握语言.我可以教人们如何写出更好的Perl,但我不能在大多数情况下更换他们的湿件.这来自于伤疤和经验.

由于我不在那里看候选代码解决方案或问他后续问题,我不会推测为什么他按照他的方式写它.对于我在这里看到的其他一些解决方案,我在采访中也同样苛刻.

事业是一段旅程.我不希望每个人都成为一个大师或拥有相同的经历.如果我因为不知道某些伎俩或成语而注销人,我就不会给他们继续他们旅程的机会.候选人的代码不会赢得任何奖项,但显然足以让他进入最后三个考虑提供奖金.那家伙站起来尝试,比我生命中看到的许多代码做得更好,这对我来说已经足够了.



1> brian d foy..:

我建议人们永远不要雇用Perl程序员,C程序员或Java程序员,等等.只是雇用好人.我聘请编写Perl的程序员也熟练掌握其他各种语言.我雇用他们是因为他们是优秀的程序员,优秀的程序员可以处理多种语言.

现在,该代码确实看起来很像C,但我认为Perl也很好.如果你正在招聘一名优秀的程序员,在他的腰带上进行一些Perl练习,他会很好地追赶.人们抱怨缺乏正则表达式,这会使辅助领域的事情变得更简单,但我不希望任何人在解析那些脏的CSV数据时使用正则表达式解决方案.我不想阅读或维护它.

我经常发现反向问题更麻烦:聘请一位编写好Perl代码的优秀程序员,但团队的其他成员只知道Perl的基础知识并且无法跟上.这与糟糕的格式化或糟糕的结构无关,只与高级主题(例如闭包)的技能水平无关.


在这场辩论中事情变得有点激烈,所以我想我应该更多地解释一下我是如何处理这类事情的.我不认为这是正则表达式/非正则表达式问题.我不会像候选人那样编写代码,但这并不重要.

我也写了很多糟糕的代码.在第一遍,我通常更多地考虑结构和过程而不是语法.我后来回去把它收紧.这并不意味着候选人的代码是好的,但对于在面试中完成的第一次传球我不会过于严厉地判断.我不知道他有多少时间写它等等,所以我不会根据我需要很长时间才能完成的事情来判断它.面试问题总是很奇怪,因为你不能做你真正为实际工作所做的事情.如果我不得不从头开始并在15分钟内完成,我可能也不会有关于编写CSV解析器的问题.事实上,我今天浪费的不仅仅是一些带有一些代码的傻瓜.

我去看了Text :: CSV_PP的代码,Pure Perl表兄到Text :: CSV_XS.它使用正则表达式,但是许多正则表达式处理特殊情况,并且在结构上与此处提供的代码没有什么不同.这是很多代码,它是复杂的代码,我希望我再也不用看了.

我倾向于不喜欢的是面试答案,只能解决给定的输入.在现实世界中,这几乎总是错误的,你必须处理你可能还没有发现的案例,你需要灵活处理未来的问题.我发现Stackoverflow上的很多答案都缺少了.解决方案的思维过程对我来说更有说服力.人们比他们改变对事物的思考方式更容易熟练掌握语言.我可以教人们如何写出更好的Perl,但我不能在大多数情况下更换他们的湿件.这来自于伤疤和经验.

由于我不在那里看候选代码解决方案或问他后续问题,我不会推测为什么他按照他的方式写它.对于我在这里看到的其他一些解决方案,我在采访中也同样苛刻.

事业是一段旅程.我不希望每个人都成为一个大师或拥有相同的经历.如果我因为不知道某些伎俩或成语而注销人,我就不会给他们继续他们旅程的机会.候选人的代码不会赢得任何奖项,但显然足以让他进入最后三个考虑提供奖金.那家伙站起来尝试,比我生命中看到的许多代码做得更好,这对我来说已经足够了.


我的最后一点并不矛盾.摇滚明星并不意味着他们是有效的传播者或导师,或者他们不是他们认为低劣的人的混蛋.优秀的程序员与优秀的团队成员不是一回事.
Konrad:由于正则表达式很容易用来解析CSV,为什么不发布一个呢?
康拉德,你错了.正确解析CSV需要随时跟踪解析状态(我是否在引用字段中,我是否只看到了转义).这种东西会造成混乱或(几乎)不可能的正则表达式.我说几乎不可能,因为Perl确实具有维持regexx内部状态的功能.尽管如此,在Perl中解析CSV的正确方法是一次一个字符.也就是说,我在采访中提出了类似的问题,到目前为止,最好的答案是"我会使用CPAN的Text :: CSV(_XS)."
真正的CSV几乎肯定无法被正则表达式解析,任何人在编写之后都能理解.尽管人们很容易相信Perl解决的每个问题都需要一个很大的正则表达式,但实际上有很多方法可以实现.brian d foy(注意没有上限)就在这里.
Brian:这里有一个问题:即你认为上面的混乱比一个清晰的正则表达式更容易维护 - 只是因为它表面上是干净的代码.清洁代码并非一切:上面是100%纯粹的视觉混乱,它隐藏了很多语法噪音中的语义.
@jaredor:想想你喜欢什么,但它仍然是OP最喜欢的答案.也许你不喜欢它,那很好.你不是每个人,你不是OP,你不是大多数投票的人.您的少数意见被记录并提交.
这个答案是不合理的:OP没有问一个关于谁能成为一名优秀的Perl程序员的哲学问题,OP正在谈论当前Perl程序员的招聘决定.这段代码不是Perl"非常好"的人的代码.当然,它确实显示了对Perl的substr函数的基本理解; 它没有证明对模块化,数据结构甚至Perl习语的理解.对于"非现场"编写的代码,它只显示产生答案的最低限度,因此对于声称"真实"体验的人来说应该是没有任何意义.
@brian-即使你的慷慨解释(在小池塘里误导了大量的鱼,有过度的自我舆论)是正确的,你是否想聘请一个在他的职业上如此糟糕的人,以至于他没有继续学习到他不知道的那一点"那个更大的世界"?我肯定会非常谨慎 - 再次,这不是他的代码的质量会让我暂停,但不和谐,无论这种不和的理由/借口是什么.
如果像Brian一样受到尊重的人在Perl社区中说这是一个不错的Perl代码,我倾向于同意.话虽如此,我不认为开发人员"非常好".虽然代码没有任何问题(特别是新手倾向于做的事情类型),但它不是惯用的,它包含一些过时的结构.申请人有资格在Perl,但显然不是高级用户.
你的最后一点与你最初的论点相矛盾.如果你有一个优秀的Perl程序员并且你雇佣了优秀的程序员给他们的团队,他们应该没有成为优秀的Perl程序员的问题,而拥有一个领导他们的摇滚明星只能产生更快更好的结果.
该脚本中的所有内容都是Perl功能.
@Konrad,听起来很简单,但是如果你曾经写过一个,你会很快看到正则表达式变得非常复杂,特别是当你发现引用的字段可以在其中有换行符时.例如,OP的解析器会遇到问题,因为它按行工作,并且会考虑\n一行的结尾.因此,您无法按行处理它,因此您有两个选项:表示整个文件的可能很大的字符串上的正则表达式,或状态机.
@jaredor:即使这个人声称"真实经历",他们可能根本没有实际经验来判断他们的经历.这并不意味着他们无法快速学习或跳到更高的水平.没有任何其他事情,NO HIRE警察似乎更多的是为了报复过去的错误.我的回答虽然没有直接针对问题,但显然是需要的答案.请注意,它已被接受.我试着回答人们的问题,而不是他们提出的问题.提出问题的需要意味着人们没有掌握情况来问正确的问题.
@'brian d foy'注意"接受"不是"正确"的同义词; 根据我在低估这个"最佳答案"时出现的弹出窗口,它仍然可以从批评中受益.我认为你已经过多地传达了你对这种招聘情况的看法.一般来说,我主要同意你雇用程序员,但是OP正在谈论现在招聘的现在.特别是,我认为这个答案并不尊重技术评审员的直觉,这显然有些不对劲.在这种情况下,重新定义问题不是服务.
@brian - 偶然发现了这个具体的问题,我必须加上我尊重的分歧.OP明确表示"非常好的Perl体验"加上"非现场"(例如,不在超时压力下)代码.这段代码并不糟糕,它完全不是太糟糕.但是......具有良好经验的真正Perl开发人员几乎自动生成(例如在IO相关的`die`末尾添加`$!`),这远远不是代码的质量.所以这位先生可能错误地代表了自己)

2> jrockway..:

他的代码有点冗长.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;
 }


在Perl中解析CSV的唯一正确答案是使用模块.CSV是令人讨厌的,很容易犯错误.让其他人处理它(他们已经有).
为了公平对待那些在接受采访时对他产生这种情况的可怜的傻瓜.测试是否以这样一种方式设置,即使用模块是否合适?环境是否设置得足够好,他可以找到并使用像Text :: cvs这样的模块?(这是一个常见的perl问题 - 你被告知安装perl然后你发现只安装了interpeter,所有"标准"模块都丢失了,cpan无法通过公司防火墙).
这是唯一正确的答案.浪费更少的时间,并将实际工作.阅读代码的陌生人在以后必须调试CSV解析器时会因为混乱而死亡(因为他们会).
也许这项运动特别是.从头开始实现它?

3> Copas..:

我认为在Perl中编写C语言比在C语言中编写Perl要好得多.正如在SO播客中经常提到的那样,理解C是一种并非现在所有开发人员(甚至是一些好的开发人员)的优点.雇用他们并为他们购买Perl最佳实践的副本,您将被设置.经过最佳实践后,中级Perl的副本可以解决.


我希望我能+2或其他什么.这是合理的建议.

4> Jonathan Lef..:

它不是可怕的惯用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 =~ /^([^,]*)(?:,|$)/;

这比所示的循环和子串缩短得多.


这是代码的一个版本,使用问题代码中使用的反斜杠双引号转义机制,它执行相同的工作.

#!/usr/bin/perl -w

use strict;

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

while (my $line = ) {
    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.原始版本比需要的更大.而且我并没有竭尽全力将代码减少到最低限度.


好吧,它现在不到30岁,但是当你必须在团队审核后回到添加/ x时它会再次爆发.然后,在/ x使它看起来很混乱之后,你将正则表达式移开,将它们放入带有qr //的标量中,你再添加一点.但是,也许你在使用\ G时得到一些回复,所以你不必修改$ line,但是没有人记得\ G是如何工作的.:)
我担心如果有人制作一个30个字符的正则表达式用/ x扩展超过30行 - 我确信它可以完成,但它不会更具可读性(不是那么极端).但我同意 - 紧凑性是一个可变数量(或质量).
现在让它在带引号字段的换行符的CSV上工作,继续,敢于你.).它必须与2G csv文件一起使用.

5> mirod..:

没有使用严格/使用警告,系统使用substr而不是regexp,不使用模块.绝对不是那些拥有" 非常好的Perl体验 "的人.至少不适用于现实生活中的Perl项目.和你一样,我怀疑它可能是一个具有Perl基础知识的C程序员.

这并不意味着他们无法学习,特别是因为周围还有其他Perl人.这似乎意味着他们夸大了他们的工作资格.关于他们如何获得非常好的Perl体验的几个问题将是有序的.



6> innaM..:

我不在乎他是否使用正则表达式.我也不在乎他的Perl是否看起来像C.真正重要的问题是:这个好Perl?而且我会说它不是:

    他没有使用 use strict

    他没有启用警告.

    他正在使用老式的两个版本的open.

    "打开文件"评论会让人觉得他通常写的代码不包含任何评论.

    代码很难维护

    他被允许使用CPAN模块吗?一个优秀的Perl程序员会先看看这个选项.


我认为#6的答案是(或被认为是)"不".规范是如此简单和毫无意义,我认为这是FizzBu​​zz问题的更高级版本.就个人而言,我本来会提交两个版本:一个表明我有自己解决问题的必要知识(手工推出的CSV解析),另一个表明我将如何在生产环境中真正做到这一点(利用CPAN).
你从"开放档案"评论中得出的结论太多了.我经常通过首先放置那些注释,然后填写代码来概述我想写的内容.我把步骤放下,然后我编码.

7> Konrad Rudol..:

我必须(有点)不同意这里表达的大多数观点.

由于有问题的代码可以在惯用的Perl中表达得更加紧凑和易于维护,因此您需要提出一个问题,即候选人花费多少时间来开发此解决方案,以及使用惯用Perl熟练掌握多少时间.

我想你会发现这种编码风格可能会浪费大量时间(因而也就是公司的钱).

我不认为每个Perl程序员都需要理解这种语言 - 遗憾的是,这种语言很难实现 - 但是他们应该足够了解不要花费多年时间在代码中重复实现核心语言功能.

编辑再次查看代码,我必须更加激烈:虽然代码看起来非常干净,但它实际上很糟糕.抱歉.这不是Perl.你知道"你可以用任何语言编写Fortran"的说法吗?是的你可以.但你不应该.



8> SPWorley..:

在这种情况下,您需要跟进程序员.问他为什么这样写.

可能有一个很好的理由......也许这需要遵循与现有代码相同的行为,因此他为了完全兼容性而进行了逐行翻译.如果是这样的话,请给他一些好的解释.

或许他不知道Perl,所以他在那天下午学会了回答这个问题.如果是这样的话,给他点快速灵活的学习技巧.

唯一不合格的评论可能是"我总是用这种方式编写Perl.我不明白那个正则表达式的东西."



9> thijs..:

它有用吗?他是否在可接受的时间内写下了?你认为它是可维护的吗?

如果你能回答我这些问题三,你可以通过死亡之桥(*).


永远不允许Python粉丝(Monty,而不是Guido,风格)相互沟通 - 它总是会引用整部电影:-)
拉登还是空腹?......是,是和边界.
aaaaaaaaaaaaaarghh ..(你刚落入山沟)

10> Bill Karwin..:

我会说他的代码是一个合适的解决方案.它有效,不是吗?通过编写"longhand"代替尽可能少的代码字符,可维护性具有优势.

Perl的座右铭是" 不止一种方式去做 ".Perl并没有真正了解有关编码风格的案例,就像有些语言一样(我也喜欢Python,但是你必须承认人们在评估代码是否是"pythonic"时)会得到一些势利.



11> Unknown..:

我的一位同事最近采访了一些求职者,其中一位表示他们有非常好的Perl经验.

如果这个人认为他有非常好的Perl经验并且他像这样写Perl,他可能是Dunning-Kruger效应的受害者.

所以,这是一个没有聘用.



12> Artem Russak..:

我认为最大的问题是他或她没有表现出正则表达式的任何知识.这是Perl的关键.

问题是,他们可以学习吗?在这段代码中,候选人需要寻找很多东西.



13> Erich Kitzmu..:

我不接受候选人.他或她对Perl的习语感到不舒服,这会导致代码不够理想,工作效率降低(所有那些不必要的行必须写出来!)以及阅读由经验丰富的Perl编码器编写的代码的无法使用(当然使用正则表达式)等等).

但它有效......


布莱恩:如果你雇用某人,你必须根据自己的信息做出判断.我可能错了,但最好是解雇一个优秀的程序员而不是雇用一个糟糕的程序员.
为你的"但它有效......"链接+1.如此真实.

14> Johan Soderb..:

只是初始块表明他已经错过了关于Perl的基础知识.

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

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

至少应使用正则表达式来删除前导空格.我喜欢jrockway最好的答案,模块摇滚.虽然我会用正则表达式来做这件事,比如说.

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

use strict;

open(FD, "< qq.in") || die "Failed to open file.";
while (my $line = ) {
    # 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;



15> Joshua..:

原谅这个家伙.即使可以完成,我也不敢用正则表达式解析CSV.

结构化代码中的DFA比这里的正则表达式更明显,DFA - >正则表达式翻译是不平凡的,容易出现愚蠢的错误.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有