require in zwei geschachtelten for-Schleifen, PerlMagick

require in zwei geschachtelten for-Schleifen, PerlMagick

am 25.10.2006 15:01:46 von guba

Hallo,

ich möchte von einem Batchprogramm Batch_TILE.PLX ein Unterprogramm
PMM_TILE.PLX in zwei geschachtelten for-Schleifen mehfach aufrufen.
(siehe die beiden nachfolgenden Scripte)
PMM_TILE.PLX soll aus jedem jp2 in einem Ordner mehrere zufällige
PMM-Tiles (eine zweidimensionale Symmetriegruppe) erzeugen (mit
PerlMagick).

Isoliert funktioniert dies, auch das einfache Aufrufen,
doch wenn ich die beiden Schleifen verwende, dann wird immer
nur eine Zieldatei erzeugt.

Wo liegt der/die Fehler?

Danke für Hinweise


Günter




*Batch_TILE.PLX*********************************
#Input
$pmm_number =3D '10'; #<100
$sourcefolder_path =3D 'C:/ART/IM_PlaneCovering/1_Sourceimages/';
$pmm_resultfolder_path =3D
'C:/ART/IM_PlaneCovering/2_Tiles/2_01_pmm-Tiles/';


#program
opendir(DIR, "$sourcefolder_path") || die "Verzeichnis nicht vorhanden:
$!"; #list of jp2s in sourcefolder_path
@sourcefolder_list =3D grep(/\.jp2$/, readdir(DIR));
$sourcefolder_number =3D @sourcefolder_list;

for ($k =3D 0; $k <=3D $sourcefolder_number; $k +=3D1) {

$sourcefile_name =3D $sourcefolder_list[$k];

for ($p =3D 1; $p <=3D $pmm_number; $p +=3D1) {require 'PMM_TILE.PLX'};

};


*PMM_TILE.PLX*********************************
use Image::Magick;


# 0) Input
# definition of lokal parameters
$rectangle_width_min_Faktor =3D 0.4;
$rectangle_width_max_Faktor =3D 0.6;
$rectangle_height_min_Faktor =3D 0.4;
$rectangle_height_max_Faktor =3D 0.6;



# 1) definition of PerlMagick objects
$pmm_G =3D new Image::Magick;

# 2) inilisation of random number generator
srand;

# 3) read source image
$sourcefile_fullname =3D $sourcefolder_path . $sourcefile_name;
$pmm_G->Read("$sourcefile_fullname");

# 4) local variable calculations: $rectangle_width, $rectangle_height,
$x1, $y1
$image_width =3D $pmm_G->Get('columns');
$image_height =3D $pmm_G->Get('rows');
if ($image_width < $image_height) {$image_min =3D $image_width} else
{$image_min =3D $image_height};
$rectangle_width_min =3D $rectangle_width_min_Faktor * $image_min;
$rectangle_width_max =3D $rectangle_width_max_Faktor * $image_min;
$rectangle_height_min =3D $rectangle_height_min_Faktor * $image_min;
$rectangle_height_max =3D $rectangle_height_max_Faktor * $image_min;
$rectangle_width =3D $rectangle_width_min +
(int(rand($rectangle_width_max - $rectangle_width_min)) +1);
$rectangle_height =3D $rectangle_height_min +
(int(rand($rectangle_height_max - $rectangle_height_min)) +1);
$x_allowed =3D $image_width - $rectangle_width;
$y_allowed =3D $image_height - $rectangle_height;
$x1 =3D int(rand($x_allowed))+1;
$y1 =3D int(rand($y_allowed))+1;

# 5) generate pmm_G by cropping the source image
$pmm_G->Crop(geometry =3D> "$rectangle_width x
$rectangle_hight+$x1+$y1");

# 6) convert pmm_G.png -flop pmm_G_flop.png
$pmm_G_flop =3D $pmm_G->Clone();
$pmm_G_flop->Flop();

# 7) convert pmm_G.png pmm_G_flop.png +append pmm_tile_row.png
$q =3D $pmm_G->Clone();
push(@$q, $pmm_G_flop);
$pmm_tile_row =3D $q->Append(stack=3D>'false');

# 8) convert pmm_tile_row.png -flip pmm_tile_row_flip.png
$pmm_tile_row_flip =3D $pmm_tile_row->Clone();
$pmm_tile_row_flip->Flip();

# 9) convert pmm_tile_row.png pmm_tile_row_flip.png -append
pmm_tile.png
@$q =3D ();
$q =3D $pmm_tile_row->Clone();
push(@$q, $pmm_tile_row_flip);
$pmm_tile =3D $q->Append(stack=3D>'true');

# 10) generate name of the result image
chop $sourcefile_name;
chop $sourcefile_name;
chop $sourcefile_name;
chop $sourcefile_name;

if ($p <=3D 9) {$resultimage_name =3D "pmm_tile_" . $sourcefile_name . "-0"
.. $p . ".jpg"}
else {$resultimage_name =3D "pmm_tile_" . $sourcefile_name . "-"
.. $p . ".jpg"};

$resultimagepath_name =3D $pmm_resultfolder_path . $resultimage_name;

# 11) save result image (pmm_tile)
$pmm_tile->Write(filename=3D>"$resultimagepath_name",
compression=3D>'JPEG', quality=3D>'95');

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 25.10.2006 17:34:09 von Christian Winter

guba@vi-anec.de schrieb:
> Hallo,
>
> ich möchte von einem Batchprogramm Batch_TILE.PLX ein Unterprogramm
> PMM_TILE.PLX in zwei geschachtelten for-Schleifen mehfach aufrufen.
> (siehe die beiden nachfolgenden Scripte)
[snipped]

Du willst nicht require() verwenden, sondern do().
Siehe "perldoc -f require":
....
Otherwise, demands that a library file be included if it hasn't
already been included.
....
Heisst also, dass die Datei nur genau einmal eingebunden wird.

Dagegen "perldoc -f do":
....
Uses the value of EXPR as a filename and executes the contents
of the file as a Perl script.
....

-Christian

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 27.10.2006 12:35:46 von guba

Hallo Christian,

vielen Dank für die Antwort; sie hat mich einen
Schritt weiter gebracht. Das Batchprogramm durchläuft
jetzt die äussere Schleife $k =3D 0; $k <=3D $sourcefolder_number
aber die innere $p =3D 1; $p <=3D $pmm_number; $p +=3D1
wird nur einmal mit $p =3D 1 durchlaufen.
Wo liegt hier der Fehler?

Vielen Dank für Hinweise,

Günter.







Christian Winter schrieb:

> guba@vi-anec.de schrieb:
> > Hallo,
> >
> > ich möchte von einem Batchprogramm Batch_TILE.PLX ein Unterprogramm
> > PMM_TILE.PLX in zwei geschachtelten for-Schleifen mehfach aufrufen.
> > (siehe die beiden nachfolgenden Scripte)
> [snipped]
>
> Du willst nicht require() verwenden, sondern do().
> Siehe "perldoc -f require":
> ...
> Otherwise, demands that a library file be included if it hasn't
> already been included.
> ...
> Heisst also, dass die Datei nur genau einmal eingebunden wird.
>
> Dagegen "perldoc -f do":
> ...
> Uses the value of EXPR as a filename and executes the contents
> of the file as a Perl script.
> ...
>=20
> -Christian

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 27.10.2006 15:59:40 von Ferry Bolhar

Günter:

> vielen Dank für die Antwort; sie hat mich einen
> Schritt weiter gebracht. Das Batchprogramm durchläuft
> jetzt die äussere Schleife $k = 0; $k <= $sourcefolder_number
> aber die innere $p = 1; $p <= $pmm_number; $p +=1
> wird nur einmal mit $p = 1 durchlaufen.

Welchen Wert hat $pmm_number zu diesem Zeitpunkt?
Welchen Wer hat $p nach dem Abarbeiten der Schleife?

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at






Christian Winter schrieb:

> guba@vi-anec.de schrieb:
> > Hallo,
> >
> > ich möchte von einem Batchprogramm Batch_TILE.PLX ein Unterprogramm
> > PMM_TILE.PLX in zwei geschachtelten for-Schleifen mehfach aufrufen.
> > (siehe die beiden nachfolgenden Scripte)
> [snipped]
>
> Du willst nicht require() verwenden, sondern do().
> Siehe "perldoc -f require":
> ...
> Otherwise, demands that a library file be included if it hasn't
> already been included.
> ...
> Heisst also, dass die Datei nur genau einmal eingebunden wird.
>
> Dagegen "perldoc -f do":
> ...
> Uses the value of EXPR as a filename and executes the contents
> of the file as a Perl script.
> ...
>
> -Christian

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 28.10.2006 11:06:10 von guba

Hallo,

$pmm_number ist ein konstanter Parameter, der
zu Beginn festgelegt wird (meist =3D 10). $p ist die
Zählvariable in der inneren Schleife die von 1 bis
$pmm_number durchzählt (für die Nummerierung
der einzelnen Bilder).

Günter



Ferry Bolhar schrieb:

> Günter:
>
> > vielen Dank für die Antwort; sie hat mich einen
> > Schritt weiter gebracht. Das Batchprogramm durchläuft
> > jetzt die äussere Schleife $k =3D 0; $k <=3D $sourcefolder_number
> > aber die innere $p =3D 1; $p <=3D $pmm_number; $p +=3D1
> > wird nur einmal mit $p =3D 1 durchlaufen.
>
> Welchen Wert hat $pmm_number zu diesem Zeitpunkt?
> Welchen Wer hat $p nach dem Abarbeiten der Schleife?
>
> LG, Ferry
>
> --
> Ing Ferry Bolhar
> Magistrat der Stadt Wien - MA 14
> A-1010 Wien
> E-Mail: bol@adv.magwien.gv.at
>
>
>
>
>
>
> Christian Winter schrieb:
>
> > guba@vi-anec.de schrieb:
> > > Hallo,
> > >
> > > ich möchte von einem Batchprogramm Batch_TILE.PLX ein Unterprogramm
> > > PMM_TILE.PLX in zwei geschachtelten for-Schleifen mehfach aufrufen.
> > > (siehe die beiden nachfolgenden Scripte)
> > [snipped]
> >
> > Du willst nicht require() verwenden, sondern do().
> > Siehe "perldoc -f require":
> > ...
> > Otherwise, demands that a library file be included if it hasn't
> > already been included.
> > ...
> > Heisst also, dass die Datei nur genau einmal eingebunden wird.
> >
> > Dagegen "perldoc -f do":
> > ...
> > Uses the value of EXPR as a filename and executes the contents
> > of the file as a Perl script.
> > ...
> >
> > -Christian

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 30.10.2006 09:57:51 von Ferry Bolhar

Günter:

> $pmm_number ist ein konstanter Parameter, der
> zu Beginn festgelegt wird (meist = 10). $p ist die
> Zählvariable in der inneren Schleife die von 1 bis
> $pmm_number durchzählt (für die Nummerierung
> der einzelnen Bilder).

Das ist mir nicht verborgen geblieben. Trotzdem wäre
es hilfreich, wenn du meine Fragen

> Welchen Wert hat $pmm_number zu diesem Zeitpunkt?
> Welchen Wer hat $p nach dem Abarbeiten der Schleife?

_exakt_ beantworten könntest.

Wenn Perl eine for-Schleife nicht so oft wie erwartet
abarbeitet, gibt es eigentlich nur zwei Möglichkeiten:

o) Anfangs- und/oder Endwert der Schleifenvariablen
stimmt nicht

o) Die Schleife wird aus einem anderen Grund abgebrochen.

Zweck meiner Frage war, den ersten Punkt ausschließen
zu können.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 30.10.2006 12:11:30 von guba

Hallo Ferry,

danke für die Antwort.


> Welchen Wert hat $pmm_number zu diesem Zeitpunkt?

als externer Parameter müsste $pmm_number zu jedem
Zeitpunkt den festgelegten Wert $pmm_number =3D '10';
besitzen. Ich sehe niergendwo eine Operation, die
$pmm_number im Wert verändern würde.


> Welchen Wer hat $p nach dem Abarbeiten der Schleife?

die innere Schleife wird genau einmal mit $p =3D 1
durchlaufen (es wird ein entsprechend nummeriertes Bild erzeugt).
Danach müsste durch $p +=3D1 der Wert von $p um 1
auf $p =3D 2 erhöht werden und die Anweisung {do 'PMM_TILE.PLX'}
wieder ausgeführt werden, was nicht geschieht.


Danke für Hinweise, Gruß
Günter






Ferry Bolhar schrieb:

> Günter:
>
> > $pmm_number ist ein konstanter Parameter, der
> > zu Beginn festgelegt wird (meist =3D 10). $p ist die
> > Zählvariable in der inneren Schleife die von 1 bis
> > $pmm_number durchzählt (für die Nummerierung
> > der einzelnen Bilder).
>
> Das ist mir nicht verborgen geblieben. Trotzdem wäre
> es hilfreich, wenn du meine Fragen
>
> > Welchen Wert hat $pmm_number zu diesem Zeitpunkt?
> > Welchen Wer hat $p nach dem Abarbeiten der Schleife?
>
> _exakt_ beantworten könntest.
>
> Wenn Perl eine for-Schleife nicht so oft wie erwartet
> abarbeitet, gibt es eigentlich nur zwei Möglichkeiten:
>
> o) Anfangs- und/oder Endwert der Schleifenvariablen
> stimmt nicht
>
> o) Die Schleife wird aus einem anderen Grund abgebrochen.
>
> Zweck meiner Frage war, den ersten Punkt ausschließen
> zu können.
>
> LG, Ferry
>
> --
> Ing Ferry Bolhar
> Magistrat der Stadt Wien - MA 14
> A-1010 Wien
> E-Mail: bol@adv.magwien.gv.at

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 31.10.2006 10:09:21 von guba

Hallo Ferry,

könnte es sein, dass das Unterprogramm etwas an
das Batchprogramm zurück liefert, was dieses dazu
veranlasst, die innere Schleife abzubrechen ohne das
dies Einfluß auf die äußere Schleife hat?
Das Letzte was im Unterprogramm alphanumerisch
bestimmt wird ist $resultimagepath_name, die
Kombination aus Verzeichnis und Name des
Ergebnisbildes.=20

Gruß
Günter

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 31.10.2006 11:15:29 von guba

Hallo Ferry,

entsprechend meinem letzten Posting habe ich versucht den "return"
von dem Unterprogramm zu beeinflussen z.B. mit return $p +=3D1;
alles ohne Erfolg, da die innere Schleife immer noch mit $p =3D 1
durchlaufen wird.

Habe auch alle Variablen im Unterprogramm probeweise mit
my lokalisiert; hilft auch nichts.=20

Günter

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 31.10.2006 17:21:11 von Ferry Bolhar

Günter:

> Habe auch alle Variablen im Unterprogramm probeweise mit
> my lokalisiert; hilft auch nichts.

OK. Mach bitte folgendes (in der Shell):

$ export PERLDB_OPTS="AutoTrace NonStop LineInfo=dbg.out"
$ perl -d

Das Programm läuft dann los und schreibt Trace-Info in die Datei
dbg.out. Den hiervon interessanten Teil (= innere Schleife deines
Codes) poste hier, dann sehen wir weiter.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 02.11.2006 19:28:16 von guba

Hallo Ferry,

> Mach bitte folgendes (in der Shell):

ich verwende Win/ActivePerl aus der Eingabeaufforderung.

Günter





Ferry Bolhar schrieb:

> Günter:
>
> > Habe auch alle Variablen im Unterprogramm probeweise mit
> > my lokalisiert; hilft auch nichts.
>
> OK. Mach bitte folgendes (in der Shell):
>
> $ export PERLDB_OPTS=3D"AutoTrace NonStop LineInfo=3Ddbg.out"
> $ perl -d
>
> Das Programm läuft dann los und schreibt Trace-Info in die Datei
> dbg.out. Den hiervon interessanten Teil (=3D innere Schleife deines
> Codes) poste hier, dann sehen wir weiter.
>
> LG, Ferry
>
> --
> Ing Ferry Bolhar
> Magistrat der Stadt Wien - MA 14
> A-1010 Wien
> E-Mail: bol@adv.magwien.gv.at

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 03.11.2006 10:18:51 von guba

Hallo Ferry,

ich habe die beiden Schleifen probeweise vertauscht

#Input
$pmm_number =3D 3; #<100
$sourcefolder_path =3D 'C:/ART/IM_PlaneCovering/1_Sourceimages/';
$pmm_resultfolder_path =3D
'C:/ART/IM_PlaneCovering/2_Tiles/2_01_pmm-Tiles/';

#program
opendir(DIR, "$sourcefolder_path") || die "folder not found: $!";
@sourcefolder_list =3D grep(/\.jp2$/, readdir(DIR));

for ($p =3D 1; $p <=3D $pmm_number; $p++) {
for ($k =3D 0; $k <=3D @sourcefolder_list; $k++) {
$sourcefile_name =3D $sourcefolder_list[$k];
do 'PMM_TILE.PLX'};

};

und jetzt hört der Erzeugungsprozess nicht mehr auf: Anstatt nach
$p=3D3 zu stoppen wird die innere Schleife anscheinend endlos
durchlaufen.

Günter











Ferry Bolhar schrieb:

> Günter:
>
> > Habe auch alle Variablen im Unterprogramm probeweise mit
> > my lokalisiert; hilft auch nichts.
>
> OK. Mach bitte folgendes (in der Shell):
>
> $ export PERLDB_OPTS=3D"AutoTrace NonStop LineInfo=3Ddbg.out"
> $ perl -d
>
> Das Programm läuft dann los und schreibt Trace-Info in die Datei
> dbg.out. Den hiervon interessanten Teil (=3D innere Schleife deines
> Codes) poste hier, dann sehen wir weiter.
>
> LG, Ferry
>
> --
> Ing Ferry Bolhar
> Magistrat der Stadt Wien - MA 14
> A-1010 Wien
> E-Mail: bol@adv.magwien.gv.at

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 03.11.2006 14:39:17 von Ferry Bolhar

Günter:

ich habe die beiden Schleifen probeweise vertauscht

for ($p = 1; $p <= $pmm_number; $p++) {
for ($k = 0; $k <= @sourcefolder_list; $k++) {
$sourcefile_name = $sourcefolder_list[$k];
do 'PMM_TILE.PLX'};
};

> und jetzt hört der Erzeugungsprozess nicht mehr auf:
> Anstatt nach $p=3 zu stoppen wird die innere Schleife
> anscheinend endlos durchlaufen.

Bau vor dem "do"-Befehl ein

print "p: $p, k: $k\n";

ein und schicke den Output.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 04.11.2006 10:11:23 von guba

Hallo Ferry,

mit $pmm_number =3D 3 und $sourcefolder_number =3D 3 liefert

...
for ($p =3D 1; $p <=3D $pmm_number; $p++) {
$sourcefile_name =3D $sourcefolder_list[$k];
for ($k =3D 0; $k <=3D $sourcefolder_number; $k++) {
print "p: $p, k: $k\n";
do 'PMM_TILE.PLX'};

die Liste:

p: 1, k: 0
p: 1, k: 1
p: 1, k: 2
p: 1, k: 3
p: 2, k: 0
p: 2, k: 1
p: 2, k: 2
p: 2, k: 3
p: 3, k: 0
p: 3, k: 1
p: 3, k: 2
p: 3, k: 3
p: 4, k: 0
p: 4, k: 1
p: 4, k: 2
p: 4, k: 3

... bis Abbruch


ein Bild wird für jeweils
p: $p, k: 1
p: $p, k: 2
p: $p, k: 3
aus den drei Elementen von @sourcefolder_list
gebildet. Mit p: $p, k=3D0 sollte das erste Element
aufgerufen der Liste werden; wird hier aber nicht
berücksichtigt!?

Grüße
Günter

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 04.11.2006 10:50:02 von Frank Seitz

guba@vi-anec.de wrote:

> mit $pmm_number = 3 und $sourcefolder_number = 3 liefert
>
> ...
> for ($p = 1; $p <= $pmm_number; $p++) {
> $sourcefile_name = $sourcefolder_list[$k];
> for ($k = 0; $k <= $sourcefolder_number; $k++) {
> print "p: $p, k: $k\n";
> do 'PMM_TILE.PLX'};
>
> die Liste:
>
> p: 1, k: 0
> p: 1, k: 1
> p: 1, k: 2
> p: 1, k: 3
> p: 2, k: 0
> p: 2, k: 1
> p: 2, k: 2
> p: 2, k: 3
> p: 3, k: 0
> p: 3, k: 1
> p: 3, k: 2
> p: 3, k: 3
> p: 4, k: 0
> p: 4, k: 1
> p: 4, k: 2
> p: 4, k: 3
>
> ... bis Abbruch
>
> ein Bild wird für jeweils
> p: $p, k: 1
> p: $p, k: 2
> p: $p, k: 3
> aus den drei Elementen von @sourcefolder_list
> gebildet. Mit p: $p, k=0 sollte das erste Element
> aufgerufen der Liste werden; wird hier aber nicht
> berücksichtigt!?

Dass Dein Programm nicht funktioniert liegt daran, dass
es eine einzige Katastrophe ist. Eine Fehleranalyse
ist folglich nicht möglich. Diese NG ist kein Debugging-Service.

Tipp: Beginne nochmal von vorne und setzte

use strict;
use warnings;

an den Anfang des Programms. Vergiss dieses verfehlte
Batchfile-Konzept, schreibe ein einzelnes Programm und
arbeite mit Subroutines und lokalen Variablen.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 04.11.2006 11:47:52 von guba

Hallo,

vielen Dank für diese Hilfe. Das bringt mich daher nicht weiter, da
das
aufgezeigte Batchprogramm nur ein Teil der Aufgabe ist: letztendlich
will ich eine Reihe von plane groups flexibel aufrufen :
for ($k =3D 0; $k <=3D @sourcefolder_list; $k++) {
$sourcefile_name =3D $sourcefolder_list[$k];
for ($p =3D 1; $p <=3D $pmm_number; $p++) {do 'PMM_TILE.PLX'};
for ($p =3D 1; $p <=3D $p4m_number; $p++) {do 'P4M_TILE.PLX'};
for ($p =3D 1; $p <=3D $p3m1_number; $p++) {do 'P3M1_TILE.PLX'};
....

Soll ich eine kombinatorische Anzahl von Einzel-Programmen
erzeugen die das machen (es gibt 17 plane groups)?? Ich glaube nicht!
Da muss es eine andere Lösung geben.

GB





Frank Seitz schrieb:

> guba@vi-anec.de wrote:
>
> > mit $pmm_number =3D 3 und $sourcefolder_number =3D 3 liefert
> >
> > ...
> > for ($p =3D 1; $p <=3D $pmm_number; $p++) {
> > $sourcefile_name =3D $sourcefolder_list[$k];
> > for ($k =3D 0; $k <=3D $sourcefolder_number; $k++) {
> > print "p: $p, k: $k\n";
> > do 'PMM_TILE.PLX'};
> >
> > die Liste:
> >
> > p: 1, k: 0
> > p: 1, k: 1
> > p: 1, k: 2
> > p: 1, k: 3
> > p: 2, k: 0
> > p: 2, k: 1
> > p: 2, k: 2
> > p: 2, k: 3
> > p: 3, k: 0
> > p: 3, k: 1
> > p: 3, k: 2
> > p: 3, k: 3
> > p: 4, k: 0
> > p: 4, k: 1
> > p: 4, k: 2
> > p: 4, k: 3
> >
> > ... bis Abbruch
> >
> > ein Bild wird für jeweils
> > p: $p, k: 1
> > p: $p, k: 2
> > p: $p, k: 3
> > aus den drei Elementen von @sourcefolder_list
> > gebildet. Mit p: $p, k=3D0 sollte das erste Element
> > aufgerufen der Liste werden; wird hier aber nicht
> > berücksichtigt!?
>
> Dass Dein Programm nicht funktioniert liegt daran, dass
> es eine einzige Katastrophe ist. Eine Fehleranalyse
> ist folglich nicht möglich. Diese NG ist kein Debugging-Service.
>
> Tipp: Beginne nochmal von vorne und setzte
>
> use strict;
> use warnings;
>
> an den Anfang des Programms. Vergiss dieses verfehlte
> Batchfile-Konzept, schreibe ein einzelnes Programm und
> arbeite mit Subroutines und lokalen Variablen.
>
> Grüße
> Frank
> --
> Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
> Anwendungen für Ihr Internet und Intranet
> Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 04.11.2006 12:05:02 von Frank Seitz

guba@vi-anec.de wrote:

> vielen Dank für diese Hilfe. Das bringt mich daher nicht weiter, da das
> aufgezeigte Batchprogramm nur ein Teil der Aufgabe ist: letztendlich
> will ich eine Reihe von plane groups flexibel aufrufen :
> for ($k = 0; $k <= @sourcefolder_list; $k++) {
> $sourcefile_name = $sourcefolder_list[$k];
> for ($p = 1; $p <= $pmm_number; $p++) {do 'PMM_TILE.PLX'};
> for ($p = 1; $p <= $p4m_number; $p++) {do 'P4M_TILE.PLX'};
> for ($p = 1; $p <= $p3m1_number; $p++) {do 'P3M1_TILE.PLX'};
^^^^^^^^^^^^^^^^^^
da gehören Subroutine-Aufrufe hin

> Soll ich eine kombinatorische Anzahl von Einzel-Programmen
> erzeugen die das machen (es gibt 17 plane groups)?? Ich glaube nicht!
> Da muss es eine andere Lösung geben.

Wenn Du denselben Code von mehreren Programmen aus nutzen willst,
packst Du diesen in eine .pm-Datei und lädst diese am
Anfang mit use.

Der Code wird vernünfig in Subroutines gekapselt.

Alle Dateien (Programme und .pm-Dateien) beginnen mit

use strict;
use warnings;

Wenn Du es so machst, hast Du eine vernünftige Basis.
Wie Du es aktuell machst, ist es Murks. Dass Du innerhalb
von eineinhalb Wochen nicht rausbekommen hast, warum eine
doppelt geschachtelte Schleife nicht wie erwartet funktioniert,
sagt doch schon alles.

Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 04.11.2006 12:58:04 von Olaf Schneider

guba@vi-anec.de wrote:

> ich möchte von einem Batchprogramm Batch_TILE.PLX ein Unterprogramm
> PMM_TILE.PLX in zwei geschachtelten for-Schleifen mehfach aufrufen.
> (siehe die beiden nachfolgenden Scripte)

Daß diese Pseudo-Unterprogramme keine gute Idee sind, schrieb ja
schon jemand. Unterprogramme in Perl werden mit sub definiert.

Was mir aber noch aufgefallen ist:

> Isoliert funktioniert dies, auch das einfache Aufrufen,
> doch wenn ich die beiden Schleifen verwende, dann wird immer
> nur eine Zieldatei erzeugt.

Du solltest Deine Schleifen auch mal ohne Aufruf des
"Unterprogramms" testen.

> *Batch_TILE.PLX*********************************
> $sourcefolder_path = 'C:/ART/IM_PlaneCovering/1_Sourceimages/';
> $pmm_resultfolder_path =
> 'C:/ART/IM_PlaneCovering/2_Tiles/2_01_pmm-Tiles/';

> $sourcefile_name = $sourcefolder_list[$k];

$sourcefolder_path und $sourcefile_name sind also in Batch_TILE.PLX
definiert. Dann wird PMM_TILE.PLX via do ausgewertet (ursprünglich
mit require, aber das ist ja noch merkwürdiger).

> *PMM_TILE.PLX*********************************

> $sourcefile_fullname = $sourcefolder_path . $sourcefile_name;

Spätestens hier solltest Du mit 'use strict' einen Fehler
bekommen, weil die Variablen $sourcefolder_path und
$sourcefile_name in PMM_TILE.PLX gar nicht definiert sind.

Die Doku zu do sagt:

do 'stat.pl';

is just like

eval `cat stat.pl`;

except that it's more efficient and concise, [...]
[...] It also differs in that
code evaluated with "do FILENAME" cannot see lexi-
cals in the enclosing scope; "eval STRING" does.

Im selben Absatz steht auch noch, daß die Verwendung von do FILE
in Schleifen ineffizient ist, da FILE jedemal neu geparsed wird.

Re: require in zwei geschachtelten for-Schleifen, PerlMagick

am 06.11.2006 09:42:10 von Ferry Bolhar

Günter:

> mit $pmm_number = 3 und $sourcefolder_number = 3 liefert
> ...
> for ($p = 1; $p <= $pmm_number; $p++) {
> $sourcefile_name = $sourcefolder_list[$k];
> for ($k = 0; $k <= $sourcefolder_number; $k++) {
> print "p: $p, k: $k\n";
> do 'PMM_TILE.PLX'};
>
> die Liste:
>
> p: 1, k: 0

[...]

> p: 4, k: 0
> p: 4, k: 1
> p: 4, k: 2
> p: 4, k: 3
>
> ... bis Abbruch


Ergänze in deinem Code die print-Anweisung zu

print "p: $p, k: $k, pmm_number: $pmm_number\n";

Behält $pmm_number seinen Anfangswert?

Franks Vorschlag möchte ich mich übrigens anschließen: bau
sowol in das Hauptprogramm als auch in den mit "do" aufgerufenen
Code ein

use warnings;
use strict;

zu Beginn ein.

Dass der Code vom Design her nicht besonders elegant ist, hat
dir Frank ja schon gesagt. Allerdings bin ich der Ansicht, dass
er trotzdem lauffähig sein müsste.

Noch etwas: hast du dich schon mal näher mit dem Perl-Debugger
beschäftigt? Falls nicht, solltest du das mal tun. Besonders der "w"-
Befehl könnte für dich interessant sein: er "überwacht" eine Variable
und gibt aus, wann und wie sie geändert wurde. Du könntest das
dazu verwenden, festzustellen, wo und wie in deinem Programm
$pmm_number geändert wird.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol@adv.magwien.gv.at