【问题标题】:Determine if a string starts with an upper-case character in Perl在 Perl 中确定字符串是否以大写字符开头
【发布时间】:2013-05-13 16:12:32
【问题描述】:

我需要在 Perl 中创建一个子程序来确定字符串是否以大写字符开头。到目前为止,我有以下内容:

sub checkCase {
    if ($_[0] =~ /^[A-Z]/) {
        return 1;
    }
    else {
        return 0;
    }
}

$result1 = $checkCase("Hello");
$result2 = $checkCase("world");

【问题讨论】:

  • ...和?怎么不工作了?
  • 意思是来自 ASCII 的大写字母?或unicode大写字母或大写代码点?

标签: perl case-sensitive uppercase


【解决方案1】:

只要您从子例程调用的前面删除$,您的代码就可以了。美元符号表示标量值,调用应如下所示

$result1 = checkCase("Hello");
$result2 = checkCase("world");

您的子程序也不必要地长。正则表达式匹配返回一个真/假值,您正在使用该值返回不同的真/假值10。直接返回正则表达式匹配的结果要好得多。

最后,如果您在 ASCII 字符之外工作,那么您可能需要使用 大写字母 Unicode 类别,该类别使用 \p{Lu} 编码。

我希望您的代码的这种变化是有用的。我稍微更改了子例程的名称,因为标准做法是只使用小写字母和下划线作为变量和子例程标识符。大写字母为包名等全局变量保留。

sub check_case {
  $_[0] =~ /^\p{Lu}/
}

print check_case('Hello') ? 'YES' : 'NO', "\n";
print check_case('world') ? 'YES' : 'NO', "\n";

【讨论】:

    【解决方案2】:

    这几乎是正确的。但是 [A-Z] 可能不匹配大写重音字符,具体取决于您的语言环境。最好使用/^[[:upper:]]/

    您的子例程调用也不应该在它们前面有$ 字符。 IE。他们应该是:

    $result1 = checkCase("Hello");
    $result2 = checkCase("world");
    

    【讨论】:

    • “不应该有$ 是轻描淡写,是语法错误。我想@DanJones 的意思是&sub 样式调用,但你是对的,也不应该使用它。
    猜你喜欢
    • 2018-08-22
    • 2012-01-22
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2023-01-01
    相关资源
    最近更新 更多