هذه الوثيقة

في مجال الحوسبة ، يُعرف المستند المُضمّن ( أو المستند المُضمّن ، أو النص المُضمّن ، أو المستند المُضمّن ، أو النص المُضمّن ، أو السلسلة المُضمّنة ، أو النص البرمجي المُضمّن ) بأنه جزء من ملف برمجي يُعامل كملف منفصل . ويُستخدم المصطلح أيضًا لوصف نوع من السلاسل النصية متعددة الأسطر التي تستخدم بنية مشابهة، مع الحفاظ على فواصل الأسطر والمسافات البيضاء الأخرى (بما في ذلك المسافة البادئة) في النص.

تنشأ المستندات هنا في بيئة يونكس ، [ 1 ] وتُوجد في بيئة بورن منذ عام 1979، وفي معظم البيئات اللاحقة. وتُوجد سلاسل نصية حرفية بنمط المستندات في العديد من لغات البرمجة عالية المستوى ، ولا سيما لغة بيرل (التي استُلهمت بنيتها من بيئة يونكس) واللغات المتأثرة بها، مثل PHP و Ruby . كما تدعم جافا سكريبت هذه الوظيفة عبر القوالب الحرفية ، وهي ميزة أُضيفت في إصدارها السادس ( ES6 ). وتوفر لغات برمجة عالية المستوى أخرى ، مثل بايثون وجوليا و Tcl، إمكانيات أخرى للتعامل مع السلاسل النصية متعددة الأسطر.

هنا، يمكن التعامل مع المستندات إما كملفات أو كسلاسل نصية. بعض أنظمة التشغيل تتعامل معها كسلسلة نصية حرفية، مما يسمح باستبدال المتغيرات واستبدال الأوامر داخل السلسلة النصية.

ملخص

الصيغة الأكثر شيوعًا للمستندات المضمنة، والتي نشأت في أنظمة يونكس، هي : يبدأ النص المراد اقتباسه بفاصل (غالبًا الكلمة أو [ 2 ] )، ثم يبدأ النص المراد اقتباسه في السطر التالي، ويُختتم بنفس الفاصل في سطر منفصل. يعود سبب هذه الصيغة إلى أن المستندات المضمنة تُعتبر رسميًا نصوصًا حرفية متدفقة، وغالبًا ما يُعاد توجيه محتوى المستند المضمن إلى المدخلات القياسية ( stdin ) للأمر السابق أو البرنامج النصي/الملف التنفيذي الحالي.<<EOFEND

صيغة المستند هنا مماثلة لصيغة shell لإعادة توجيه الإدخال ، والتي <يتبعها اسم الملف المراد استخدامه كمدخل.

تستخدم لغات أخرى في كثير من الأحيان صيغًا متشابهة إلى حد كبير، لكن تفاصيل الصيغة والوظائف الفعلية قد تختلف اختلافًا كبيرًا. عند استخدامها ببساطة مع السلاسل النصية، لا تشير إلى التوجيه غير المباشر، بل هي مجرد اصطلاح لتحديد بداية السلسلة. في بعض اللغات، مثل روبي، تُستخدم أيضًا لإعادة توجيه المدخلات، مما يؤدي إلى استخدامها مرتين إذا رغب المستخدم في إعادة التوجيه من سلسلة نصية في مستند مضمن.<<<<<<

نصوص الملفات

بالمعنى الدقيق، تُعتبر المستندات هنا عبارة عن ملفات حرفية أو تدفقات حرفية. نشأت هذه في بيئة يونكس، على الرغم من توفر إمكانيات مماثلة في بعض اللغات الأخرى.

أنظمة يونكس

تتوفر المستندات هنا في العديد من واجهات سطر الأوامر في أنظمة يونكس. [ 1 ] في المثال التالي، يتم تمرير نص إلى trالأمر (مع تحويل الأحرف الصغيرة إلى كبيرة) باستخدام مستند هنا. يمكن أن يكون هذا في ملف سطر الأوامر، أو يتم إدخاله تفاعليًا في موجه الأوامر.

$ LANG = C tr a-z A-Z << END > واحد اثنان ثلاثة > أربعة خمسة ستة > END واحد اثنان ثلاثة أربعة خمسة ستة 

في هذه الحالة END، استُخدمت علامة `-` كمعرّف فاصل. وقد حددت بداية ونهاية المستند المضمن. لا يلزم فصل إعادة التوجيه والمعرّف الفاصل بمسافة، <<ENDأو << ENDيمكن استخدام كليهما بنفس الكفاءة.

بشكل افتراضي، يكون السلوك مطابقًا إلى حد كبير لمحتويات علامات الاقتباس المزدوجة: يتم استبدال أسماء المتغيرات بقيمها، ويتم تقييم الأوامر الموجودة داخل علامات الاقتباس المائلة، وما إلى ذلك. [ أ ]

$ cat << EOF > \$ دليل العمل "$PWD" `pwd` > EOF $ دليل العمل "/home/user" /home/user 

يمكن تعطيل هذه الخاصية بوضع أي جزء من التسمية بين علامتي اقتباس، ثم إنهاء الجزء بالقيمة غير المقتبسة؛ [ ب ] يكون السلوك مطابقًا تمامًا لما لو كانت المحتويات محاطة بعلامات اقتباس مفردة. على سبيل المثال، عند وضعها بين علامتي اقتباس مفردتين:

$ cat << 'EOF' > \$Workingdir "$PWD" `pwd` > EOF \$Workingdir "$PWD" `pwd`

يمكن استخدام علامات الاقتباس المزدوجة أيضًا، ولكن هذا قد يُسبب التباسًا، لأن التوسيع يحدث في سلسلة نصية محاطة بعلامات اقتباس مزدوجة، ولكنه لا يحدث في مستند مضمّن بعلامات اقتباس مزدوجة. [ 4 ] يتم التمييز بين علامات الاقتباس المفردة والمزدوجة في بعض اللغات الأخرى، ولا سيما لغة بيرل (انظر أدناه)، حيث يكون السلوك مماثلاً لسلوك علامات الاقتباس في السلاسل النصية.

في بيئة POSIX shell ، وليس في csh/tcsh، يؤدي إضافة علامة ناقص <<(- <<-) إلى تجاهل علامات الجدولة البادئة. [ 5 ] يسمح هذا بوضع مسافة بادئة للمستندات في نصوص shell (وذلك أساسًا لمواءمتها مع المسافة البادئة الموجودة) دون تغيير قيمتها: [ c ]

نص برمجي يحتوي على:

LANG = C tr a-z A-Z <<- نهاية النص هنا doc مع <<- مسافة واحدة (أي 0x20) في بداية هذا السطر  يبدأ هذا السطر بعلامة جدولة واحدة (أي 0x09) كما هو الحال في السطر التالي  نهاية النصecho كان الهدف هو إنهاء العملية قبل هذا السطر echo ولم تتم معالجة هذه الأسطر بواسطة tr echo +++++++++++++++LANG = C tr a-z A-Z << END_TEXT هنا مستند مع << مسافة واحدة (أي 0x20) في بداية هذا السطر.  يبدأ هذا السطر بعلامة جدولة واحدة (أي 0x09)، وكذلك السطر التالي.  END_TEXTecho كان الهدف هو إنهاء العملية قبل هذا السطر ، echo ولكن نظرًا لأن السطر الذي يحتوي على المعرف المحدد بدأ بعلامة جدولة ، فلم يتم التعرف عليه ، echo واستمر أمر tr في المعالجة. 

ينتج:

هنا يوجد مستند يحتوي على <<- مسافة واحدة (مثل 0x20) في بداية هذا السطر. يبدأ هذا السطر بعلامة جدولة واحدة (مثل 0x09)، وكذلك السطر التالي. كانت النهاية المقصودة قبل هذا السطر ، ولم تتم معالجتها بواسطة tr. +++++++++++++++ هنا يوجد مستند يحتوي على << مسافة واحدة (مثل 0x20) في بداية هذا السطر.  يبدأ هذا السطر بعلامة جدولة واحدة (مثل 0x09)، وكذلك السطر التالي.  نهاية النصECHO كانت النهاية المقصودة قبل هذا السطر، ECHO ولكن لأن السطر الذي يحتوي على المعرف المحدد بدأ بعلامة جدولة، لم يتم التعرف عليه، واستمر أمر TR في المعالجة.

ومن الاستخدامات الأخرى إخراج البيانات إلى ملف:

$ cat << EOF > ~/testFile001 > ثلاث مسافات تسبق هذا النص. > علامة جدولة واحدة في بداية هذا السطر. > لا شيء يسبق هذا النص EOF

هنا سلاسل

سلسلة الإدخال (المتوفرة في bash و ksh و zsh ) متشابهة نحويًا، وتتكون من `<` <<<، وتُعيد توجيه الإدخال من كلمة (سلسلة تُعامل كوحدة واحدة بواسطة الصدفة، وفي هذا السياق عادةً ما تكون سلسلة نصية حرفية). في هذه الحالة، يُستخدم بناء جملة الصدفة المعتاد للكلمة ("بناء جملة سلسلة الإدخال")، مع اختلاف بناء الجملة فقط وهو إعادة التوجيه: سلسلة الإدخال هي سلسلة نصية عادية تُستخدم لإعادة توجيه الإدخال، وليست نوعًا خاصًا من السلاسل النصية.

لا داعي لوضع علامة اقتباس على كلمة واحدة:

$ LANG = C tr a-z A-Z <<< one ONE

في حالة وجود مسافات في السلسلة النصية، يجب وضعها بين علامتي اقتباس:

$ LANG = C tr a-z A-Z <<< 'واحد اثنان ثلاثة' واحد اثنان ثلاثة

ويمكن كتابة ذلك أيضاً على النحو التالي:

$ foo = 'واحد اثنان ثلاثة' $ LANG = C tr a-z A-Z <<< " $foo " واحد اثنان ثلاثة

السلاسل النصية متعددة الأسطر مقبولة، مما ينتج عنه:

$ LANG = C tr a-z A-Z <<< ' one > two three' ONE TWO THREE

لاحظ أنه يتم تضمين أسطر جديدة في بداية ونهاية السطر، إن وجدت:

$ LANG = C tr a-z A-Z <<< ' > واحد > اثنان ثلاثة > 'واحد اثنين ثلاثةدولار

الفرق الرئيسي بين مستندات "هنا" و"هنا" هو أن فواصل النصوص في مستندات "هنا" تكون على أسطر منفصلة، ​​ويتم حذف أسطر جديدة في البداية والنهاية. على عكس مستندات "هنا"، لا تستخدم سلاسل "هنا" فواصل.

تُعد السلاسل النصية مفيدة بشكل خاص للأوامر التي تتطلب عادةً مدخلات قصيرة، مثل الآلة الحاسبة bc:

$ bc <<< 2 ^10 1024

لاحظ أنه يمكن هنا أيضًا تحقيق سلوك السلسلة (عكس الترتيب) عبر التوجيه والأمر echo، كما في:

$ echo 'one two three' | LANG = C tr a-z A-Z ONE TWO THREE

لكن هنا تكون السلاسل مفيدة بشكل خاص عندما يحتاج الأمر الأخير إلى التشغيل في العملية الحالية، كما هو الحال مع الأمر readالمدمج:

$ echo 'one two three' | read -r a b c $ echo " $a $b $c "

لا ينتج عنه شيء، بينما

$ read -r a b c <<< 'واحد اثنان ثلاثة' $ echo " $a $b $c " واحد اثنان ثلاثة

يحدث هذا لأنه في المثال السابق، يؤدي التوجيه readإلى التشغيل في عملية فرعية، وبالتالي لا يمكنه التأثير على بيئة العملية الأصلية .

مايكروسوفت NMAKE

في Microsoft NMAKE ، تُسمى المستندات هنا بالملفات المضمنة . يُشار إلى الملفات المضمنة بالصيغة `<file>` أو `<file>` : تُنشئ الصيغة الأولى ملفًا مؤقتًا ، بينما تُنشئ الصيغة الثانية الملف (أو تستبدله) بالمسار المحدد. يُنهى الملف المضمن بـ `<file>` في سطر منفصل، ويمكن إضافة الكلمة المفتاحية `<file>` (غير حساسة لحالة الأحرف) أو `<file>` للإشارة إلى ما إذا كان يجب الاحتفاظ بالملف المُنشأ.<<<<pathname<<KEEPNOKEEP

الهدف 0 : التابع 0 الأمر 0 << ملف مضمن مؤقت ... <<الهدف 1 : التابع 1 الأمر 1 << ملف مضمن مؤقت، ولكن تم الاحتفاظ به ... << احتفظ الهدف 2 : التابع 2 الأمر 2 << اسم الملف 2، ولكن تم تجاهله ملف مضمن ... << لا تحتفظ الهدف 3 : التابع 3 الأمر 3 << اسم الملف 3 ملف مضمن ... << احتفظ

R

لا تدعم لغة R التعامل مع الملفات النصية، ولكنها توفر وظائف مكافئة من خلال دمج النصوص النصية مع دالة لتحويلها إلى ملفات. تسمح R باستخدام المسافات البيضاء، بما في ذلك أسطر جديدة، في النصوص. بعد ذلك، يمكن تحويل النص إلى مُعرّف ملف باستخدام textConnection()الدالة. على سبيل المثال، يحوّل الكود التالي جدول بيانات مُضمّن في شفرة المصدر إلى متغير إطار بيانات:

str <- "State Population Income Illiteracy Life.Exp Murder HS.Grad Frost Alabama 3615 3624 2.1 69.05 15.1 41.3 20 Alaska 365 6315 1.5 69.31 11.3 66.7 152 Arizona 2212 4530 1.8 70.55 7.8 58.1 15 Arkansas 2110 3378 1.9 70.66 10.1 39.9 65" x <- read.table ( textConnection ( str ), header = TRUE , row.names = 1 )

مقطع البيانات

تحتوي لغتا بيرل [ 6 ] وروبي [ 7 ] على شكل من أشكال الملفات الحرفية، والتي يمكن اعتبارها شكلاً من أشكال مقاطع البيانات . في هاتين اللغتين، يشير تضمين السطر __DATA__(في بيرل) أو __END__(في روبي، بيرل القديمة) إلى نهاية مقطع التعليمات البرمجية وبداية مقطع البيانات. يتم تنفيذ المحتوى الذي يسبق هذا السطر فقط، بينما يتوفر محتوى ملف المصدر الذي يليه ككائن ملف: PACKAGE::DATAفي بيرل (على سبيل المثال، main::DATA) DATAوفي روبي. وباعتبارها ملفات مضمنة، فإنها تشبه دلاليًا المستندات المضمنة، على الرغم من أنه لا يمكن أن يكون هناك سوى مستند واحد لكل نص برمجي. ومع ذلك، في هاتين اللغتين، يشير مصطلح "المستند المضمن" إلى سلاسل نصية حرفية متعددة الأسطر، كما هو موضح أدناه.

مخطط معرّف الموارد الموحد للبيانات

كما هو موضح بالتفصيل في مخطط Data URI ، فإن جميع متصفحات الويب الرئيسية تفهم عناوين URI التي تبدأ بـ data: على أنها مستند هنا.

سلاسل نصية متعددة الأسطر

يُستخدم مصطلح "هنا مستند" أو "هنا سلسلة نصية" أيضًا للإشارة إلى السلاسل النصية متعددة الأسطر في لغات برمجة مختلفة، ولا سيما لغة بيرل (التي تأثرت بنيتها بواجهة يونكس)، واللغات المتأثرة ببيرل، ولا سيما لغتي PHP وروبي. غالبًا ما تُحتفظ ببنية واجهة يونكس ، على الرغم من عدم استخدامها لإعادة توجيه المدخلات.<<

متأثر بلغة بيرل

بيرل

في لغة بيرل، توجد عدة طرق لاستدعاء مستندات here. [ 8 ] تؤدي المحددات المحيطة بالوسم نفس التأثير داخل مستند here كما هو الحال في سلسلة نصية عادية: على سبيل المثال، يسمح استخدام علامات اقتباس مزدوجة حول الوسم بإدخال المتغيرات ، بينما لا يسمح استخدام علامات اقتباس مفردة بذلك، واستخدام الوسم بدون أي منهما يتصرف كعلامات اقتباس مزدوجة. يؤدي استخدام علامات التنصيص المائلة (`) كمحددات حول الوسم إلى تشغيل محتويات heredoc كبرنامج نصي shell. من الضروري التأكد من أن وسم النهاية (end tag) في بداية السطر وإلا فلن يتعرف عليه المفسر.

لاحظ أن المستند هنا لا يبدأ من الوسم، بل يبدأ في السطر التالي. لذا، فإن العبارة التي تحتوي على الوسم تستمر بعد الوسم.

إليك مثال باستخدام علامات اقتباس مزدوجة:

my $sender = "Buffy the Vampire Slayer" ; my $recipient = "Spike" ;print <<" END ";عزيزي/عزيزتي المستلم/المستلمة،أتمنى لك أن تغادر ساني ديل ولا تعود إليها أبداً.ليس تمامًا حبًا، يا مُرسِلنهاية

الناتج:

عزيزي سبايك،أتمنى لك أن تغادر ساني ديل ولا تعود إليها أبداً.ليس تمامًا حبًا، بافي قاتلة مصاصي الدماء

إليك مثال باستخدام علامات اقتباس مفردة:

print <<' END '; عزيزي/عزيزتي $recipient،أتمنى لك أن تغادر ساني ديل ولا تعود إليها أبداً.ليس تمامًا حبًا، $sender END

الناتج:

عزيزي/عزيزتي المستلم/المستلمة،أتمنى لك أن تغادر ساني ديل ولا تعود إليها أبداً.ليس تمامًا حبًا، يا مُرسِل

ومثال باستخدام علامات التنصيص المائلة (قد لا يكون قابلاً للنقل):

my $shell_script_stdout = << `END` ; echo foo echo bar END

من الممكن بدء عدة مستندات مضمنة (heredocs) على نفس السطر:

قل ( << ابدأ . " هذا هو المنتصف\n " . << نهاية ) ; هذه هي البداية : ابدأ والآن انتهى ! نهاية# هذا يعادل: قل ( "هذه هي البداية:\nهذا هو المنتصف\nوالآن انتهى الأمر!\n" );

قد يحتوي الوسم نفسه على مسافات بيضاء، مما قد يسمح باستخدام heredocs دون كسر المسافة البادئة .

قل << 'نهاية' ؛ مرحباً بالعالم نهاية

على الرغم من أنه منذ إصدار بيرل 5.26، [ 9 ] يمكن أن تتضمن heredocs مسافة بادئة:

#يطبع "Hello there\n" بدون مسافة بيضاء في البداية. إذا ( 1 ) { اطبع <<~ EOF ; Hello there EOF }

بالإضافة إلى هذه السلاسل النصية، توفر لغة بيرل أيضًا ملفات حرفية، وهي محتويات الملف الذي يلي __DATA__(سابقًا __END__) في سطر منفصل. يمكن الوصول إلى هذه المحتويات ككائن ملف PACKAGE::DATAمثل main::DATA، ويمكن اعتبارها شكلاً من أشكال مقاطع البيانات .

PHP

في لغة PHP، تُسمى المستندات هنا باسم heredocs . لا تُعتبر heredocs سلاسل نصية حرفية. يتصرف نص heredoc تمامًا مثل سلسلة نصية محاطة بعلامات اقتباس مزدوجة، ولكن بدون علامات الاقتباس. على سبيل المثال، سيتم تحليل `$` كمتغير start، و`${` أو `{$` كمتغير مركب start.

<?php$name = "Joe Smith" ; $occupation = "Programmer" ; echo <<< EOF هذا قسم من قسم الوثائق المضمنة.  لمزيد من المعلومات، تحدث إلى $name، أو إلى $occupation المحلي. شكرًا!نهاية الملف ؛$toprint = <<< EOF مرحباً يا $name! يمكنك بالفعل تعيين قسم heredoc إلى متغير!نهاية الملف ؛ صدى $toprint ؛?>

المخرجات

هذا قسم من قسم الوثائق المضمنة. لمزيد من المعلومات، تواصل مع جو سميث، المبرمج المحلي لديك.شكرًا!مرحباً جو سميث! يمكنك بالفعل تعيين قسم heredoc إلى متغير!

في إصدارات PHP السابقة للإصدار 7.3، يجب ألا يحتوي السطر الذي يتضمن مُعرّف الإغلاق على أي أحرف أخرى، باستثناء فاصلة منقوطة اختيارية في النهاية. وإلا، فلن يُعتبر مُعرّف إغلاق، وسيستمر PHP في البحث عنه. إذا لم يتم العثور على مُعرّف إغلاق صحيح، فسيحدث خطأ في التحليل في السطر الأخير من البرنامج النصي. مع ذلك، بدءًا من الإصدار 7.3، لم يعد من الضروري أن يتبع مُعرّف الإغلاق فاصلة منقوطة أو سطر جديد. بالإضافة إلى ذلك، يمكن وضع مسافة بادئة لمُعرّف الإغلاق، وفي هذه الحالة ستُزال المسافة البادئة من جميع أسطر سلسلة التوثيق. [ 10 ]

في PHP 5.3 والإصدارات الأحدث، كما هو الحال في Perl، من الممكن عدم إدراج المتغيرات عن طريق إحاطة الوسم بعلامات اقتباس مفردة؛ وهذا ما يسمى nowdoc : [ 11 ]

$x = <<<' END ' عزيزي/عزيزتي $recipient،أتمنى لك أن تغادر ساني ديل ولا تعود إليها أبداً.ليس تمامًا حبًا، $sender END ;

في PHP 5.3+، من الممكن أيضًا إحاطة الوسم بعلامات اقتباس مزدوجة، وهو ما يشبه Perl له نفس تأثير عدم إحاطة الوسم بأي شيء على الإطلاق.

روبي

يعرض كود Ruby التالي قائمة البقالة باستخدام مستند مضمن.

puts << قائمة البقالة ---- 1. مزيج سلطة. 2. فراولة.* 3. حبوب إفطار. 4. حليب.* * عضوي قائمة البقالة

النتيجة:

قائمة مشتريات البقالة (ruby grocery -list.rb) ------------ 1. مزيج سلطة. 2. فراولة.* 3. حبوب إفطار. 4. حليب.* * عضوي

لا يشير استخدام `in` في مستند `here` إلى إعادة توجيه الإدخال، ولكن روبي تستخدم `in` أيضًا لإعادة توجيه الإدخال، لذا فإن إعادة التوجيه إلى ملف من مستند `here` تتضمن استخدام `in` مرتين، بمعانٍ مختلفة:<<<<<<

ملف :: فتح ( "قائمة البقالة" , "w" ) do | f | f << << قائمة_البقالة قائمة البقالة ---- 1. مزيج سلطة. 2. فراولة.* 3. حبوب. 4. حليب.* * عضوي قائمة_البقالة نهاية

كما هو الحال في أنظمة يونكس، يسمح روبي أيضًا بعدم بدء مُعرّف الفصل من العمود الأول للسطر، إذا كانت بداية المستند المُضمّن مُحدّدة ببادئة مختلفة قليلاً <<-. علاوة على ذلك، يتعامل روبي مع المستندات المُضمّنة كسلسلة نصية بين علامتي اقتباس مزدوجتين، وبالتالي، يُمكن استخدام هذا #{}التركيب لإدراج التعليمات البرمجية. يوضح المثال التالي هاتين الميزتين:

الآن = الوقت . الآن يضع <<- نهاية الملف  إنها الساعة رقم #{الآن.الساعة} يا جون، أين أطفالك؟  نهاية الملف

تُوسّع لغة روبي هذا المفهوم من خلال توفير صيغة "<<~" لحذف المسافة البادئة في المستند المضمن:

puts <<~ EOF  هذا السطر مُزاح بمقدار مسافتين.  هذا السطر مُزاح بمقدار أربع مسافات.  هذا السطر مُزاح بمقدار ست مسافات.  EOF

يتم حذف المسافة البادئة المشتركة المكونة من مسافتين من جميع الأسطر:

$ ruby ​​indented-heredoc.rb هذا السطر مُزاح بمقدار مسافتين.  هذا السطر مُزاح بمقدار أربع مسافات.  هذا السطر مُزاح بمقدار ست مسافات.

على غرار لغة بيرل، تسمح لغة روبي بإنشاء عدة مستندات مضمنة في سطر واحد:

puts << BEGIN + "<--- middle ---> \n " + << END هذه هي البداية: BEGIN والآن انتهى الأمر! END# هذا يساوي هذا التعبير: puts "هذه هي البداية: \n <--- الوسط ---> \n والآن انتهى الأمر!"

كما هو الحال في لغة بيرل، تتميز لغة روبي بخاصية عرض محتويات الملف __END__في سطر منفصل. ويمكن الوصول إلى هذه المحتويات ككائن ملف DATA، ويمكن اعتبارها شكلاً من أشكال مقاطع البيانات .

بايثون

يدعم بايثون السلاسل النصية متعددة الأسطر كسلسلة نصية "حرفية". يمكن وضعها بين ثلاث علامات اقتباس مفردة (') أو مزدوجة (")، كما هو موضح في الأمثلة أدناه.

print ( """ الزبون: ليس متجر جبن مميزًا، أليس كذلك؟ صاحب المتجر: إنه الأفضل في المنطقة يا سيدي. """ )

ابتداءً من الإصدار 3.6 من بايثون، تدعم السلاسل النصية الحرفية (f-strings) استيفاء المتغيرات والتعبيرات.

نوع المتجر = "جبنة" التكريم = " أجود" اطبع ( f """ الزبون: ليس متجرًا مميزًا ، أليس كذلك ؟ صاحب المتجر : في المنطقة، سيدي. " " " )

جافا

يتم دعم كتل النصوص بدءًا من Java 15 عبر JEP 378: [ 12 ] [ 13 ]

String html = """  <html>  <body>  <p>Hello, world</p>  </body>  </html> """ ;

لغة سي++

منذ إصدار C++11 ، يدعم C++ القيم النصية الحرفية مع فاصل مخصص ("my_delimiter" في هذا المثال):

#include <ostream>const char * str = R " my_delimiter( بداية السلسلة. سطر جديد slash \ quote " ' parens ) ( نهاية السلسلة )my_delimiter " ; std :: cout << str << std :: endl ;

سأقوم بطباعتها

بداية السلسلة. سطر جديد slash \ quote " ' parens ) ( نهاية السلسلة 

د

منذ الإصدار 2.0، يدعم Dq"IDENT سلاسل نصية بنمط المستند باستخدام الحرف البادئ 'q'. تبدأ هذه السلاسل بـ متبوعة مباشرة بسطر جديد (لمعرف IDENT)، وتنتهي بـ IDENT"في بداية السطر.

int main () { string list = q "IDENT 1. العنصر الأول 2. العنصر الثاني 3. العنصر الثالث IDENT" ; writef ( list ); }

يدعم D أيضًا بعض محددات الاقتباس، ذات بناء جملة مماثل، حيث تبدأ هذه السلاسل q"[وتنتهي بـ ]"أو بشكل مماثل بالنسبة لأحرف المحدد الأخرى (أي من () <> {} أو []).

OS/JCL

في لغة التحكم في المهام (JCL) من IBM ، المستخدمة في أنظمة التشغيل MVS السابقة و z/OS الحالية، يمكن تحديد البيانات المضمنة في تدفق المهام باستخدام علامة * في عبارة DD، مثل `<dl> ` أو ` <dl>`. في الحالة الأولى، تتبع أسطر النص وتُدمج في ملف وهمي باسم DD هو SYSIN. تُدمج جميع السجلات التي تلي الأمر `<dl>` حتى يظهر أمر آخر من أوامر نظام التشغيل/JCL (أي سطر يبدأ بـ `<dl> `)، أو يتم العثور على تسلسل نهاية الملف الافتراضي ( `<dl>`)، أو تحدث نهاية البيانات الفعلية. في الحالة الثانية، تكون الشروط هي نفسها، باستثناء استخدام المعامل DLM= لتحديد سلسلة النص التي تشير إلى نهاية البيانات، والتي يمكن استخدامها إذا كان تدفق البيانات يحتوي على JCL (مرة أخرى، أي سطر يبدأ بـ `<dl> `)، أو التسلسل `<dl>` (مثل التعليقات في شفرة مصدر C أو C++). يقوم الكود التالي بتجميع وتنفيذ برنامج بلغة التجميع ، مُقدم كبيانات مضمنة إلى المُجمِّع.//SYSIN DD *//SYSIN DD *,DLM=text///*///*

// مهمة AHAR ( 'أليكس هاريس' ) // تنفيذ ASMLG // SYSIN DD * APROG START  XR 15,15  BR 14  END /* //* نهاية المهمة

العبارة هي المكافئ الوظيفي لعبارة " يشير إلى أن تدفق البيانات يتبع، وينتهي بـ" .//SYSIN DD *<</*/*

مضرب

تبدأ سلاسل Racket هنا بـ متبوعة بأحرف تحدد#<< نهاية السلسلة. [ 14 ] يشمل محتوى السلسلة جميع الأحرف بين #<<السطر وسطر آخر لا يحتوي إلا على نهاية السلسلة المحددة. بتعبير أدق، يبدأ محتوى السلسلة بعد سطر جديد يلي #<<، وينتهي قبل سطر جديد يليه نهاية السلسلة.

# ضجيج_لغة( displayln #<<HERESTRING هذا نص بسيط مضمن في لغة Racket.  * واحد  * اثنان  * ثلاثة HERESTRING )

المخرجات:

هذا مثال بسيط على سلسلة "هنا" في لعبة راكيت.  * واحد  * اثنان  * ثلاثة

لا يتم التعرف على أي تسلسلات هروب بين سطري البداية والنهاية؛ يتم تضمين جميع الأحرف في السلسلة (والنهاية) حرفيًا.

# ضجيج_لغة( displayln #<<A here string in Racket ☺ يمتد هذا النص على عدة أسطر ويمكن أن يحتوي على أي رمز من رموز Unicode. لذا فإن رموزًا مثل λ و ☠ و α و β كلها مقبولة.يأتي في السطر التالي رمز الإنهاء. يمكن أن يحتوي على أي رمز من رموز يونيكود، حتى المسافات والوجوه الضاحكة! (سلسلة نصية هنا في راكيت ☺ )

المخرجات:

يمتد هذا النص على عدة أسطر ويمكن أن يحتوي على أي رمز من رموز يونيكود. لذا فإن رموزًا مثل λ و ☠ و α و β كلها مقبولة.يأتي في السطر التالي رمز الإنهاء. ويمكن أن يحتوي على أي رمز من رموز يونيكود، حتى المسافات والوجوه الضاحكة!

هنا يمكن استخدام السلاسل النصية بشكل طبيعي في السياقات التي تُستخدم فيها السلاسل النصية العادية:

# ضجيج_لغة( printf #<<END عزيزي ~a,شكراً على هذه المحادثة القيّمة ~أ.نهاية "إسحاق" "أمس" "كارل" )

المخرجات:

عزيزي إسحاق،شكراً على الحوار القيّم الذي دار بالأمس. كارل

يُعد استخدام امتداد اللغة at-expلكتابة تعابير @ بديلاً مثيراً للاهتمام. [ 15 ] تبدو هذه التعابير كالتالي:

#lang at-expracket (displayln @string-append{ هذا نص طويل، مريح للغاية عندما يكون نص طويل هو ضروري. لا داعي للقلق بشأن الهروب علامات الاقتباس أو علامات الهروب. لا بأس أيضاً بوجود λ، γ، θ، ... كود التضمين: })@(number->string(+34))

المخرجات:

هذا نص طويل، وهو مفيد للغاية عند الحاجة إلى جزء طويل من النص .لا داعي للقلق بشأن استخدام علامات الاقتباس أو علامات الهروب. لا بأس أيضاً باستخدام λ، γ، θ، ...رمز التضمين: 7

إن التعبير @ ليس خاصًا ولا يقتصر على السلاسل النصية، بل هو شكل من أشكال بناء الجملة يمكن تركيبه مع بقية اللغة.

ويندوز باور شيل

في PowerShell ، تُسمى المستندات هنا بسلاسل نصية مضمنة . السلسلة النصية المضمنة هي سلسلة تبدأ بفاصل مفتوح ( @"أو @') وتنتهي بفاصل مغلق ( "@أو '@) في سطر منفصل، مما يُنهي السلسلة. تُعتبر جميع الأحرف بين الفاصل المفتوح والمغلق جزءًا من السلسلة النصية. استخدام علامات اقتباس مزدوجة في السلسلة النصية المضمنة يسمح بتفسير المتغيرات ، بينما لا يسمح استخدام علامات اقتباس مفردة بذلك. يحدث استيفاء المتغيرات مع المتغيرات البسيطة (مثل ``` $x، ولكن ليس ``` $x.yأو `` $x[0]`). يمكنك تنفيذ مجموعة من التعليمات البرمجية بوضعها في $()``` (مثل `` $($x.y)` أو `` $(Get-Process | Out-String)`).

ConvertTo-UpperCaseفي كود PowerShell التالي، يتم تمرير نص إلى دالة باستخدام سلسلة نصية مضمنة. تم تعريف الدالة على النحو التالي:

PS > function ConvertTo-UpperCase ( $string ) { $string . ToUpper () } PS > ConvertTo-UpperCase @ ' >> one two three >> eins zwei drei >> '@ ONE TWO THREE EINS ZWEI DREI

فيما يلي مثال يوضح عملية استيفاء المتغيرات وتنفيذ العبارات باستخدام سلسلة نصية مضمنة بعلامات اقتباس مزدوجة:

PS > $doc , $marty = 'Dr. Emmett Brown' , 'Marty McFly' PS > $time = [DateTime] 'Friday, October 25, 1985 8:00:00 AM' PS > $diff = New-TimeSpan -Minutes 25 PS > @" >> $doc : هل هذه ساعاتي التي أسمعها؟ >> $marty : أجل! إنها الساعة $($time.Hour) بالضبط! >> $doc : ممتاز! لقد نجحت تجربتي! جميعها متأخرة بمقدار $($diff.Minutes) دقيقة بالضبط. >> $marty : انتظر لحظة. انتظر لحظة. دكتور... هل تقول لي إنها $(($time + $diff).ToShortTimeString())؟ >> $doc : بالضبط. >> $marty : اللعنة! لقد تأخرت عن المدرسة! >> "@ Dr. Emmett Brown : هل هذه ساعاتي التي أسمعها؟ Marty McFly : أجل! آه، إنها الساعة الثامنة! د. إيميت براون: ممتاز! نجحت تجربتي! جميعهم متأخرون 25 دقيقة بالضبط. مارتي مكفلاي: لحظة. لحظة. دكتور... هل تقول لي إنها 8:25؟ د. إيميت براون: بالضبط. مارتي مكفلاي: اللعنة! لقد تأخرت عن المدرسة!

باستخدام سلسلة نصية مضمنة بعلامات اقتباس مفردة بدلاً من ذلك، سيبدو الناتج كالتالي:

ملاحظة > @ ' >> $doc: هل هذه ساعاتي التي أسمعها؟ >> $marty: أجل! إنها الساعة $($time.Hour)! >> $doc: ممتاز! نجحت تجربتي! جميعها متأخرة بمقدار $($diff.Minutes) دقيقة بالضبط. >> $marty: لحظة. لحظة. دكتور... هل تقول لي إنها $(($time + $diff).ToShortTimeString())؟ >> $doc: بالضبط. >> $marty: اللعنة! لقد تأخرت عن المدرسة! >> '@ $doc: هل هذه ساعاتي التي أسمعها؟ $marty: أجل! إنها الساعة $($time.Hour)! $doc: ممتاز! نجحت تجربتي! جميعها متأخرة بمقدار $($diff.Minutes) دقيقة بالضبط. $marty: لحظة. لحظة. دكتور... هل تقول لي إنها $(($time + $diff).ToShortTimeString())؟ $doc: بالضبط. $marty: اللعنة! لقد تأخرت عن المدرسة!

لغة الأوامر الرقمية (DCL)

في نصوص DCL ، يُعامل أي سطر إدخال لا يبدأ برمز $ ضمنيًا كمدخل للأمر السابق - جميع الأسطر التي لا تبدأ بـ $ هي مستندات مضمنة. يتم تمرير الإدخال إما إلى البرنامج، أو يمكن الإشارة إليه صراحةً بالاسم المنطقي SYS$INPUT (على غرار مفهوم stdin في أنظمة Unix ).

على سبيل المثال، الإشارة صراحةً إلى المدخلات على أنها SYS$INPUT:

$ TYPE SYS $INPUT سيتم عرض هذا النص مباشرةً على الشاشة بواسطة الأمر TYPE. $ ! أوامر أخرى ... 

ينتج:

سيتم عرض هذا النص مباشرة على الشاشة بواسطة أمر الكتابة (TYPE).

بالإضافة إلى ذلك، يمكن استخدام الأمر DECK، الذي صُمم في الأصل لدعم البطاقات المثقبة (ومن هنا جاء اسمه: إذ كان يشير إلى بداية مجموعة بيانات )، لتوفير مدخلات للأمر السابق. [ 16 ] تُنهى مجموعة المدخلات إما بالأمر $ EOD، أو بنمط الأحرف المحدد بواسطة المعامل /DOLLARS للأمر DECK.

مثال على برنامج لحساب القيم النقدية:

قم بتشغيل ADD_SUMS.EXE سطح السفينة $ 13.53 دولارًا 3.33 دولار 2.33 دولار يوم نهاية اليوم 

سينتج عن ذلك المخرجات التالية (بافتراض أن الدالة ADD_SUMS قد كُتبت لقراءة القيم وجمعها):

19.19 دولارًا

مثال على استخدام الأمر DECK /DOLLARS لإنشاء ملف أوامر من ملف آخر:

$ COPY SYS $INPUT SYS $SCRATCH :TEMP.COM $ DECK /DOLLARS = $$$$ $ TYPE SYS $INPUT هذا مثال على استخدام DECK لإنشاء ملف أوامر من داخل ملف أوامر $ $$ $ $ ! أوامر أخرى تتبع ... 

YAML

يعتمد YAML بشكل أساسي على المسافة البادئة للمسافات البيضاء من أجل البنية، مما يجعله مقاومًا لتضارب المحددات وقادرًا على تمثيل السلاسل متعددة الأسطر باستخدام السلاسل النصية المطوية:

--- caption : "مثال على وظائف نمط heredoc باستخدام YAML" date : "2007-06-01" example : > يتم تحويل HTML إلى YAML بدون تعديل message : |<blockquote style="font: italic 12pt Times"> <p>"ثلاثة أكبر من اثنين دائمًا، حتى بالنسبة للقيم الكبيرة للاثنين"</p > <p>--مؤلف مجهول</p> </blockquote>

انظر أيضاً

مراجع

  1. 1 2 "وصف المستند هنا في معيار POSIX/SUS" . مؤرشف من الأصل بتاريخ 27-04-2014 . تم الاطلاع عليه بتاريخ 20-04-2018 .
  2. واين بولوك. "نظرة عامة على مستند Shell Here" . hccfl.edu. مؤرشف من الأصل بتاريخ 29-05-2014 . تم الاطلاع عليه بتاريخ 28-05-2014 .
  3. 3.6.6 مستندات هنا
  4. انظر على سبيل المثال استخدام المتغيرات داخل مستند Bash heredoc
  5. "صفحة دليل Darwin tcsh" . مؤرشفة من الأصل بتاريخ 2019-07-01 . تم الاطلاع عليها بتاريخ 2018-04-20 .
  6. "perldata: Special Literals" . مؤرشف من الأصل بتاريخ 23-12-2017 . تم الاطلاع عليه بتاريخ 31-08-2013 .
  7. روبي: البيانات المضمنة:
  8. "عوامل بيرل والأسبقية" . مؤرشف من الأصل بتاريخ 17-07-2012 . تم الاطلاع عليه بتاريخ 22-05-2010 .
  9. "Perl5260delta - ما الجديد في بيرل الإصدار 5.26.0 - متصفح بيرلدوك" . مؤرشف من الأصل بتاريخ 13 مايو 2024. تم الاطلاع عليه بتاريخ 21 ديسمبر 2018 .
  10. "دليل استخدام Heredoc في PHP" . php.net . تم الاطلاع عليه بتاريخ 2011-04-06 .{{cite web}}: CS1 maint: deprecated archiveal service ( link )
  11. "PHP: Strings - Manual" . php.net . مؤرشف من الأصل بتاريخ 2012-07-03 . تم الاطلاع عليه بتاريخ 2011-09-07 .
  12. "JEP 378: كتل النصوص" . openjdk.org . تم الاطلاع عليه بتاريخ 2024-06-05 .
  13. "كتل نصية (JEP 378) - javaalmanac.io" . javaalmanac.io . تم ​​الاطلاع عليه بتاريخ 2024-06-05 .
  14. "هنا سلسلة نصية في وثائق Racket" . مؤرشف من الأصل بتاريخ 2011-09-03 . تم الاطلاع عليه بتاريخ 2011-09-17 .
  15. "@ Syntax in Racket Documentation" . مؤرشف من الأصل بتاريخ 22-01-2012 . تم الاطلاع عليه بتاريخ 17-09-2011 .
  16. "قاموس أوامر HP OpenVMS DCL" . مؤرشف من الأصل بتاريخ 2016-03-04 . تم الاطلاع عليه بتاريخ 2015-04-21 .

ملحوظات

  1. بتفصيلٍ أكبر، في Bash: "تخضع جميع أسطر المستند المُضمّن لتوسيع المعاملات، واستبدال الأوامر، والتوسيع الحسابي. في الحالة الأخيرة، يتم تجاهل تسلسل الأحرف \newline، ويجب استخدام '\' لاقتباس الأحرف '\' و'$' و'`'." [ 3 ] لاحظ أن"ليس لها معنى خاص في المستند المُضمّن ولا تحتاج إلى علامة هروب، على عكس السلسلة النصية المُحاطة بعلامات اقتباس مزدوجة؛ وإلا فهي متطابقة أساسًا.
  2. يشمل "الاقتباس" الهروب، لذا إذا\EOFتم استخدام `، فسيتم وضع علامة اقتباس حوله، وبالتالي لن يحدث استيفاء للمتغيرات، وينتهي بـ `EOF، بينما إذا\\EOFتم استخدام `، فسيتم وضع علامة اقتباس حوله وينتهي بـ `\EOF. مع ذلك، يمكن تنفيذ هذا السلوك، الذي قد يبدو مفاجئًا، بسهولة في سطر الأوامر، حيث يقوم محلل الرموز ببساطة بتسجيل أن الرمز المميز قد تم اقتباسه (أثناء مرحلة تقييم التحليل المعجمي )، دون الحاجة إلى الاحتفاظ بالقيمة الأصلية المقتبسة. أحد التطبيقات هو استخدام\'` كفاصل بداية، وبالتالي'كفاصل نهاية، وهو ما يشبه سلسلة نصية متعددة الأسطر ولكن مع إزالة فواصل الأسطر في البداية والنهاية.
  3. لاحظ أنه على الرغم من إمكانية إدخال علامات الجدولة عادةً في المحررات، إلا أنه في سطر الأوامر يتم إدخالها عادةً بواسطةCtrl + V+Tab ↹ بدلاً من ذلك، وذلك بسبب ميزة الإكمال التلقائي لعلامات الجدولة ، وفي المثال هي علامات جدولة فعلية، لذلك يمكن نسخ المثال ولصقه.

عام

  • مستند هنا . رابط لمهمة Rosetta Code مع أمثلة على مستندات هنا بأكثر من 15 لغة.