1

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

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 语句的开头键入单字母命令时才有效。如果我在提示中键入“添加”之类的内容,我会收到默认消息,告诉我再试一次。

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

4

3 回答 3

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') { ... }
...
于 2012-07-22T08:11:54.540 回答
2

您只是使用了错误的合成器,请以这种方式尝试:

#!/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" }
}
于 2012-07-22T08:12:51.513 回答
0

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

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

given ($command) {
    when (/(^a$|^add$)/) {
        ....
    }
    ....
}
于 2014-09-29T14:18:34.217 回答