2013-05-18 46 views
6

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

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

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

...和?它怎么不起作用? –

+2

是否表示ASCII的大写字母?或unicode大写字母或大写codepoint? – jm666

回答

4

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

另外你的子程序调用不应该在它们前面有$字符。即他们应该是:

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

*“不应该有'$'”*是轻描淡写,这是一个语法错误。我想@DJJones意味着'&sub'风格的调用,但是你是对的,这也不应该被使用。 – amon

8

你的代码是罚款,只要你从子程序调用的前面卸下$。美元符号表示标量值,并且调用应该看起来像

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

您的子程序也不是很长。正则表达式匹配返回true/false值,并且您使用该值返回不同的真/假值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"; 
相关问题