基本上我想获得用户输入并决定做什么,即使对于不同的用户输入,我也需要有相同的结果。示例代码:
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语句的开头键入单个字母命令时它才有效。如果我在提示符中键入类似“添加”的内容,我会收到默认消息,告诉我再试一次。
我可以为这些做单独的案例,但它只有与单个字母相同的主体,这只是多余的。
答案 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$)/) {
....
}
....
}