Usuwanie danych z pliku

Witam.

Dalej męczę irc bota. :smiley:
Kolejnym pomysł wymaga operowania na plikach.
Z dodawaniem do pliku i odczytywaniem całego pliku nie mam problemu.
Ale jak odczytać lub usunąć wybrany fragment pliku, żeby ten nie stracił ciągłości?

Na przykład mam plik kwiatki.txt o treści:
fiołki
róże
stokrotka

I chcę z tej listy usunąć tylko “róże”. Jak to osiągnąć? Czego użyć?
Kminiłem z delete_if ale nie dało to rezultatu.

Najprościej by było go całego wczytać, usunąć wybrany fragment i ponownie zapisać. Kiedyś pytałem się o to samo w perlu i kolega powiedział, że bezpośrednio bez zapisu do pamięci się nie da usunąć.

Więc rozbić na tablicę, przeszukać ją w poszukiwaniu wybranego fragmentu i znowu zapisać?
Dobrze kminię?

wczytaj, wywal, zapisz (nadpisz)

tab = [] file = File.read('a',r) file.readlines.each { |l| if !l.match('dupa') tab << l end } file.close file2 = File.new('a',w) file2 << tab file2.close
No schematycznie coś takiego, popraw to by zadziałało i tyle. Powinno zadziałać.

Wywaliło mi:

wrong argument type nil (expected Regexp)
bot.rb:88:in match' bot.rb:88:inhandle_server_input’
bot.rb:87:in each' bot.rb:87:inhandle_server_input’
bot.rb:340:in main_loop' bot.rb:332:ineach’
bot.rb:332:in `main_loop’

Co może być nie tak?

wklej ten swój kod to się zobaczy.

kwiatytab = [] kwiatki = File.open("kwiatki.txt", "a+") kwiatki.readlines.each { |l| if !l.match($5) kwiatytab << l end } kwiatki.close kwiatki = File.open("kwiatki.txt", "w+") kwiatki << kwiatytab kwiatki.close
$5 to od wyrażenia regularnego. Przyjmuje wartość nazwy kwiata np: stokrotka.

kwiatytab = [] kwiatki = File.open("kwiatki.txt", "a+") kwiatki.readlines.each { |l| if !l.match($5) kwiatytab << l end } kwiatki.close kwiatki = File.open("kwiatki.txt", "w+") kwiatytab.each { |l| kwiatki.write(l) } kwiatki.close
Spróbuj tak, ale jestem prawie pewien , że się o to $5 rzuca. daj zam jakiś napis “kot” np i zobacz

Tak, zmieniłem nazwę na kwiatka z pliku i go usunęło.
Ale dlaczego z $5 nie działa?

wrong argument type nil (expected Regexp)

bo jest nilem, czyli masz coś wcześniej źle

$5 będzie miało piąty capture po match. Czyli powinno być:

kwiatki.readlines.each { |l| unless l =~ /^róże$/ kwiatytab << l end }

Dzięki za pomoc.
Kod z pierwszego postu gotara działa prawidłowo.
Wina leżała po stronie bota.
Sorry za niepotrzebne zawracanie gitary. :stuck_out_tongue_winking_eye:

spoko niewiele tu postów z Ruby, dobrze czasem kawałek kodu napisać ;] Niestety Rails czynią ludzi tak leniwymi, że nie wiele osób szczególnie na początku interesuje się samym językiem.