أبسط طريقة لعكس ترتيب السلاسل في متغير التكوين

StackOverflow https://stackoverflow.com/questions/52674

  •  09-06-2019
  •  | 
  •  

سؤال

لنفترض أن لديك متغيرًا في جزء ملف تعريف مثل ما يلي:

MY_LIST=a b c d

كيف يمكنني بعد ذلك عكس ترتيب تلك القائمة؟احتاج:

$(warning MY_LIST=${MY_LIST}) 

ليعرض

MY_LIST=d c b a

يحرر:المشكلة الحقيقية هي أن

ld -r some_object.o ${MY_LIST}

ينتج a.out برموز غير محددة لأن العناصر الموجودة فيها MY_LIST هي في الواقع أرشيفات، ولكن بالترتيب الخاطئ.إذا كان الأمر MY_LIST يتم عكس، فإنه سيتم ربط بشكل صحيح (على ما أظن).إذا كنت تعرف طريقة أكثر ذكاءً للحصول على ترتيب الارتباط بشكل صحيح، فأرشدني إليها.

هل كانت مفيدة؟

المحلول

الحل في GNU النقي يجعل:

تقصير:الجميع

foo = من فضلك عكسني

عكس = $ (إذا $ (1) ، $ (call reverse ، $ (Wordlist 2 ، $ (Words $ (1)) ، $ (1)))) $ (Firstword $ (1))

الجميع :@echo $(مكالمة عكسية,$(foo))

يعطي:

$ جعل

لي عكس من فضلك

نصائح أخرى

دوه!كان بإمكاني استخدام برنامج شل النصي:

(for d in ${MY_LIST}; do echo $$d; done) | tac

يمكنك أيضًا تحديد مجموعات البحث باستخدام ld:

ld -r foo.o -( a.a b.a c.a -)

سيتم التكرار من خلال a.a وb.a وc.a حتى لا يمكن تلبية أي رموز جديدة لم يتم حلها بواسطة أي كائن في المجموعة.

إذا كنت تستخدم gnu ld، فيمكنك أيضًا القيام بما يلي:

ld -r -o foo.o --whole-archive bar.a

وهو أقوى قليلاً، لأنه سيتضمن كل كائن من bar.a بغض النظر عما إذا كان يلبي رمزًا لم يتم حله من foo.o.

تحسين لحل GNU make:

عكس = $(إذا $(قائمة الكلمات 2,2,$(1)),$(استدعاء عكسي,$(قائمة الكلمات 2,$(الكلمات $(1)),$(1))) $(الكلمة الأولى $(1) ),$(1))

  • حالة إيقاف أفضل، يستخدم الأصل السلسلة الفارغة لإضاعة استدعاء دالة
  • لا يضيف مسافة بادئة إلى القائمة المعكوسة، على عكس القائمة الأصلية

اللعب على حد سواء بن كولينز و إلماركو الإجابات، إليك ركلة جزاء تتعامل مع المسافات البيضاء "بشكل صحيح"1

reverse = $(shell printf "%s\n" $(strip $1) | tac)

الذي يفعل الشيء الصحيح، وذلك بفضل $(shell) تنظيف المسافات البيضاء و printf تنسيق كل كلمة تلقائيًا في قائمة الوسائط الخاصة بها:

$(info [ $(call reverse,  one two   three four  ) ] )

عائدات:

[ four three two one ]

1... وفقًا لحالة الاختبار المحدودة الخاصة بي (على سبيل المثال، $(info ...) السطر أعلاه).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top