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 № 1Moż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.