Chinaunix首页 | 论坛 | 博客
  • 博客访问: 90988303
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-05-22 17:38:47

   来源:

Ruby 与环境。 使用 Ruby 可以轻松访问操作系统的环境变量。清单 9 显示了一个为用户提供他们定义的环境变量列表的简单的 Ruby 程序。

清单9:displayOracleENV.rb

ENV.each {|key ,value| print key, "=", value, "n"}

这个单行代码使用每种方法对 ENV 散列进行迭代,每行打印一个环境变量及其值。这个单行示例进一步证明了 Ruby 语言的强大和简洁。

Ruby 与操作系统文件。 Oracle 数据库专业人员访问各种配置和其他文件(如 init.ora 文件)的内容是很有用的。Ruby 使得查看该文件中的键值设置非常简单,如清单 10 所示。

清单10:displayInitOra.rb

=begin

This Ruby script demonstrates several Ruby features while performing the

functionality of returning values and their setting from the init.ora file.

This multiline comment block is demarcated by the =begin and =end.

Normal, single-line comments are also shown in this code (pound sign).

=end

fileName = ARGV.to_s

# example of if statement

if fileName.size < 1

print "Enter init.ora path and name: "

fileName = gets.chomp!

end

#example of unless statement

unless fileName.size > 1

fileName = "C:\oracle\product\10.1.0\admin\orcl\init.ora"

end

print "File Name: " + fileName + "!"

theFile = File.new(fileName, "r") # read the file

text = theFile.read # copy file's contents into string

theFile.close # string holds file contents; close file

regExp = Regexp.new('^.+=.+ $')

puts text.scan(regExp)

清单 10 演示了 Ruby 的若干特性。可能该清单中演示的最重要的 Ruby 特性是使用 Regexp 处理正则表达式。通过所需模式 (^.+=.+ $) 实例化 Regexp 实例以匹配字符串。该正则表达式应用于字符串的 scan 方法,返回与所提供的正则表达式匹配的字符串中的子字符串。与 Perl 一样,Ruby 提供对正则表达式的强大支持。

清单 10 还演示了从命令行和基于控制台的用户提示符获得输入。代码首先在命令行使用预定义的 Ruby 变量 ARGV,尝试获取文件路径和文件名。如果不奏效,代码然后提示用户输入路径。如果用户不提供路径和文件名,则使用硬编码的路径(包括文件名)。这些条件语句还显示 if 语句以及与 Perl 类似的 unless 语句。

清单 10 中的代码显示正在运行的 chomp! 方法。String 方法用于删除从用户控制台输入中检索到的基于字符串的文件名末尾的记录分隔符。如果该操作失败,尝试根据该文件名打开一个 File 对象时,gets 输入中的新行将引发一些麻烦。Ruby 方法上的惊叹号表明该方法正在执行有可能对对象危险的操作。同样,Ruby 支持以问号 (?) 结束的方法,指示“疑问”方法返回真或假结果。

本节的最后一个示例是关于一个简单的 Ruby 脚本,该脚本比较两个 init.ora 文件并报告它们之间的差异。清单 11 使用许多与清单 10 中相同的方法,但是读入作为命令行参数传入的两个 init.ora 文件的内容。

清单11:diffInitOra.rb

=begin

This script compares two files and returns from each file what it has that

the other provided file does not have. Original order of either file does

not matter.

=end

require 'pp'

unless ARGV.size == 2

print "Usage: ruby arrayMagic.rb firstFile secondFile"

exit

end

firstFile = File.new(ARGV[0], "r")

secondFile = File.new(ARGV[1], "r")

regExp = Regexp.new('^.+=.+ $')

text1 = firstFile.read.scan(regExp)

text2 = secondFile.read.scan(regExp)

firstFile.close

pp firstFile

puts text1-text2, "n"

pp secondFile

puts text2-text1

secondFile.close

本示例显示使用 pp 库打印出文件的名称,如果其中一个文件未打开,则显示该文件关闭的事实。最重要的是,该代码清单显示了 Ruby 正在运行的强大的减法运算符。只需在从文件中读取的两个字符串之间使用一个减号,就可以轻松确定两个文件之间的差异。

对与清单 11 有关的示例而言,我将一个已有的 init.ora 文件复制到另一个副本中,然后更改该副本中的参数 (open_cursors, db_name, job_queue_processes)。为使事情更有趣,我还重新排列了 init.ora 文件的第二个副本中参数的顺序。图 10 显示了对这两个 init.ora 文件运行清单 11 中的代码的结果。这段简单的代码执行了所有繁重的任务,准确返回了我们所知道的文件中的差异,甚至对第二个文件进行了重新排列。

图10:两个 init.ora 文件之间的差异

正如这些示例所显示的那样,Ruby 简化壮大了文件操作。Ruby 同样可以与脱机输出以及其他对 Oracle 专业人员有用的文件类型一起使用。

阅读(578) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~