【问题标题】:Can't split a string by a parenthesis on Perl不能在 Perl 上用括号分割字符串
【发布时间】:2020-12-13 22:22:22
【问题描述】:

例如下面的代码:

$test_str = 'foo(bar';
@arr = split('(', $test_str);

导致 500 错误

为什么?

【问题讨论】:

  • 您应该检查程序产生的错误。您的网络服务器应该记录这些。但简短的回答是 ( 不是一个有效的正则表达式模式,这是 split 对其第一个参数的期望。
  • @ikegami 谢谢。它适用于split(/\(/, $test_str)
  • 我想我太慢了。
  • @simbabque 是的,只需几秒钟)

标签: regex string perl split parentheses


【解决方案1】:

作为ikegami sayssplit 需要一个模式作为它的第一个参数。字符串只会被转换为模式。因为左括号( 有特殊含义,所以会出错。你需要逃避它。

my @arr = split /\(/, $str;

【讨论】:

    【解决方案2】:

    根据perldoc -f splitsplit()函数的第一个参数是一个正则表达式/PATTERN/。所以如果你要写这个:

    split('some text', $string)
    

    相当于:

    split( m/some text/, $string )
    

    如果some text 包含正则表达式中的特殊字符,那么它们将被视为特殊字符。所以你的线:

    @arr = split('(', $test_str);
    

    将被视为:

    @arr = split( m/(/, $test_str );
    

    这可能不是你想要的,因为m/(/ 是一个无效的(你可以说是不完整的)正则表达式。要匹配文字 (,您需要使用反斜杠对其进行转义,因此请改用:

    @arr = split( m/\(/, $test_str );
    

    现在你已经注意到 Perl 试图通过将你的第一个参数从字符串 '(' 转换为正则表达式模式 m/(/ 来提供帮助。虽然你可以传入一个字符串作为第一个参数,但我不推荐它——改用m/PATTERN/

    我推荐的原因是因为:

    1. 模式清楚地表明第一个参数是正则表达式模式,而不仅仅是任何旧字符串。
    2. 根据perldoc -f split,有一种特殊情况可以传入一个字符串作为第一个参数:

    作为一种特殊情况,指定空格 (' ') 的 PATTERN 将 在空白处拆分就像没有参数的“拆分”一样。 因此,"split(' ')" 可以用来模拟 awk 的默认值 行为,而 "split(/ /)" 会给你尽可能多的 null 初始字段,因为有前导空格。一个“分裂” "/\s+/" 就像一个 "split(' ')" 除了任何前导 空白产生一个空的第一个字段。没有的“分裂” arguments 确实在内部执行了“split(' ', $_)”。

    最好不要混淆这两者。因此,当您想使用在空格上分割的特殊情况时,请使用' ' 作为split() 的第一个参数,并使用m/PATTERN/ 作为其他所有情况的第一个参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-26
      • 2021-06-12
      • 2022-10-13
      • 1970-01-01
      相关资源
      最近更新 更多