루비 STDIN의 모범 사례?
Ruby의 명령 행 입력을 처리하고 싶습니다.
> cat input.txt | myprog.rb
> myprog.rb < input.txt
> myprog.rb arg1 arg2 arg3 ...
가장 좋은 방법은 무엇입니까? 특히 나는 빈 STDIN을 다루고 싶어하며 우아한 해결책을 원합니다.
#!/usr/bin/env ruby
STDIN.read.split("\n").each do |a|
puts a
end
ARGV.each do |b|
puts b
end
다음은 모호한 Ruby 모음에서 찾은 것입니다.
따라서 루비에서 유닉스 명령의 간단한 노벨 구현은 다음과 cat
같습니다.
#!/usr/bin/env ruby
puts ARGF.read
ARGF
입력 할 때 친구입니다. 명명 된 파일 또는 모든 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
루비에서 다이아몬드 연산자를 얻지 못했지만 ARGF
대체품으로 사용했습니다. 모호하지만 실제로는 유용한 것으로 판명되었습니다. -i
명령 줄에 언급 된 모든 파일에 저작권 헤더를 다른 Perlism 덕분에 추가하는이 프로그램을 고려하십시오 .
#!/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.
#++
크레딧 :
- http://www.oreillynet.com/ruby/blog/2007/04/trivial_scripting_with_ruby.html#comment-565558
- http://blog.nicksieger.com/articles/2007/10/06/obscure-and-ugly-perlisms-in-ruby
루비는 STDIN을 처리하는 또 다른 방법을 제공합니다 : -n 플래그. 전체 프로그램을 STDIN의 루프 내부에있는 것으로 간주합니다 (명령 줄 인수로 전달 된 파일 포함). 예를 들어 다음 1 줄 스크립트를 참조하십시오.
#!/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
필요한 것이 확실하지 않지만 다음과 같은 것을 사용합니다.
#!/usr/bin/env ruby
until ARGV.empty? do
puts "From arguments: #{ARGV.shift}"
end
while a = gets
puts "From stdin: #{a}"
end
ARGV 배열은 first 이전에 비어 있기 때문에 gets
Ruby는 인수를 읽을 텍스트 파일 (Perl에서 상속 된 동작)로 해석하려고 시도하지 않습니다.
stdin이 비어 있거나 인수가 없으면 아무것도 인쇄되지 않습니다.
몇 가지 테스트 사례 :
$ 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!
아마도 이런 것?
#/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
예:
> 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
while STDIN.gets
puts $_
end
while ARGF.gets
puts $_
end
이것은 Perl에서 영감을 얻은 것입니다.
while(<STDIN>){
print "$_\n"
}
빠르고 간단한 :
STDIN.gets.chomp == 'YES'
ARGF
매개 변수와 함께 사용하려면을 ARGV
호출하기 전에 지워야 한다고 추가합니다 ARGF.each
. 때문이다 ARGF
아무것도 처리합니다 ARGV
파일 이름으로 먼저 거기에서 줄을 읽습니다.
다음은 'tee'구현 예입니다.
File.open(ARGV[0], 'w') do |file|
ARGV.clear
ARGF.each do |line|
puts line
file.write(line)
end
end
나는 이런 식으로 뭔가를 :
all_lines = ""
ARGV.each do |line|
all_lines << line + "\n"
end
puts all_lines
대부분의 답변은 인수가 stdin에 포함되는 내용을 포함하는 파일 이름이라고 가정합니다. 아래의 모든 것은 단지 인수로 취급됩니다. STDIN이 TTY에서 온 경우 무시됩니다.
$ cat tstarg.rb
while a=(ARGV.shift or (!STDIN.tty? and STDIN.gets) )
puts a
end
인수 또는 stdin이 비어 있거나 데이터가있을 수 있습니다.
$ cat numbers
1
2
3
4
5
$ ./tstarg.rb a b c < numbers
a
b
c
1
2
3
4
5
참고 URL : https://stackoverflow.com/questions/273262/best-practices-with-stdin-in-ruby
'Programing' 카테고리의 다른 글
SQL Server에서 특정 날짜보다 큰 모든 날짜를 어떻게 쿼리합니까? (0) | 2020.03.16 |
---|---|
물음표와 도트 연산자는 무엇입니까? (0) | 2020.03.16 |
C # Java HashMap 동등 (0) | 2020.03.16 |
C ++에서 도트 (.) 연산자와->의 차이점은 무엇입니까? (0) | 2020.03.16 |
단일 곱셈으로 비트 추출 (0) | 2020.03.16 |