Perl Switch语句:在给定/何时条件下使用OR(一般逻辑运算符)时遇到问题

时间:2012-07-22 08:01:59

标签: perl switch-statement logical-operators

基本上我想获得用户输入并决定做什么,即使对于不同的用户输入,我也需要有相同的结果。示例代码:

given ($command) {
      when ('a' || 'add') {add}
      when ('s' || 'subtract') {subtract}
      when ('m' || 'multiply') {multiply}
      when ('d' || 'divide') {divide}
      default { print "try again, usage: add, subtract, multiply, divide (a, s, m, d)\n" }

现在问题在于,只有在or语句的开头键入单个字母命令时它才有效。如果我在提示符中键入类似“添加”的内容,我会收到默认消息,告诉我再试一次。

我可以为这些做单独的案例,但它只有与单个字母相同的主体,这只是多余的。

3 个答案:

答案 0 :(得分:4)

given / when构造使用智能匹配运算符,该运算符对||运算符没有任何特殊情况行为。表达式

'a' || 'add'

评估为'a',因此它只匹配$command字符串'a'

如果要将$command与任何值列表匹配,可以使用数组值:

given ($command) {
    when ([qw(a add)]) { add }
...

(像往常一样,有几种表达方式。)

参考文献:

perldoc -f given

perldoc perlsyn;搜索“切换语句”和“智能匹配”。

编辑:

此问题的另一种方法,如果您想允许$command成为命令名称的任何前缀(例如"s""su""sub",.. 。,"subtract")是这样的:

sub match {
    my($s, $target) = @_;
    return index($target, $s) == 0;
}

...

if (match($command, 'add') { ... }
elsif (match ($command, 'subtract') { ... }
...

答案 1 :(得分:2)

你只是使用错误的synthax,试试这种方式:

#!/usr/bin/perl

use 5.012;
use warnings;

print 'Enter your command : ';
chomp( my $command = <> );

given ($command) {
      say 'Adding something' when ['a', 'add'];
      say 'Subtracting something' when ['s', 'subtract'];
      say 'Multiplying something' when ['m', 'multiply'];
      say 'Dividing something' when ['d', 'divide'];
      default { say "try again, usage: add, subtract, multiply, divide (a, s, m, d)\n" }
}

答案 2 :(得分:0)

“何时”评估正则表达式。

你不能使用||但你可以使用正则表达式:)

given ($command) {
    when (/(^a$|^add$)/) {
        ....
    }
    ....
}