#!/usr/bin/perl -w
use warnings;
use diagnostics;
use Switch;
open FH, "<$ARGV[0]" or die "$!";
sub commandType{
print "comm entered for $_";
switch($_){
case("add") {print "this is add\n"}
case("sub") {print "this is sub\n"}
case("neg") {print "this is neg\n"}
case("eq") {print "this is eq\n"}
case("gt") {print "this is gt\n"}
case("lt") {print "this is lt\n"}
case("and") {print "this is and\n"}
case("or") {print "this is or\n"}
case("not") {print "this is not\n"}
}
}
while(<FH>){
next if /^\s*\/\//;
next if /^\s*$/;
my $line = "$_";
$line =~ s/\s+$//;
print "$line\n";
commandType($line);
}
这是我的代码,该代码从通过命令行提供给它的以下文件中获取输入:
// Pushes and adds two constants.
push constant 7
push constant 8
add
对于perl代码上方的文件的每一行,将运行子例程
commandType
来检查它是否在该子例程内的给定情况中,并进行打印。但是,即使在上面的文件中存在add命令,该代码仍然不会打印出来。我得到以下输出:push constant 7
comm entered for push constant 7
push constant 8
comm entered for push constant 8
add
comm entered for add`
为什么案例“添加”不打印任何内容?
最佳答案
说明
问题在于$_
不会自动引用传递给sub
的第一个参数,当前您正在读取与while循环中的$_
相同的$_
。
在commandType内时,"add\n"
的值是读取的行,仍附加有潜在的换行符,并且由于"add"
不等于sub commandType
,因此不会输入您的情况。
解
最好将ojit_code的内容更改为以下内容:
sub commandType{
my $cmd = shift; # retrieve first argument
print "comm entered for $cmd";
switch($cmd) {
...
}
}