`

Programming Ruby(读书笔记)-11章(标准输入输出)

    博客分类:
  • Ruby
 
阅读更多

Ruby的内核模块已经实现了I/O相关的方法:gets,open,print,printf,putc,puts,readline,readlines,test。

 

11.1 IO对象

Ruby提供了基础类:IO,它的继承类有File与BasicSocket。IO对象就是建立一个双向通道,一端接Ruby,一端接外部资源。

 

11.2文件的打开与关闭

file = File.new("testfile", "r")
#...process the file
file.close
#第二个参数是操作模式:r w r+(read-write)

 上面的new方法返回的是一个File对象,File#open与之相像,只是如果给File#open赋一个代码块,则open方法会调用这个代码块,把打开的文件对象作为参数。并且在操作完成后,自动关闭文件。

File.open("testfile","r") do |file|
#...processthefile
end #<-file automatically closed here

 读取文件最好使用这种方式,因为这种在处理过程中如果发生异常,File#open方法会在抛出异常前关闭文件。

#open方法内部大概类似于下面的处理逻辑
class File
  def File.open(*args)
    result=f=File.new(*args)
    if block_given?
      begin
        result=yield f
      ensure
        f.close
      end
    end
    result
  end
end

 

11.3 读写文件

gets可从标准输入中读取一行,在通过脚本调用时,如果通过命令指定了文件,也可以从文件中读取。

while line=gets
  puts line
end
$ruby copy.rb
These are lines
These are lines
that I am typing
that I am typing
^D
#脚本执行时指定文体
$rubycopy.rb testfile
This is line one
This is line two
#显示的指定文件,并逐行打印
File.open("testfile") do |file|
  while line = file.gets
    puts line
  end
end

 

循环读取

#IO#each_byte读取下一个8-bit字节
#chr方法将数值转换为ASCII字符
File.open("testfile") do |file|
  file.each_byte.with_index do |ch,index|
    print"#{ch.chr}:#{ch}"
    break if index > 10
  end
end
produces:
T:84h:104i:105s:115 :32i:105s:115 :32l:108i:105n:110e:101

  IO#each_line逐行读取文件

#String#dump用于显示换行符号
File.open("testfile") do |file|
  file.each_line{|line| puts "Got #{line.dump}"}
end
produces:
Got "This is line one\n"
Got "This is line two\n"
Got "This is line three\n"
Got "And soon...\n"
#IO.each_line("*")支持自定义换行符号,下面示例使用e作为换行符号
File.open("testfile") do |file|
  file.each_line("e") {|line| puts "Got #{line.dump}"}
end
produces:
Got "This is line"
Got "one"
Got "\nThis is line"
Got "two\nThis is line"
Got "thre"
Got "e"
Got "\nAnd soon...\n"
#使用IO#foreach
IO.foreach("testfile") {|line| puts line}

 也可以把文件内容读取为String串,或者String数组(每行读取为一列)

#read into string
str = IO.read("testfile")
str.length  #=>66
str[0,30]   #=>"This is line one\nThis is line"

#read into an array
arr = IO.readlines("testfile")
arr.length   #=>4
arr[0]       #=>"This is line one\n"

 注意:IO处理经常会出现异常情况,在调用这些API时,记着使用begin..rescue..end来捕获它们。

 

写文件

#Note the "w",which opens the file for writing
File.open("output.txt","w") do |file|
  file.puts "Hello"
  file.puts "1+2=#{1+2}"
end

 nil写入文件后是empty串。

 

Doing I/O with Strings

StringIO类类似于java的StringReader,StringWriter。提供了IO类相同的方法实现。

require 'stringio'

ip = StringIO.new("now is\nthe time\nto learn\nRuby!")
op=StringIO.new("","w")

ip.each_line do |line|
  op.puts line.reverse
end
op.string#=>"\nsi won\n\nemit eht\n\nnrael ot\n!ybuR\n"

 

11.4 网络通信

require 'socket'

client = TCPSocket.open('127.0.0.1', 'www')
client.send("OPTIONS /~dave/ HTTP/1.0\n\n", 0) #0 means standard packet
puts client.readlines
client.close

produces:
HTTP/1.1200OK
Date:Mon,27May201317:31:00GMT
Server:Apache/2.2.22(Unix)DAV/2PHP/5.3.15withSuhosin-Patchmod_ssl/2.2.22
OpenSSL/0.9.8r
Allow:GET,HEAD,POST,OPTIONS
Content-Length:0
Connection:close
Content-Type:text/html

 lib/net包下面提供了更高一层次的应用协议封装(FTP,HTTP,POP,SMTP,telnet)

require 'net/http'

http = Net::HTTP.new('pragprog.com',80)
response = http.get('/book/ruby3/programming-ruby-1-9')

if response.message == "OK"
  puts response.body.scan(/<imgalt=".*?"src="(.*?)"/m).uniq[0,3]
end
produces:
http://pragprog.com/assets/logo-c5c7f9c2f950df63a71871ba2f6bb115.gif
http://pragprog.com/assets/drm-free80-9120ffac998173dc0ba7e5875d082f18.png
http://imagery.pragprog.com/products/99/ruby3_xlargecover.jpg?1349967653

 更高一层次

require 'open-uri'

open('http://pragprog.com') do |f|
  puts f.read.scan(/<imgalt=".*?"src="(.*?)"/m).uniq[0,3]
end

produces:
http://pragprog.com/assets/logo-c5c7f9c2f950df63a71871ba2f6bb115.gif
http://pragprog.com/assets/drm-free80-9120ffac998173dc0ba7e5875d082f18.png
http://imagery.pragprog.com/products/353/jvrails2_xlargebeta.jpg?1368826914

 

11.5解析HTML

 

#通过正则式匹配,%r{..}m,添加m表示要多次匹配
require 'open-uri'

page = open('http://pragprog.com/titles/ruby3/programming-ruby-1-9').read
if page =~ %r{<title>(.*?)</title>}m
  puts "Title is #{$1.inspect}"
end
  
produces:
Title is "The Pragmatic Bookshelf | Programming Ruby1.9"

 使用nokogiri模块,可以更强大的支持解析html

require 'open-uri'
require 'nokogiri'

doc = Nokogiri::HTML(open("http://pragprog.com/"))
puts"Pagetitleis"+doc.xpath("//title").inner_html

#Output the first paragraph in the div with an id="copyright"
#(nokogiri supports both xpath and css-like selectors)
puts doc.css('div#copyright p')
#Output the second hyperlink in the site-links div using xpath and css
puts "\nSecond hyperlink is"
puts doc.xpath('id("site-links")//a[2]')
puts doc.css('#site-links a:nth-of-type(2)')

 Nokogiri can also update and create HTML and XML

 

分享到:
评论

相关推荐

    Programming Ruby(读书笔记)-3章

    《Programming Ruby》是一本关于Ruby编程语言的经典书籍,它的第三章深入探讨了Ruby的基本语法和核心概念。在这一章中,作者介绍了变量、常量、符号、数组、哈希等核心数据类型,以及控制流(条件语句和循环)和方法...

    Programming-Ruby-1.9源代码

    - 标准输入/输出和重定向,以及如何与系统进行交互。 7. **正则表达式(Regexp)** - Ruby的正则表达式强大且灵活,源代码会包含多种匹配和替换的示例。 8. **元编程(Meta-programming)** - Ruby允许在运行时...

    Programming Ruby - The Pragmatic Programmer's Guide, 2nd Edition (2005) [annotated]

    《Programming Ruby - The Pragmatic Programmer's Guide》第二版(2005年注释版)是一本在IT行业中享有盛誉的经典书籍,专门针对Ruby编程语言进行了深入浅出的讲解。该书不仅覆盖了Ruby语言的基础知识,还探讨了其...

    Ruby学习资料(含参考手册和Programming Ruby)-中文.rar

    "ruby--.txt"可能是一个文本文件,其中包含了Ruby的代码示例、笔记或者问题解答,通过阅读可以加深对Ruby语法和实践的理解。 "Ruby语言入门教程附实例"和"ruby-mht"文件很可能是包含实例的教程,实践是学习编程的...

    Programming ruby.pdf

    《Programming Ruby》是一本关于Ruby编程语言的经典著作,由Dave Thomas、Andy Hunt和Chad Fowler合著。这本书自2004年初版以来,一直是学习Ruby的首选资源,被誉为“Pickaxe”书,因其封面的图标而得名。Ruby是一种...

    Programming Ruby.pdf

    《Programming Ruby》被誉为是学习Ruby语言的最佳指南,这本书在IT界享有极高的声誉,被亲切地称为“镐头书”,其价值与影响力无远弗届。本书不仅详细介绍了Ruby语言的核心概念、语法结构以及编程实践,还深入探讨了...

    Programming-Ruby-1.9.pdf

    《Programming Ruby 1.9》是由Dave Thomas、Chad Fowler以及Andy Hunt三位作者共同编写的关于Ruby编程语言的一本权威指南。这本书是对之前版本《Programming Ruby》的大幅修订版,并得到了原出版社Addison Wesley的...

    Programming Ruby中文版第二版[高清扫描版][带书签]和Programming.Ruby-2nd[高清文字版][带书签].pdf

    《Programming Ruby》中文版第二版是一本专注于Ruby编程语言的经典教程。这本书的两个版本——高清扫描版和高清文字版,都是为了便于读者学习和查阅,其中都带有书签功能,帮助读者快速定位到相关内容。 Ruby是一种...

    Programming Ruby

    通过阅读《Programming Ruby》,读者不仅可以学习到Ruby的基本语法,还能深入了解其背后的哲学和设计思想,从而成为一名高效的Ruby开发者。书中的实例和练习将帮助你更好地掌握Ruby编程,提升解决问题的能力。

    Programming Ruby (English Version) and Source Code

    7. **文件和I/O**:如何读写文件,处理标准输入/输出,以及使用系统命令。 8. **正则表达式**:Ruby内置了强大的正则表达式支持,用于文本处理和模式匹配。 9. **Gem和库**:Ruby的生态系统中,Gem是软件包管理器...

    Programming Ruby 1.9 (3rd edition)和源码

    5. **Ruby标准库**: - File系统操作:提供读写文件、目录管理等功能。 - 网络编程:如Net::HTTP用于HTTP请求,Socket支持网络通信。 - JSON和XML解析:方便地处理这些数据格式。 - Test::Unit和MiniTest:内置...

    Programming_ruby-2nd.pdf

    5. 实际应用:Rich Kilmer提到,在阅读了第一版《Programming Ruby》之后,他感到很受启发,随后创立了一家主要通过应用Ruby解决实际问题的公司,这表明了Ruby语言的实用性。 6. 社区和库的支持:Rich Kilmer还强调...

    ruby学习资源(Programming Ruby, Learning Ruby, The Ruby Way)

    内含以下4个文档: 1、Addison.Wesley.The.Ruby.Way.2nd.Edition.Oct.2006.chm 2、O'Reilly.Learning.Ruby.May.2007.chm 3、Programming Ruby 2e.pdf 4、ruby中文文档.chm

    《Programming Ruby》中文第2版源代碼下載

    《Programming Ruby》是一本经典的Ruby编程语言教程,中文第二版为中国的程序员提供了深入学习Ruby的宝贵资源。这本书的源代码下载对于读者来说是极其有用的,因为它允许读者在实践中探索和理解书中所阐述的概念。...

    PROGRAMMING+RUBY中文版

    PROGRAMMING+RUBY中文版 PROGRAMMING+RUBY中文版 PROGRAMMING+RUBY中文版

    ruby-2.0.0-p0.tar

    压缩包内的"ruby-2.0.0-p0"可能包含了完整的Ruby解释器、标准库、开发工具以及相关的文档。为了使用这个版本的Ruby,开发者通常需要将其解压,配置环境变量,然后通过编译安装。对于初学者,了解这些基础知识是学习...

Global site tag (gtag.js) - Google Analytics