首页 文章

用“连接”连接Perl中的字符串

提问于
浏览
8

See Update Below

我正在浏览我公司的一些人编写的一大堆Perl脚本 . 他使用 join 来连接字符串 . 例如,他这样做(从真正的Perl脚本中获取热点):

$fullpath=join "", $Upload_Loc, "/", "$filename";

而不是这个:

$fullpath = "$Upload_Loc" . "/" . "$filename";

或者就是这样:

$fullpath = "$Upload_Loc/$filename";

他不在了,但是在这里的人告诉我他以这种方式连接字符串,因为它在某种程度上更好 . (他们不太清楚为什么) .

那么,为什么有人在这个问题上使用 join 而不是使用 . 连接运算符,或者只是像第三个例子那样键入字符串?这种编码风格有正当理由吗?

我确实做 join 并不是一种连接字符串的非常有效的方法 . 然而,虽然我认为自己是一个大师,因为我深深的内心秘密 . 在我愚弄自己之前,我只是想确保我的直觉在这里是正确的 .

我有更好的办法在这里做到这一点 .


更新

人们变得困惑 . 他不只是为了连接路径 . 这是另一个例子:

$hotfix=join "", "$app", "_", "$mod", "_", "$bld", "_", "$hf", ".zip";

我会在哪里做这样的事情:

$hotfix = $app . "_"  $mod . "_" . $bld . "_" . "$hf.zip";

或者,更有可能

$hotfix = "${app}_${mod}_${bld}_${hf}.zip";

或者在这种情况下,我可能实际使用 join ,因为下划线会导致问题:

$hotfix = join("_", $app, $mod, $bld, $hf) . ".zip";

我的问题仍然是:他是否正在做一些真正的Perl黑客知道的事情,以及像我这样知道的新手?有人看着我使用_684685连接字符串或只是将它们放在引号中然后说"Ha! What a noob! I bet he owns a Macintosh too!"

或者,以前的家伙是否只有一种独特的编程风格,就像我儿子独特的驾驶风格包括跑到树上?

7 回答

  • 4

    我从来没有见过 join 这样使用过 . 您的第三个示例将是我的首选替代方案,因为它简单,干净且易读 .

    和其他人一样,我认为使用 join 作为性能增强器没有任何真正的 Value . 它可能比字符串插值更好地执行,但我无法想象一个真实的情况,其中优化可能是合理的,但代码仍然用脚本语言编写 .

    正如这个问题所表明的那样,深奥的编程习语(用任何语言)只会导致很多误解 . 如果你很幸运,这种误解是良性的 . 我喜欢与之合作的开发人员是那些编写可读性和一致性的人,并在周末离开Perl Golf . :)

    简而言之:是的,我认为他独特的风格类似于你儿子独特的驾驶风格 . :)

  • 1

    我会考虑

    $fullpath = join "/", $Upload_Loc, $filename;
    

    比替代品更清晰 . 但是,File::Spec已经成为核心很长一段时间了

    use File::Spec::Functions qw( catfile );
    # ...
    $fullpath = catfile $Upload_Loc, $filename;
    

    好多了而且,更好的是,有Path::Class

    use Path::Class;
    
    my $fullpath = file($Upload_Loc, $filename);
    

    速度通常不是我在连接文件名和路径时考虑的因素 .

    您在更新中提供的示例:

    $hotfix=join "", "$app", "_", "$mod", "_", "$bld", "_", "$hf", ".zip";
    

    证明了这个家伙为何无能为力 . 首先,不需要插入那些单个变量 . 其次,写得更好

    $hotfix = join '_', $app, $mod, $bld, "$hf.zip";
    

    或者,作为

    $hotfix = sprintf '%s_%s_%s_%s.zip', $app, $mod, $bld, $hf;
    

    减少不必要的标点符号是我的最终目标 .

  • 0

    通常,除非要加入的项目列表很大,否则您将看不到很多性能差异,将它们更改为连接 . 主要关注的是可读性和可维护性,在这种情况下,如果字符串插值形式更清晰,您当然可以使用它 .

    我猜这只是原始程序员的个人编码偏好 .

    一般情况下,当列表的长度很大/未知时,或者我正在使用空字符串以外的其他内容(或用于数组插值的单个空格)时,我使用 join . 否则,使用 . 或简单的字符串插值通常更短且更容易阅读 .

  • 0

    Perl将双引号字符串编译成包含 join. catenation的内容:

    $ perl -MO=Deparse,-q -e '$fullpath = "$Upload_Loc/$filename"'
    $fullpath = $Upload_Loc . '/' . $filename;
    -e syntax OK
    
    $ perl -MO=Deparse,-q -le 'print "Got @ARGV"'
    BEGIN { $/ = "\n"; $\ = "\n"; }
    print 'Got ' . join($", @ARGV);
    -e syntax OK
    

    这可能会激发你这样的事情:

    $rx = do { local $" = "|"; qr{^(?:@args)$} };
    

    如:

    $ perl -le 'print $rx = do { local $" = "\t|\n\t"; qr{ ^ (?xis: @ARGV ) $ }mx }' good stuff goes here
    (?^mx: ^ (?xis: good    |
            stuff   |
            goes    |
            here ) $ )
    

    好漂亮,嗯?

  • 3

    插值比加入列表要慢一点 . 那说我从来不认识任何人把它带到这个极端 .

    您可以使用 Benchmark 模块来确定存在多大差异 .

    另外,你可以在http://perlmonks.org/上提出这个问题 . 那里有真正的大师可能会比我更好地给你内心的秘密 .

  • 6

    所有这些方法都很好 .

    Join有时可能比 . concatentate更强大,特别是当你加入的一些东西是数组时:

    join "/", "~", @document_path_elements, $myDocument;
    
  • 2

    虽然我认识到在这里看到的所有例子中都没有明显的性能差异,但无论是使用 . 还是使用双引号内插,一系列连接确实比连接预先计算所需的内存效率更低 . 结果的字符串缓冲区,而不是多次扩展(甚至可能需要将部分resutl移动到新位置)每一次) .

    对于我在这里看到的批评,我有一个问题;有很多正确的方式可以说perl,这肯定是其中之一 .

    另一方面,压痕不一致......

相关问题