[RUBY] Un avertissement s'affiche lorsque vous essayez d'utiliser un entier énorme avec les variables spéciales $ 1, $ 2, $ 3 ...

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]

Recommended Posts

Un avertissement s'affiche lorsque vous essayez d'utiliser un entier énorme avec les variables spéciales $ 1, $ 2, $ 3 ...
[Rails] Que faire lorsque la vue se réduit lorsqu'un message est affiché avec la méthode des erreurs
[WSL] Solution pour le phénomène que 404 est affiché lors de la tentative d'insertion de Java avec apt (mémo personnel)
Une note gênante lorsque vous essayez d'utiliser nginx avec des conteneurs distants de vscode
Lorsque l'accès demandé à la ressource est refusé lors de la transmission avec Docker
[Ruby] C'est la solution. Quand dois-je utiliser des variables d'instance?
J'ai eu un IllegalAccessError en essayant d'utiliser PowerMock avec JUnit
Quand j'ai essayé d'utiliser le kit AWS SDK avec Ruby + Lambda, `sam local` était en panne.
Que faire lorsque javax.el.ELException: Pas une expression de méthode valide: s'affiche lorsque l'écran JSF est affiché
Que faire si l'opération non autorisée s'affiche lors de l'exécution d'une commande dans le terminal
[IOS] Que faire lorsque l'image est remplie d'une seule couleur
[Petite histoire Java] Surveiller lorsqu'une valeur est ajoutée à la liste
Comme la commande du utilisée lorsque la capacité est pleine est difficile à utiliser, j'ai essayé de l'envelopper avec du rubis
Possibilité lors du déploiement sur EC2 mais rien n'est affiché dans le journal des erreurs
Que faire quand est invalide car il ne commence pas par un "-"
Solution lorsque la connexion à la base de données n'est pas possible avec un nouveau conteneur car le port est affecté au conteneur docker existant
Turbolinks: je veux résoudre le problème que JS ne s'affiche pas correctement à moins d'être rechargé lors de la transition avec link_to
Lorsque le projet n'est pas affiché dans eclipse
Une histoire sur la création de chemin PKIX a échoué lors de la tentative de déploiement sur Tomcat avec Jenkins
Lors de l'importation de CSV avec Rails, il était vraiment facile d'utiliser la commande nkf
Que faire lorsque «Échec du chargement de la bibliothèque partagée JNI» s'affiche dans Eclipse
Mémo à faire pour le moment lors de la construction de la série CentOS 6 avec VirtualBox
Que faire lorsque l'adresse déjà utilisée est affichée après l'exécution des rails
Lors du téléchargement d'un fichier avec Spring Boot, la gestion des erreurs est effectuée lorsque la taille maximale du fichier est dépassée.
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
Quand le survol d'Eclipse est difficile à voir
Un mémorandum lors de l'essai de Spring Data JPA avec STS
Compte tenu de l'éditeur de propriétés utilisé dans SpringToolSuite (STS)
Un mémorandum lors de la tentative de création d'une interface graphique à l'aide de JavaFX
Une histoire d'essayer de s'entendre avec Mockito
Remarques à vérifier lorsque vous essayez d'utiliser Lombok
Comment effectuer un processus spécifique lorsque le bouton de retour est enfoncé dans le fragment Android
Lorsqu'un fichier Java créé avec l'éditeur Atom est déformé lorsqu'il est exécuté à l'invite de commande
Comment réduire même un peu la charge du programme lors de la combinaison de caractères avec JAVA
gestion des erreurs wsimport (une classe / interface avec le même nom "xxx" est déjà utilisée)