Helpex - Trao đổi & giúp đỡ Đăng nhập

Các phương pháp hay nhất với STDIN trong Ruby? [đóng cửa]

Phan Phương Thi
· 19:14 07/11/2008
22:48:20 15/06/2021

Tôi muốn xử lý đầu vào dòng lệnh trong Ruby:

> cat input.txt | myprog.rb
> myprog.rb < input.txt
> myprog.rb arg1 arg2 arg3 ...

Cách tốt nhất để làm điều đó là gì? Đặc biệt, tôi muốn xử lý STDIN trống và tôi hy vọng có một giải pháp tốt.

#!/usr/bin/env ruby

STDIN.read.split("\n").each do |a|
   puts a
end

ARGV.each do |b|
    puts b
end
315 hữu ích 3 bình luận 196k xem chia sẻ
Lê Thuận Phong
· 22:29 07/11/2008
22:29:13 07/11/2008

Sau đây là một số thứ tôi tìm thấy trong bộ sưu tập Ruby ít người biết đến của mình.

Vì vậy, trong Ruby, một cách triển khai lệnh Unix đơn giản catsẽ là:

#!/usr/bin/env ruby
puts ARGF.read

ARGFlà bạn của bạn khi nói đến đầu vào; nó là một tệp ảo nhận tất cả dữ liệu đầu vào từ các tệp đã đặt tên hoặc tất cả từ STDIN.

ARGF.each_with_index do |line, idx|
    print ARGF.filename, ":", idx, ";", line
end

# print all the lines in every file passed via command line that contains login
ARGF.each do |line|
    puts line if line =~ /login/
end

Ơn trời là chúng tôi không có nhà khai thác kim cương trong Ruby, nhưng chúng tôi đã nhận được ARGFnhư một người thay thế. Mặc dù tối nghĩa, nhưng nó thực sự hữu ích. Hãy xem xét chương trình này, chương trình này bổ sung sẵn các tiêu đề bản quyền tại chỗ (nhờ một Perlism khác, -i) vào mọi tệp được đề cập trên dòng lệnh:

#!/usr/bin/env ruby -i

Header = DATA.read

ARGF.each_line do |e|
  puts Header if ARGF.pos - e.length == 0
  puts e
end

__END__
#--
# Copyright (C) 2007 Fancypants, Inc.
#++

Tín dụng để:

412 hữu ích 5 bình luận chia sẻ
Đặng Hoàng Quân
· 03:13 03/03/2011
03:13:07 03/03/2011

Ruby cung cấp một cách khác để xử lý STDIN: Cờ -n. Nó coi toàn bộ chương trình của bạn như nằm trong một vòng lặp qua STDIN, (bao gồm cả các tệp được truyền dưới dạng args dòng lệnh). Xem ví dụ: tập lệnh 1 dòng sau:

#!/usr/bin/env ruby -n

#example.rb

puts "hello: #{$_}" #prepend 'hello:' to each line from STDIN

#these will all work:
# ./example.rb < input.txt
# cat input.txt | ./example.rb
# ./example.rb input.txt
44 hữu ích 2 bình luận chia sẻ
Phan Khánh Nam
· 19:51 07/11/2008
19:51:40 07/11/2008

Tôi không chắc bạn cần gì, nhưng tôi sẽ sử dụng một cái gì đó như sau:

#!/usr/bin/env ruby

until ARGV.empty? do
  puts "From arguments: #{ARGV.shift}"
end

while a = gets
  puts "From stdin: #{a}"
end

Lưu ý rằng vì mảng ARGV trống trước đó gets, nên Ruby sẽ không cố gắng diễn giải đối số dưới dạng tệp văn bản để đọc (hành vi được kế thừa từ Perl).

Nếu stdin trống hoặc không có đối số, không có gì được in.

Một số trường hợp thử nghiệm:

$ cat input.txt | ./myprog.rb
From stdin: line 1
From stdin: line 2

$ ./myprog.rb arg1 arg2 arg3
From arguments: arg1
From arguments: arg2
From arguments: arg3
hi!
From stdin: hi!
32 hữu ích 0 bình luận chia sẻ
Ngô Thu Phương
· 20:53 07/11/2008
20:53:14 07/11/2008

Một cái gì đó như thế này có lẽ?

#/usr/bin/env ruby

if $stdin.tty?
  ARGV.each do |file|
    puts "do something with this file: #{file}"
  end
else
  $stdin.each_line do |line|
    puts "do something with this line: #{line}"
  end
end

Thí dụ:

> cat input.txt | ./myprog.rb
do something with this line: this
do something with this line: is
do something with this line: a
do something with this line: test
> ./myprog.rb < input.txt 
do something with this line: this
do something with this line: is
do something with this line: a
do something with this line: test
> ./myprog.rb arg1 arg2 arg3
do something with this file: arg1
do something with this file: arg2
do something with this file: arg3
19 hữu ích 1 bình luận chia sẻ
Ngô Hồng Vinh
· 21:52 09/07/2012
21:52:58 09/07/2012
while STDIN.gets
  puts $_
end

while ARGF.gets
  puts $_
end

Điều này được lấy cảm hứng từ Perl:

while(<STDIN>){
  print "$_\n"
}
13 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ ruby stdin , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm