#!/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) {
    ...
  }
}

10-04 11:21