STANDARDNÍ
VSTUP A VÝSTUP
 
 

 

Rexx je na AS/400. Ptal jsem se některých našich lidí od čtyřstovky, když jsme se vraceli žlutou cihlovou cestou s Doroty a jejím mizerným čoklem, a oni o něm nikdy neslyšeli. Stiskl jsem F4 a rozhlížel se kolem a našel jsem interpret Rexxu, ale nakonec jsem si řekl, že bůh mě chtěl mít u FTP souborů, abych se zajímal jen o unixový mašiny a hrál si jenom s nimi.
PATRICK TJ MCPHEE: mail Re: AS/400 v comp.lang.rexx 5. 2. 1999

Příkazem parse linein můžeme číst z jediného souboru STDIN a příkazem say zapisovat do jediného souboru STDOUT. Oba soubory musí být určeny před jejich prvním použitím, jednou jen a pak už ne. Omezení? Ukážu vám první možnost, jak je překonat.

Programy v jazyce Rexx se vždy interpretují. Mohou být spuštěny buď v interaktivním prostředí (tak tomu bylo v předcházejícím příkladě) nebo v dávkovém prostředí. Interpretovaný program má přístup ke dvěma souborům pro standardní vstupní a výstupní operace. Standardním souborem pro vstup je STDIN; standardním souborem pro výstup je STDOUT. Je tu ještě jeden výstupní soubor, totiž STDERR, který používá interpret k zápisu chybových hlášení a informací o průběhu výpočtu vyžádaných příkazem trace. Příkaz parse linein čte ze souboru STDIN a příkaz say zapisuje do souboru STDOUT.

Implicitně se v interaktivním režimu považuje za STDIN klávesnice a za STDOUT displej. V dávkovém režimu se implicitně považuje za STDIN soubor se jménem QINLINE a za STDOUT spoolový soubor QPRINT.

Implicitní nasměrování souborů STDIN a STDOUT můžete změnit pomocí CL povelů začínajících OVR..., ale tyto povely musí být vydány před prvním použitím souboru STDIN nebo souboru STDOUT a v průběhu programu už nasměrování nelze znovu změnit. Možná si teď říkáte Chudáček Rexx, co to s ním v té čtyřstovce udělali ....

Ukážu vám, jak se mohou snadno spojit silné prostředky jazyka Rexx a AS/400 pro extrémně snadné řešení jinak nijak jednoduché úlohy.

Naším cílem bude napsat program, který v zadaném textu (předložen na vstupu jako první člen souboru INFO v knihovně MYLIB) určí, kolikrát se v něm to které slovo vyskytlo. Pojmem slovo tu rozumím posloupnost znaků neobsahující mezeru, jak je v Rexxu obvyklé. Řešení ukazuje následující program KOLIKRAT:

/* KOLIKRAT */
Citac = 0
'RTVMBRD FILE(MYLIB/INFO) MBR(*FIRST) NBRCURRCD(&CITAC)'
'OVRDBF FILE(STDIN) TOFILE(MYLIB/INFO)'

Kolikrat. = 0; Ruzne = ""
do Citac
  parse linein Veta
  do J = 1 to WORDS(Veta)
    Slovo = WORD(Veta, J)
    if Kolikrat.Slovo = 0 then Ruzne = Ruzne Slovo
    Kolikrat.Slovo = Kolikrat.Slovo + 1
  end
end
do J = 1 to WORDS(Ruzne)
  Slovo = WORD(Ruzne, J); say Kolikrat.Slovo Slovo
end

Program ukazuje využití asociativního pole a CL povelů. RTVMBRD (Retrieve Member Description) povel vrací v proměnné Citac počet vět vstupního souboru. Této proměnné se říká pseudo-CL proměnná. Její jméno musí začínat znakem &. OVRDBF (Override with Data Base File) povel přesměrovává STDIN k souboru INFO v knihovně MYLIB. V interaktivním prostředí uvidíme výsledek na displeji. Pokud by měl být zapsán na papíře, máme dvě možnosti. Můžeme přidat k textu programu povel 'OVRPRTF FILE(STDOUT) TOFILE(QSYSPRT)' nebo povelem SBMJOB (Submit Job) předat interpretaci programu do dávkového prostředí:

SBMJOB CMD(STRREXPRC SRCMBR(KOLIKRAT) SRCFILE(MYLIB/QREXSRC))

Aby mohl být program KOLIKRAT opravdu užitečný, musí být výsledek utříděn. Jak to udělat co nejjednodušeji? Využívej systémových prostředků radí Jon Bentley v knize Programming Pearls. V systému OS/400 je nejjednodušším řešením zapsat výsledek do souboru a tento soubor pak jednoduše utřídit předem připraveným dotazem (tzv. query v terminologii AS/400) s výstupem na displej. Query/400 je generátor výstupních sestav z databázových souborů. Je jednoduchý a snadno se jej naučíte používat. Vytvoření a použití query vám opět ukážu krok za krokem.

Krok 1.

Nejprve pomocí povelu systému

CRTPF MYLIB/OUTPUT RCDLEN(80)

vytvoříme soubor OUTPUT. Budeme předpokládat, že v něm budou zapsány dvojice hodnot počet výskytů slova a slovo samo oddělené mezerou. Teď sestavíme potřebné query na tento soubor. Napište WRKQRY na povelovou řádku a stiskněte Enter. Formulář, který se objeví na obrazovce, vyplňte, jak je ukázáno na dalším obrázku a stiskněte Enter.


                               Work with Queries 
Type choices, press Enter.
  Option  . . . . . .    1              1=Create, 2=Change, 3=                                         5=Display, 6=Print def                                         8=Run in batch, 9=Run   Query . . . . . . .    SLOVA          Name, F4 for list     Library . . . . .      MYLIB        Name, *LIBL, F4 for li

Krok 2.

Stiskněte Enter v obrazovce Define the Query s implicitní hodnotou 1 (tj. Select) v poli volby u kolonky Specify file selections. V následující obrazovce Specify File Selection napište jméno souboru (OUTPUT) a jméno knihovny (MYLIB). Stiskněte Enter.


                           Specify File Selections 
Type choices, press Enter.  Press F9 to specify an additional   file selection.
  File . . . . . . . . .   OUTPUT         Name, F4 for      Library  . . . . . .     MYLIB        Name, *LIBL, F4 for   Member . . . . . . . .   *FIRST         Name, *FIRST, F4 for   Format . . . . . . . .   *FIRST         Name, *FIRST, F4 for

Vrátíte se k Define the Query obrazovce. Napište 1 do pole volby u kolonky Select sort fields. Teď se dostáváme k vlastnímu třídění. Na této obrazovce (vidíte ji dole) zvolíte pole, které bude tříděno, prioritu třídění v sloupci Sort Prty (důležité, obsahuje-li soubor více polí). A to, co nás nejvíce zajímá, způsob třídění: vzestupně (ascending), sestupně (descending). Do sloupce A/D zapište volbu D.


                           Select Sort Fields 
Type sort priority (0-999) and A (Ascending) or D (Descendin   the names of up to 32 fields, press Enter.
Sort
Prty A/D Field         Text

 1    D  OUTPUT                                                

Potvrďte klávesou Enter. Zase se vrátíte k obrazovce Define the Query. Teď stiskněte F3 pro ukončení. V následující obrazovce Exit this Query přesuňte kurzor na pole volby Run a napište 3 (Do not run). Stiskněte Enter - query je uloženo. Klávesou F3 opustíte prostředí Work with Queries.

Step 3

Změňte program KOLIKRAT tak, aby dvojice hodnot počet výskytů a slovo byly uloženy do souboru OUTPUT. Protože výsledek bude tříděn podle počtu výskytů, použijte příkaz:

say FORMAT(Kolikrat.Slovo, 5) Slovo

Přidejte k programu KOLIKRAT provedení query SLOVA a na samém začátku vymažte momentální obsah souboru OUTPUT povelem CLRPFM FILE(MYLIB/OUTPUT).

/* KOLIKRAT */
'CLRPFM FILE(MYLIB/OUTPUT)'
'OVRDBF FILE(STDOUT) TOFILE(MYLIB/OUTPUT)'
Citac = 0
'RTVMBRD FILE(MYLIB/INFO) MBR(*FIRST) NBRCURRCD(&CITAC)'
'OVRDBF FILE(STDIN) TOFILE(MYLIB/INFO)'

Kolikrat. = 0; Ruzne = ""
do Citac
  parse linein Veta
  do J = 1 to WORDS(Veta)
    Slovo = WORD(Veta, J)
    if Kolikrat.Slovo = 0 then Ruzne = Ruzne Slovo
    Kolikrat.Slovo = Kolikrat.Slovo + 1
  end
end
do J = 1 to WORDS(Ruzne)
  Slovo = WORD(Ruzne, J)
  say FORMAT(Kolikrat.Slovo, 5) Slovo
end
'RUNQRY QRY(MYLIB/SLOVA)'

V definici query můžete snadno přesměrovat výstup (na displej, do souboru, do spoolu). Vidíte? Výstup z programu byl už přesměrován do souboru OUTPUT povelem 'OVRDBF FILE(STDOUT) ...' a přece výsledek vystupuje na displeji!


                                Display Report
Query . . . :   MYLIB/SLOVA                  Report width . . . Position to line  . . . . .              Shift to column  . . . Line   ....+....1....+....2....+....3....+....4....+....5....+.        OUTPUT
000001
    66 .
000002    10 *
000003     7 :
000004     2 1


 [Jak napsat a spustit program]

 [Standardní vstup a výstup]

 [Externí datová fronta]

 [SQL povely]


hlavní stránka english
změněno 26. duben 2002
Copyright © 1998-2002 Vladimír Zábrodský