כיצד לפצל מיתרים ברובי

אלא אם קלט המשתמש הוא מילה או מספר בודד, הקלט הזה יהיה צורך מפוצל או הפך לרשימת מחרוזות או מספרים.

לדוגמה, אם תוכנית מבקשת את שמך המלא, כולל ראשוני אמצעי, היא תחילה צריכה לפצל את הקלט הזה לשלושה נפרדים מיתרים לפני שהוא יכול לעבוד עם שם פרטי, אמצע ושם פרטי. זה מושג באמצעות מיתר # פיצול שיטה.

איך עובד מחרוזת # פיצול

בצורתו הבסיסית ביותר, מיתר # פיצול לוקח טיעון בודד: תוחם השדה כמחרוזת. תוחם זה יוסר מהפלט ויוחזר מערך מיתרים המפוצלים על התוחם.

אז בדוגמה הבאה, בהנחה שהמשתמש הזין את שמו בצורה נכונה, עליכם לקבל אלמנט תלת-ממדי מערך מהפיצול.

#! / usr / bin / env אודם
הדפס "מה שמך המלא? "
full_name = gets.chomp
name = full_name.split ('')
מציב את "שמך הפרטי הוא # {name.first}"
שם "שם המשפחה שלך הוא # {name.last}"

אם נפעיל תוכנית זו ונזין שם, נקבל תוצאות צפויות. כמו כן, שימו לב שם קודם ו שם משפחה הם צירופי מקרים. ה שם משתנה יהיה מערך, ושתי שיחות השיטה הללו יהיו שקולות ל- שם [0] ו שם [-1] בהתאמה.

$ Ruby split.rb
מה השם המלא שלך? מייקל סי. מורין
השם הפרטי שלך הוא מייקל
שם המשפחה שלך הוא מורין

למרות זאת, מיתר # פיצול

instagram viewer
הוא קצת יותר חכם ממה שהייתם חושבים. אם הוויכוח ל מיתר # פיצול הוא מחרוזת, הוא אכן משתמש בזה כמתחום, אבל אם הטיעון הוא מחרוזת עם רווח בודד (כפי שהשתמשנו), אז זה מציין שברצונך לפצל על כל שטח מרווח ושאתה רוצה גם להסיר כל שטח שטח מוביל.

לכן, אם היינו נותנים לו כמה קלט מעט מעוות כמו

מייקל סי. מורין

(עם רווחים נוספים), אם כן מיתר # פיצול עדיין יעשה את הצפוי. עם זאת, זה המקרה המיוחד היחיד כשאתה עובר א מחרוזת כטיעון הראשון. מפרידי ביטוי רגילים

אתה יכול גם להעביר ביטוי רגיל כטיעון הראשון. כאן, מיתר # פיצול הופך להיות קצת יותר גמיש. אנחנו יכולים גם להפוך את השם הקטן שלנו המפצל את הקוד לחכם יותר.

אנחנו לא רוצים את התקופה בסוף ראשית האמצע. אנו יודעים שמדובר בהתחלה אמצעית, ובסיס הנתונים לא ירצה שם תקופה, כך שנוכל להסיר אותה תוך התפצלות. מתי מיתר # פיצול תואם ביטוי רגיל, הוא עושה את אותו הדבר בדיוק כאילו זה עתה התאים לתחום מחרוזת: הוא מוציא אותו מהפלט ומפצל אותו בנקודה זו.

אז, אנו יכולים לפתח קצת את הדוגמא שלנו:

$ cat split.rb
#! / usr / bin / env אודם
הדפס "מה שמך המלא? "
full_name = gets.chomp
name = full_name.split (/ \.? \ s + /)
מציב את "שמך הפרטי הוא # {name.first}"
מציב את "ראשוני האמצע שלך הוא # {name [1]}"
שם "שם המשפחה שלך הוא # {name.last}"

מפריד רשומות ברירת מחדל

רובי לא ממש גדול על "משתנים מיוחדים" שאתה עשוי למצוא בשפות כמו פרל, אבל מיתר # פיצול עושה שימוש כזה שאתה צריך להיות מודע אליו. זהו משתנה ברירת המחדל של מפריד רשומות, המכונה גם $;.

זה גלובלי, משהו שלא רואים לעתים קרובות אצל רובי, כך שאם תשנה אותו, זה עשוי להשפיע על חלקים אחרים בקוד - רק וודא להחליף אותו בחזרה בסיום.

עם זאת, כל המשתנה הזה הוא לפעול כערך ברירת המחדל של הארגומנט הראשון אליו מיתר # פיצול. כברירת מחדל נראה כי משתנה זה מוגדר כ- אפס. לעומת זאת, אם מיתר # פיצולהטענה הראשונה היא אפס, הוא יחליף אותו במחרוזת שטח יחידה.

מפרידי אפס

אם עבר התוחם מיתר # פיצול הוא מחרוזת באורך אפס או ביטוי רגיל, אם כן מיתר # פיצול יפעל קצת אחרת. זה לא יסיר שום דבר מהמחרוזת המקורית ויתפצל על כל דמות. זה בעצם הופך את המיתר למערך באורך שווה המכיל מיתרים בעלי תו אחד בלבד, אחד לכל תו במחרוזת.

זה יכול להיות שימושי לביצוע איטרציה על המחרוזת והיה בשימוש ב- pre-1.9.x וב- pre-1.8.7 (שאחזר אחורה מספר תכונות החל מ- 1.9.x) לחזרות על תווים במחרוזת מבלי לדאוג להתפרקות רב בתים תווי Unicode. עם זאת, אם מה שאתה באמת רוצה לעשות זה לחזור על מחרוזת, ואתה משתמש ב- 1.8.7 או 1.9.x, כנראה שאתה צריך להשתמש מחרוזת # each_char במקום זאת.

#! / usr / bin / env אודם
str = "היא הפכה אותי לניו!"
str.split (''). כל לעשות | c |
מכניס ג
סוף

הגבלת אורך המערך המוחזר

אז בחזרה לדוגמא שניתוח שמנו, מה אם למישהו יש מקום בשם המשפחה שלהם? לדוגמה, שמות משפחה הולנדים יכולים לעתים קרובות להתחיל עם "ואן" (פירושו "של" או "מ").

אנחנו רק רוצים ממש 3-אלמנט מערך, כדי שנוכל להשתמש בטיעון השני ל מיתר # פיצול שעד כה התעלמנו. הטענה השנייה צפויה להיות א Fixnum. אם טיעון זה חיובי, לכל היותר, שאלמנטים רבים יתמלאו במערך. אז במקרה שלנו, נרצה לעבור 3 לטיעון זה.

#! / usr / bin / env אודם
הדפס "מה שמך המלא? "
full_name = gets.chomp
name = full_name.split (/ \.? \ s + /, 3)
מציב את "שמך הפרטי הוא # {name.first}"
מציב את "ראשוני האמצע שלך הוא # {name [1]}"
שם "שם המשפחה שלך הוא # {name.last}"

אם נפעיל את זה שוב וניתן לו שם הולנדי, זה יפעל כצפוי.

$ Ruby split.rb
מה השם המלא שלך? וינסנט וילם ואן גוך
השם הפרטי שלך הוא וינסנט
ראשית האמצע שלך הוא וילם
שם המשפחה שלך הוא ואן גוך

עם זאת, אם טיעון זה שלילי (מספר שלילי כלשהו), לא תהיה מגבלה על מספר ה- אלמנטים במערך הפלט וכל תוחמים נגררים יופיעו כמיתרי אורך אפס בסוף ה- מערך.

זה מודגם בקטע IRB זה:

: 001> "זה, הוא, מבחן" .split (',', -1)
=> ["זה", "הוא", "א", "מבחן", "", "", "", ""]