Problem ze "strip"

Hej :slight_smile: Ostatnio piszę sobie taki mały skrypcik w Ruby, który odczytuje każdą linię z pliku i robi tam sobie jakieś rzeczy. Chodzi mi o to, że chcę się pozbyć z końca każdej linii białych znaków. Używam do tego funkcji “rstrip”, ale działa w jakiś dziwny sposób. Teraz osobno “stripuję” każdą linię, następnie całość pakuję ponownie do pliku i dopiero zabieram się za manipulację treścią pliku. Niezbyt elegancko, ale działa tak jak chcę.

cc = File.readlines('plik.txt').each do |line|
	line.rstrip!
end

File.open('plik.txt', "w") {|file| file.puts cc }

File.readlines('plik.txt').each do |line|
	if line[0] == "!"
		b.push(line)
	else
		line[-4]=":"
		c.push(line[-6,5].split(":")) end
end

Dlaczego by nie użyć “rstrip” tylko w tej ostatniej pętli? Próbowałem więc czegoś takiego:

File.readlines('plik.txt').each do |line|
    aa = line.rstrip!
	if aa[0] == "!"
		b.push(aa)
	else
		aa[-4]=":"
		c.push(aa[-6,5].split(":"))
    end
end

Błędu żadnego nie wywala, tylko wynik końcowy mam jakiś z kosmosu w tym drugim podejściu. Nie wiem dlaczego :frowning:

Hej

Tutaj masz błąd. Przypisanie zamiast porównania.

Dodatkowo zobacz sobie so zwraca rstrip! w przypadku gdy nie ma białych znaków na końcu (pownieneś działać bezpośrednio na zmiennej line zamiast na aa w innym wypadku w końcu dostaniesz wyjątkiem). Jeśli chcesz później modyfikować zmienną aa skorzystaj z rstrip zamiast rstrip!

ja bym sugerował też zmianę nazw zmiennych na bardziej znaczące. Trudno się czyta kod w którym ktoś używa aa, b, c, cc

+1.
x, y, z są dużo bardziej popularne.

Dziękuję za pomoc - trochę nieświadomie zwróciłeś uwagę na fragment, który uważałem za dobry, a okazało się, że w nim tkwił błąd :slight_smile: Otóż tam ma być przypisanie, tylko że “-3”, a nie “-4”. Zamieniam sobie każdy znak na pozycji trzeciej od końca na dwukropek. Nagle wszystko zaczęło działać :wink: Teraz mam tylko tę jedna pętelkę :slight_smile:

File.readlines('wyniki.txt').each do |line|
if line[0] == "!"
	b.push(line)
else
	line.rstrip!
	line[-3]=":"
	c.push(line[-5,5].split(":"))
end
end

Nie chcę nawet dochodzić dlaczego poprzedni kod działał z tym błędem.

Nazwy zmiennych faktycznie mało czytelne, więc pójdą do poprawki. Może się przydać kiedy do tego zajrzę za pół roku :wink: