לפנאן החל לשחק במחלקת הנוער של גרנוויל, ובשנת 2017 עבר למחלקת הנוער של קן. ב-12 בספטמבר 2020 ערך את הופעת הבכורה שלו בקבוצה הראשונה של המועדון, בניצחון 3-0 על רודז במסגרת המחזור השלישי בליגת המשנה הצרפתית לעונת . בסך הכל ערך 54 הופעות ליגה במדי המועדון.
ב-22 ביוני 2022 חתם לפנאן על חוזה לחמש עונות באולימפיק ליון מליגת העל הצרפתית. ב-5 באוגוסט ערך את הופעת הבכורה שלו במועדון, בניצחון 2-1 על אז'אקסיו במסגרת המחזור הראשון בליגה לעונת 2022/2023.
אינטרפולציה של מחרוזת
בתכנות מחשב, אינטרפולציה של מחרוזת (באנגלית: String interpolation) היא תהליך של פענוח מחרוזת מילולית המכילה שומרי מקום, המספקת תוצאה שבה שומרי המקום מוחלפים בערכים המתאימים להם. זוהי צורה של עיבוד תבנית פשוט או, במונחים פורמליים, צורה של קוואזי ציטוט (או החלפה לוגית). שומר המקום עשוי להיות שם משתנה, או בשפות מסוימות ביטוי שרירותי, שמפוענח בהקשר הנוכחי.
אינטרפולציה של מחרוזת היא אלטרנטיבה לבניית מחרוזת באמצעות שרשור, הדורשת פתיחת וסגירת מירכאות שוב ושוב או החלפה למחרוזת בפורמט printf, כאשר המשתנה רחוק מהמקום שבו נעשה בו שימוש. הדגמה של שלוש החלופות:
apples = 4
print("I have ${apples} apples.") # string interpolation
print("I have " + apples + " apples.") # string concatenation
print("I have %s apples.", apples) # format string
בדרך כלל מוצעים שני סוגים של ביטוי מילולי: אחד עם אינטרפולציה מופעלת, השני בלי. כאשר אין הפעלה של אינטרפולציה, עדיין יכולה להתבצע פעולת פענוח של מחרוזות מיוחדות, לדוגמה רצף כגון &amp;quot; עשוי להתפענח בהקשרים מסוימים כמרכאות (למשל ב-HTML), אפילו כאשר אין תמיכה באינטרפולציה. מחרוזות ללא אינטרפולציה שגם נמלטות מפענוח רצפים נקראות מחרוזות גולמיות. לדוגמה, בממשק שורת פקודה של יוניקס, מחרוזות במירכאות בודדות הן גולמיות, ואילו מחרוזות במירכאות כפולות מפעילות אינטרפולציה. מצייני מיקום מיוצגים בדרך כלל על ידי סימן ייעודי (בדרך כלל codice_1 או codice_2), למשל או , או עם סוגריים מסולסלים, למשל codice_3, ולפעמים שניהם, למשל . במקרים מסוימים ניתן להשתמש במפרטי עיצוב נוספים (כמו ב-printf), למשל codice_4, ובמקרים מסוימים ניתן לבצע אינטרפולציה של מפרטי העיצוב עצמם, למשל codice_5 . הרחבת המחרוזת מתרחשת בדרך כלל בזמן ריצה.
תמיכת השפה באינטרפולציה של מחרוזת משתנה מאוד בין שפות. שפות מסוימות אינן מציעות אינטרפולציה למחרוזות, ומשתמשות במקום זאת בשרשור, פונקציות עיצוב פשוטות או ספריות של תבניות. אינטרפולציה של מחרוזת נפוצה בשפות תכנות רבות העושות שימוש רב בייצוגי מחרוזת של נתונים, כגון Apache Groovy, ג'וליה, Kotlin, Perl, PHP, פייתון, Ruby, סקאלה, סוויפט, Tcl ורוב ממשקי שורת הפקודה של יוניקס.
אלגוריתמים.
ישנם שני סוגים עיקריים של אלגוריתמי הרחבת משתנים לאינטרפולציה של משתנים:
סוגיות אבטחה.
אינטרפולציה של מחרוזות, כמו שרשור מחרוזות, עשויה להוביל לבעיות אבטחה. אם נתוני קלט של המשתמש יעברו מילוט או סינון שגוי, המערכת תיחשף להזרקת SQL, הזרקת סקריפט, הזרקת ישות חיצונית של XML (XXE) והתקפות סקריפטים בין-אתרים (XSS).
דוגמה להזרקת SQL:
query = " "
אם codice_6 מוחלף ב " codice_7 ", ביצוע שאילתה זו ימחק את כל הנתונים בטבלה.
דוגמאות.
DATA(apples) = 4.
WRITE |I have { apples } apples|.
הפלט יהיה:
I have 4 apples
באש.
apples=4
echo "I have $apples apples"
echo "I have ${apples} apples"
הפלט יהיה:
I have 4 apples
apples = 4
print("I have $(apples) apples")
print("I have {0} apples" % apples)
הפלט יהיה:
I have 4 apples
סי שארפ.
var apples = 4;
var bananas = 3;
Console.WriteLine($"I have {apples} apples");
Console.WriteLine($"I have {apples + bananas} fruits");
הפלט יהיה:
I have 4 apples
I have 7 fruits
שפת סימון ColdFusion.
תחביר הסקריפט של ColdFusion Markup Language (CFML):
apples = 4;
writeOutput("I have #apples# apples");תחביר תג:
&lt;cfset apples = 4&gt;
&lt;cfoutput&gt;I have #apples# apples&lt;/cfoutput&gt;
הפלט יהיה:
I have 4 apples
CoffeeScript.
apples = 4
console.log "I have #{apples} apples"
הפלט יהיה:
I have 4 apples
int apples = 4, bananas = 3;
print('I have $apples apples.');
print('I have ${apples+bananas} fruit.');
הפלט יהיה:
I have 4 apples.
I have 7 fruit.
Go (שפת תכנות).
נכון לשנת 2022, בשפת Go אין תמיכה באינטרפולציה של מחרוזות. היו כמה הצעות להוספת תמיכה בגרסה הבאה של השפה, Go 2. במקום אינטרפולציה, גו משתמשת בפורמט printf בפונקציה codice_8
Groovy.
בשפת גרובי, מחרוזות עם אינטרפולציה ידועות כ-GSStrings:
def quality = "superhero"
final age = 52
def sentence = "A developer is a $quality, if he is ${age &lt;= 42 ? "young" : "seasoned"}"
println sentence
הפלט יהיה:
A developer is a superhero if he is seasoned
var apples = 4;
var bananas = 3;
trace('I have $apples apples.');
trace('I have ${apples+bananas} fruit.');
הפלט יהיה:
I have 4 apples.
I have 7 fruit.
ג'אווה.
נכון ל-2022, שפת התכנות ג'אווה אינה תומכת באינטרפולציה של מחרוזות, במקום זאת היא משתמשת בפונקציות ליצירת פורמט, הידועות שבהן הן המחלקה codice_9
JavaScript.
JavaScript, החל מתקן ECMAScript 2015 (ES6), תומכת באינטרפולציה של מחרוזות תוך שימוש בסימן הטעמה משני (codice_10. תכונה זו נקראת תבניות מילוליות. להלן דוגמה:
const apples = 4;
const bananas = 3;
console.log(`I have ${apples} apples`);
console.log(`I have ${apples + bananas} fruit`);
הפלט יהיה:
I have 4 apples
I have 7 fruit
ניתן להשתמש בתבנית מילולית גם עבור מחרוזת מרובת שורות:
console.log(`This is the first line of text.
This is the second line of text.`);
הפלט יהיה:
This is the first line of text.
This is the second line of text.
ג'וליה.
apples = 4
bananas = 3
print("I have $apples apples and $bananas bananas, making $(apples + bananas) pieces of fruit in total.")
הפלט יהיה:
I have 4 apples and 3 bananas, making 7 pieces of fruit in total.
Kotlin.
val quality = "superhero"
val apples = 4
val bananas = 3
val sentence = "A developer is a $quality. I have ${apples + bananas} fruit"
println(sentence)
הפלט יהיה:
A developer is a superhero. I have 7 fruit
Nemerle.
def apples = 4;
def bananas = 3;
Console.WriteLine($"I have $apples apples.");
Console.WriteLine($"I have $(apples + bananas) fruit.");
השפה תומכת גם בתכונות פורמט מתקדמות, כגון:
def fruit = ["apple", "banana"];
Console.WriteLine($&lt;#I have ..$(fruit; "\n"; f =&gt; f + "s")#&gt;);
הפלט יהיה:
apples
bananas
נים מספקת אינטרפולציה של מחרוזות באמצעות מודול ה-strutils. מחרוזות מילוליות עם פורמט, בהשראת F-string של שפת התכנות פייתון, מסופקות באמצעות מודול strformat, המאקרו strformat מוודא שמחרוזת הפורמט מעוצבת היטב ובעלת טיפוסים נכונים, ולאחר מכן מורחבת לקוד מקור של Nim בזמן ההידור.
import strutils, strformat
var apples = 4
var bananas = 3
echo "I have $1 apples".format(apples)
echo fmt"I have {apples} apples"
echo fmt"I have {apples + bananas} fruits"
echo fmt"""
I have
echo fmt"I have {apples=} apples"
echo fmt("I have (apples) {apples}", '(', ')')
echo fmt"""{ "yep\nope" }"""
הפלט יהיה:
I have 4 apples
I have 4 apples
I have 7 fruits
I have
4 apples
I have apples=4 apples
let numberOfApples = "4";
in "I have ${numberOfApples} apples"
הפלט יהיה:
I have 4 apples
ParaSail.
const Apples := 4
const Bananas := 3
Println ("I have `(Apples) apples.\n")
Println ("I have `(Apples+Bananas) fruit.\n")
הפלט יהיה:
I have 4 apples.
I have 7 fruit.
my $apples = 4;
my $bananas = 3;
print "I have $apples apples.\n";
print "I have @{[$apples+$bananas]} fruit.\n"; # Uses the Perl array (@) interpolation.
הפלט יהיה:
I have 4 apples.
I have 7 fruit.
&lt;?php
$apples = 5;
$bananas = 3;
echo "There are $apples apples and $bananas bananas.";
echo "\n";
echo "I have {$apples} apples and {$bananas} bananas.";
הפלט יהיה:
There are 5 apples and 3 bananas.
I have 5 apples and 3 bananas.
כאשר עושים שימוש במירכאות בודדות, לא מבוצעת אינטרפולציה.
פייתון.
Python תומכת באינטרפולציה של מחרוזות החל מגרסה 3.6, תחת השם "formatted string literals". מחרוזת שכזו מתחילה ב-codice_11 או codice_12 לפני פתיחת המירכאות, ומשתמשת בסוגריים מסולסלים עבור שומרי המקום:
apples = 4
bananas = 3
print(f'I have {apples} apples and {bananas} bananas')
הפלט יהיה:
I have 4 apples and 3 bananas
apples = 4
puts "I have #{apples} apples"
puts "I have %s apples" % apples
הפלט יהיה:
I have 4 apples
ראסט.
לראסט אין אינטרפולציה של מחרוזות באופן כללי, אך השפה מספקת פונקציונליות דומה באמצעות פקודת מאקרו, המכונה "מזהים לכודים במחרוזות פורמט", שהוצגה בגרסה 1.58.0, שפורסמה בינואר 2022.