سؤال

لديّ بعض كود Perl (لتحليل الأداء) تم تطويره لأول مرة بموجب Linux والذي يحتاج الآن إلى نقله إلى المركزية. من الواضح أن Rexx هي لغة البرمجة النصية المفضلة على هذا النظام الأساسي ولكن هذا البرنامج النصي Perl يعتمد بشكل كبير على المصفوفات الترابطية (في الأساس صفائف حيث يكون الفهرس سلسلة).

هل هناك طريقة في Rexx؟ كيف يمكنني ترميز شيء مثل:

$arr{"Pax"} = "Diablo";
$arr{"Bob"} = "Dylan";
print $arr{"Pax"} . "\n";
if (defined $arr{"no"}) {
        print "Yes\n";
} else {
        print "No\n";
}
هل كانت مفيدة؟

المحلول

يمكنك استخدام متغيرات STEM ، ليس تمامًا مثل المصفوفات ولكنها متشابهة جدًا

/* REXX */
NAME = PAX
ARRAY.NAME = "DIABLO"
NAME = BOB
ARRAY.NAME = "DYLAN"
NAME = 'PAX'
SAY "ARRAY.PAX " IS ARRAY.NAME
NAME = 'BOB'
SAY "ARRAY.BOB " IS ARRAY.NAME
NAME = 'SANDY'
SAY "ARRAY.SANDY " IS ARRAY.NAME
IF ARRAY.NAME = "ARRAY.SANDY" THEN SAY "ARRAY.SANDY IS EMPTY"

سوف يطبع rexx أعلاه

ARRAY.PAX  IS DIABLO
ARRAY.BOB  IS DYLAN
ARRAY.SANDY  IS ARRAY.SANDY
ARRAY.SANDY IS EMPTY

يمكن أن تكون أيضًا مركبًا مثل ABC متغير ساق إذا كان فارغًا سيعود نفسه. لا توجد طريقة لتكرار ساق لا يستخدم أرقامًا متتالية كفهرس أعرفه.

دليل IBM مع الإشارة إلى متغيرات STEM

Perl متاح كميزة مجانية إضافية ل ZOS أدوات نقل IBM لـ Z/OS

نصائح أخرى

أريد فقط إضافة المزيد إلى الإجابة التي قدمها ديويان. وأنا أتفق ، REXX متغيرات الجذعية هي الجواب.

متغيرات REXX البسيطة الافتراضية لاسمها. فمثلا:

/* REXX */
SAY X

سوف طباعة "x" حتى X تم تعيينه بعض القيمة الأخرى:

/* REXX */
X = 'A'
SAY X

سوف تطبع "أ".

لا مفاجأة كبيرة حتى الآن. متغيرات الجذعية مختلفة بعض الشيء. لم يتم تقييم رأس الجذع أبدًا ، فقط بعد النقطة الأولية.

لتوضيح:

/* REXX */                                                           
X. = 'empty'   /* all unassigned stem values take on this value */
A. = 'nil'
B = 'A'        /* simple variable B is assigned value A */                                                      
X = 'A'        /* simple variable X is assigned value A */                                                      
SAY X.A        /* prints: empty */                                 
X.A = 'hello'  /* Stem X. associates value of A with 'hello' */
SAY X.A        /* prints: hello */                                   
SAY X.B        /* prints: hello */                                   
SAY X.X        /* prints: hello */                                   

لاحظ ال X و ال A لا يتم تقييم أسماء الجذعية ، ومع ذلك ،X و A المتغيرات التي تظهر بعدها. يجد بعض الناس هذا مربكًا بعض الشيء - فكر في الأمر لفترة من الوقت وهو أمر منطقي.

لا يوفر إصدار Z/OS من REXX طريقة طبيعية للتكرار عبر متغير ساق. أسهل طريقة للقيام بذلك هي بناء الفهرس الخاص بك. فمثلا:

/* REXX */
X. = ''
DO I = 1 TO 10
  J = RANDOM(100, 500) /* Random # 100..500 */
  X.INDEX = X.INDEX J  /* concatinate J's with 1 space between */
  X.J = 'was picked'   /* Associate 'was picked' with whatever J evalauates to */
  END

DO I = 1 TO WORDS(X.INDEX) /* Number of blank delimited 'words' */
  J = WORD(X.INDEX, I)     /* Extract 1 'word' at a time */
  SAY J X.J                /* Print 'word' and its associated value */
  END

تافهة جميلة ولكن يوضح الفكرة. فقط تأكد من ذلك INDEX (أو أي اسم تختاره) للاحتفاظ بأسماء الفهرسة لا تظهر أبدًا كقيمة نقاطية! إذا كان هذا احتمالًا ، فاستخدم بعض المتغيرات الأخرى للاحتفاظ بالفهرس.

النقطة الأخيرة. لاحظ كل من الأمثلة الخاصة بي تبدأ بـ /* REXX */ قد تجد أن هذا يجب أن يكون السطر الأول من برامج REXX الخاصة بك تحت Z/OS.

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