【问题标题】:What's the simplest way to return the first line of a multi-line string in Perl?在 Perl 中返回多行字符串的第一行的最简单方法是什么?
【发布时间】:2010-09-30 11:52:19
【问题描述】:

当我说简单时,我的意思是在一个表达式中,这样我就可以将它作为一个值粘贴到散列中,而无需先准备它。我会发布我的解决方案,但我正在寻找一个更好的解决方案,让我不那么想起 VB。 :)

【问题讨论】:

  • 为什么不喜欢提前准备?它通常需要花哨的魔力来作为单线工作,这与简单相反。虽然弄清楚这些事情很有趣,但在真正的程序中使用它们并不是一个好主意,因为你越了解,以后就越难弄清楚。
  • 这是一个临时解决方案。 :) 好点。

标签: perl string multiline


【解决方案1】:
substr($s, 0, index($s, $/) > -1 ? index($s, $/) || () )

【讨论】:

    【解决方案2】:

    怎么样

    ( split /\n/, $s )[0]
    

    ?

    您不必担心\n 不是跨平台的,因为Perl is clever enough to take care of that

    【讨论】:

    • 谢谢,这就是我想要的!我也期待阅读那篇文章,因为过去我遇到过换行问题,但也许这不是 Perl 的错。
    • 好吧,Perl 使 \n 在不同的系统上具有不同的含义,但这并不意味着 \n 是输入的记录分隔符。 :)
    • 而且,希望这个字符串不是很大:)
    • 好点,Brian...在这种情况下不是,它只是一条错误消息。
    • 你说得对,Brian,将 1 作为第三个参数传递会导致返回整个原始字符串。我应该更仔细地阅读文档。我只能说,认为 split() 不应该这样做。
    【解决方案3】:

    这并不像您喜欢的那么简单,但是为了简短而简单不应该始终是目标。

    您可以在字符串上打开文件句柄(作为标量引用)并将其视为文件以读取第一行:

    我的 $string = "弗雷德\n威尔玛\贝蒂\n"; 打开 my($fh), "; # 给出“弗雷德” 关闭 $fh;

    如果你真的想,我想你可以把它简化为一个表达式:

    $hash{$key} = do { open my($fh), "<", \$string; scalar <$fh> };
    

    无论您选择哪种方法,您始终可以创建一个子程序来返回第一行,然后在您的哈希赋值中使用该子程序调用。

    子 gimme_first_line { ... } $hash{$key} = gimme_first_line(\$string);

    【讨论】:

    • 不,它是内存中的字符串。不过,您可以将其视为文件。
    • 糟糕,我没有仔细阅读您的代码。呵呵,我不知道你能做到!
    【解决方案4】:
    ($str =~ /\A(.*?)$/ms)[0];
    

    对于大字符串,这会比

    (split /\n/, $str)[0]
    

    按照 Manni 的建议。 [编辑:删除了对split /\n/, $str, 1的错误提及。]

    如果要包含终端 \n(如果存在),请在正则表达式中的右括号之前添加 \n?

    【讨论】:

    • 不是你的第一个建议,为什么不只是($str =~ /^(.*)/)[0];
    • @JoshuaGreen:你甚至可以在你的解决方案中去掉^。无论哪种方式,它都比我的更简洁,但更难理解,因为它依赖于代码的读者意识到. 在没有/s 的情况下与\n 不匹配。对于另外 5 个字符,我的代码使语义难以理解。
    • 是的,今天早上我意识到^ 是多余的。老实说,如果不查找所有内容,我无法遵循您的大部分操作,但这主要是由于我缺乏知识。我什至没有想过使用这个任务的正则表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 2010-09-18
    • 2010-12-08
    相关资源
    最近更新 更多