Ruby a des variables spéciales «$ 1, $ 2, $ 3 ...» et «$ n» reçoit la valeur qui correspond à la nième parenthèse dans la dernière correspondance de modèle réussie.
"abc" =~ /(.)(.)(.)/
p $1 #=> "a"
p $2 #=> "b"
p $3 #=> "c"
Rurima actuelle le 26 septembre 2020
Nombre n Vous pouvez utiliser n'importe quel nombre de grands entiers positifs.
Cela dit, mais en réalité, lorsque j'essaie d'utiliser une valeur énorme, un avertissement s'affiche (j'ai remarqué en jouant)
$ ruby -e '$9999999999999999'
-e:1: warning: `$9999999999999999' is too big for a number variable, always nil
Dans ce cas, je me demande combien de valeur peut être utilisée comme n de $ n
, donc quand je l'ai recherchée avec le code suivant en utilisant une simple dichotomie, la valeur maximale semble être 1073741823 dans mon environnement. fait.
require 'stringio'
ok = 0
ng = 10**10
while (ok-ng).abs > 1
io = StringIO.new
$stderr = io
mi = (ok+ng)/2
eval("$#{mi}")
if io.size == 0
ok = mi
else
ng = mi
end
$stderr = STDERR
end
p ok #=> 1073741823
Même si vous le vérifiez par une autre méthode, il semble que vous serez averti si $ 1073741823
est le maximum et que la valeur est supérieure à cela. Cependant, la valeur 1073741823 semble dépendre de l'environnement, donc en fonction de l'environnement, vous pourrez peut-être utiliser une valeur plus grande ou vous pouvez obtenir un avertissement avec une valeur plus petite.
$ ruby -e '$1073741823'
#=>Il ne se passe rien
$ ruby -e '$1073741824'
#=>L'avertissement est émis
#=> -e:1: warning: `$1073741824' is too big for a number variable, always nil
La question évidente est de savoir ce qui se passe si la correspondance est réussie avec une expression régulière qui capture plus de 1073741823, mais ce n'est pas grave. Ruby a un nombre maximum de captures de 32767, et les expressions régulières qui dépassent cette limite échoueront à se compiler.
$ ruby -e 'Regexp.compile("(.)"*32767)'
#=>Il ne se passe rien
$ ruby -e 'Regexp.compile("(.)"*32768)'
#=>RegexpError se produit. Le message est le suivant
#=> `initialize': too many capture groups are specified:
J'ai trouvé une valeur de 32767 avec un script simple utilisant la dichotomie suivante, mais quand je regarde le code source d'Onikumo, le moteur d'expression régulière Ruby, je vois la limite supérieure du nombre de captures [ʻONIG_MAX_CAPTURE_GROUP_NUM. Il y a une variable à afficher, qui semble être 32767. ](Https://github.com/ruby/ruby/blob/c5eb24349a4535948514fe765c3ddb0628d81004/include/ruby/onigmo.h#L438), puis la valeur maximale du côté de la variable spéciale «1 $, 2 $, 3 $ ...» J'ai l'impression que ça peut être 32767 (´ ・ ω ・
)
ok = 0
ng = 10**8
while (ok-ng).abs > 1
mi = (ok+ng)/2
begin
Regexp.compile("(.)"*mi)
ok = mi
rescue RegexpError => e
ng = mi
end
end
p ok #=> 32767
** Informations environnementales **
$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]