تُملأ المتغيرات مثل $1 بعد إجراء تطابق التعبير النمطي. لنبسط مثالك قليلاً:
s.gsub('original(value)', "replacement#{$1}")
يتم تقييم تعبير "replacement#{$1}" قبل استدعاء دالة gsub. لذا، فإن $1 ستكون متبقية من مهمة تعبير نمطي سابقة. (ولهذا السبب نجحت محاولتك الثانية - فهي تأخذ $1 من المحاولة الأولى)
هناك عدة خيارات لحل هذه المشكلة. تحتوي دالة gsub على وظائف متنوعة كثيرة.
تتمثل تفضيلي في تمرير كتلة (block) إلى gsub. يتم تقييم الكتلة بعد إجراء تطابق التعبير النمطي، لذا ستعمل $1 كما تتوقع:
s.gsub('original(value)') { |match| "replacement#{$1}" }
أو يمكنك استخدام ميزة “المرجع الخلفي” (backreference) في gsub. لست معجبًا بهذا التركيب النحوي، لكنه يعمل. بدلاً من استخدام "replacement#{$1}"، استخدم 'replacement\1' (أو \2، أو \3، وهكذا).
s.gsub('original(value)', 'replacement\1')