/ / Ruby: Dlaczego otrzymuję ostrzeżenie "regex dosłowne w stanie" tutaj? - rubin

Ruby: Dlaczego dostaję ostrzeżenie "regex dosłownie w stanie" tutaj? - rubin

Prosty program w języku Ruby, który działa dobrze (przy użyciu Ruby 2.0.0):

#!/usr/bin/ruby
while gets
print if /foo/../bar/
end

Jednak Ruby wypisuje również ostrzeżenie ostrzeżenie: regex dosłowne pod warunkiem. Wygląda na to, że moje zdanie typu flip-flop / foo /../bar/ jest niebezpieczne.

Moje pytanie: gdzie leży niebezpieczeństwo w tym programie? I: Czy mogę wyłączyć to ostrzeżenie (najlepiej tylko dla tego stwierdzenia, utrzymując inne ostrzeżenia aktywne)?

BTW, znalazłem w sieci kilka dyskusji tego rodzaju kodu, wspominając również o ostrzeżeniu, ale nigdy nie znalazłem dobrego wyjaśnienia, dlaczego otrzymaliśmy ostrzeżenie.

Odpowiedzi:

5 dla odpowiedzi № 1

Możesz uniknąć ostrzeżenia za pomocą dopasowania jawnego:

while gets
print if ~/foo/..~/bar/
end

Regexp#~ mecze przeciwko $_.

Nie wiem czemu pojawiło się ostrzeżenie (szczerze mówiąc, nie wiedziałem nawet, że Ruby pasuje do literałów regexp przeciwko $_ pośrednio), ale według kod źródłowy parsera, pokazuje się, chyba że podasz -e opcja podczas wywoływania Rubiego, tj. przekazywania skryptu jako argumentu:

$ ruby -e "while gets; print if /foo/../bar/ end"

Unikałbym używania $_ jako niejawny parametr i zamiast tego użyj czegoś takiego jak:

while line = gets
print line if line=~/foo/..line=~/bar/
end

0 dla odpowiedzi nr 2

Myślę, że Neil Slater ma rację: wygląda na błąd w parserze. Jeśli zmienię kod na

#!/usr/bin/ruby
while gets
print if $_=~/foo/..$_=~/bar/
end

ostrzeżenie znika.

Złożę raport o błędzie.