以前缀表示法从命令行处理参数的最有效方法

Posted

技术标签:

【中文标题】以前缀表示法从命令行处理参数的最有效方法【英文标题】:Most efficient way to process arguments from the command-line in prefix notation 【发布时间】:2010-01-02 14:05:50 【问题描述】:

我们的作业是编写一个 ruby​​ 脚本,根据表达式计算单词列表的子集。

常规二元运算是

&& And operator
|| Or operator
++ Concatenate operator
! Negation operator

一个有效的调用是这样的

./eval.rb wordlist && a c
or
./eval.rb wordlist && || a b c

第一次调用意味着生成一个新的单词表,其中所有单词至少有一个'a'和'c'。 所以我的问题是我如何以有效的方式处理争论?也许递归? 我卡住了……

提前致谢。

【问题讨论】:

否定运算符显然不是二进制的,很抱歉。 【参考方案1】:

看起来像一个带有前缀符号的语法。堆栈确实是您的朋友,最容易使用的堆栈是调用堆栈。例如,给定以下语法:

expression ::= number | operand number number
operand ::= '+' | '-'

这是评估它的代码:

#!/usr/bin/ruby1.8

@tokens = ['*', 2, '+', 3, 4]

def evaluate
  token = @tokens.shift    # Remove first token from @tokens
  case token
  when '*'
    return evaluate * evaluate
  when '+'
    return evaluate + evaluate
  else
    return token
  end
end

puts evaluate    # => 14

虽然这是 Ruby,但它已经足够接近伪代码了。尽管 Ruby 不需要它们,但我已将显式返回值放入其中,因为对于不了解 Ruby 的人来说可能会更清楚。

【讨论】:

【参考方案2】:

使用堆栈。最大大小将是参数的数量。

【讨论】:

以上是关于以前缀表示法从命令行处理参数的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本处理用户输入

shell脚本处理用户输入

shell脚本处理用户输入

如何从命令行使用 JSON 有效负载进行 HTTP 请求/调用?

在 Ruby 中解析 gem 式命令行参数的最简单方法

python和shell获取命令行参数的区别