Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

insert codes dynamically

0 views
Skip to first unread message

Rose

unread,
Mar 5, 2008, 10:37:11 PM3/5/08
to
I have to add objects dynamically in a code and therefore the number of
objects are not known beforehand. How to achieve this effectly in a simple
way? e.g.

#fixed codes

$panel = Panel->new(
-length => 1000,
-width => 10,
);

#dynamic codes

my $obj1 = Object::Generic->new(
-start => 10,
-end => 10,
-display_name => 'C'
);

my $obj2 = Object::Generic->new(
-start => 88,
-end => 89,
-display_name => 'T'
);

...

my $objn = Object::Generic->new(
-start => p,
-end => q,
-display_name => 'N'
);

$panel->add_obj($obj1);
$panel->add_obj($obj2);
...
$panel->add_obj($objn);


Frank Seitz

unread,
Mar 5, 2008, 11:18:56 PM3/5/08
to
Rose wrote:
> I have to add objects dynamically in a code and therefore the number of
> objects are not known beforehand. How to achieve this effectly in a simple
> way? e.g.

my $panel = Panel->new(...);

my @arr = ([10,10,'C'],[88,89,'T'],...);
for my $e (@arr) {
my $obj = Object::Generic->new(
-start=>$e->[0],
-end=>$e->[1],
-display_name=>$e->[2],
);
$panel->add_obj($obj);
}

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

Rose

unread,
Mar 6, 2008, 12:16:58 AM3/6/08
to

"Frank Seitz" <devnu...@web.de> wrote in message
news:6399lhF...@mid.individual.net...

Frank, Thanks a lot for your response. Indeed, @arr is not known beforehand
and the content of @arr is generated by another perlscript. How would you
recommend to bridge these 2 perlscripts? The first one, I store the 10, 88,
...; 10, 89, ...; and C, T, ... into separate arrays, say @a1, @a2, @a3. A
simple but dirty way is to copy the contents of the 1st file to the 2nd and
then @arr = (@a1, @a2, @a3), but this does not look to be a good practice.


Frank Seitz

unread,
Mar 6, 2008, 12:43:25 AM3/6/08
to
Rose wrote:
>
> Frank, Thanks a lot for your response. Indeed, @arr is not known beforehand
> and the content of @arr is generated by another perlscript. How would you
> recommend to bridge these 2 perlscripts? The first one, I store the 10, 88,
> ...; 10, 89, ...; and C, T, ... into separate arrays, say @a1, @a2, @a3.
> A simple but dirty way is to copy the contents of the 1st file to the 2nd and
> then @arr = (@a1, @a2, @a3), but this does not look to be a good practice.

To copy @a1, @a2, @a3 this way would not work.
Copying is not necessary. Try this:

for (my $i = 0; $i < @a1; $i++) {


my $obj = Object::Generic->new(

-start=>$a1[$i],
-end=>$a2[$i],
-display_name=>$a3[$i],

Rose

unread,
Mar 6, 2008, 3:19:34 AM3/6/08
to
"Frank Seitz" <devnu...@web.de> wrote in message
news:639ejuF...@mid.individual.net...

But can I use a for loop to achieve the following effect? I guess I can't
simply code:
$panel->add_track([@obj],
-label => 1,
);

$panel->add_track([$obj1,$obj2,$obj3, ..., $objn],
-label => 1,
);

Frank Seitz

unread,
Mar 6, 2008, 4:12:01 AM3/6/08
to
Rose wrote:
>
> But can I use a for loop to achieve the following effect? I guess I can't
> simply code:
> $panel->add_track([@obj],
> -label => 1,
> );
>
> $panel->add_track([$obj1,$obj2,$obj3, ..., $objn],
> -label => 1,
> );

Can't tell. What expects add_track() as second parameter?
(first parameter is the ref to the panel-Object)

Rose

unread,
Mar 6, 2008, 4:39:09 AM3/6/08
to

"Frank Seitz" <devnu...@web.de> wrote in message
news:639qr2F...@mid.individual.net...

It can accept a number of objects $obj1,$obj2, ..., $objn in square
brackets. the problem is that "n" is unknown beforehand, and therefore can't
be hard-coded. I know that in Matlab a function called repmat may help...


Frank Seitz

unread,
Mar 6, 2008, 4:44:15 AM3/6/08
to
Rose wrote:
>
> It can accept a number of objects $obj1,$obj2, ..., $objn in square
> brackets.

$panel->add_track(\@obj,...);

Ben Morrow

unread,
Mar 6, 2008, 4:59:07 AM3/6/08
to
[please don't quote signatures]

Quoth "Rose" <ro...@russ.org>:


> "Frank Seitz" <devnu...@web.de> wrote in message
> news:639qr2F...@mid.individual.net...
> > Rose wrote:
> >>
> >> But can I use a for loop to achieve the following effect? I guess I can't
> >> simply code:
> >> $panel->add_track([@obj],
> >> -label => 1,
> >> );
> >>
> >> $panel->add_track([$obj1,$obj2,$obj3, ..., $objn],
> >> -label => 1,
> >> );
> >
> > Can't tell. What expects add_track() as second parameter?
> > (first parameter is the ref to the panel-Object)
>

> It can accept a number of objects $obj1,$obj2, ..., $objn in square
> brackets. the problem is that "n" is unknown beforehand, and therefore can't
> be hard-coded. I know that in Matlab a function called repmat may help...

If you have an array

@obj = (1, 2, 3, 4);

then the expression

[1, 2, 3, 4]

is exactly equivalent to

[@obj]

. This is generally true: whenever you have a series of comma-separated
items in list context, you can insert an array into the list and it will
be interpolated. The exception is the argument lists of functions like
'push' which have prototypes and so treat literal arrays specially.

Under many circumstances, it would be better to use

\@obj

as this doesn't make a copy of the array. You can do this if you know
the function you are calling doesn't modify the passed-in array (or if
you don't care if it trashes @obj).

Note that @obj is *not* equivalent to

$obj1, $obj2, $obj3, ...

if you were thinking that; $obj[1] is not the same as $obj1. If those
variables weren't just an example, they should have been in an array to
start with.

I would suggest you read perldoc perldsc and perldoc perlreftut.

Ben

ccc31807

unread,
Mar 6, 2008, 8:30:36 AM3/6/08
to
On Mar 6, 12:16 am, "Rose" <r...@russ.org> wrote:
> "Frank Seitz" <devnull4...@web.de> wrote in message

In the first script, write the array to a text file, values space
separated with each list on a new line, like this:
20 30 A
40 50 B
60 70 C
... etc

In the second script, read in the file line by line and recreate the
data structure possibly as an array composed of array references.

I assume that you can read and write to a text file in your directory,
and that you will overwrite the same file each day so you can use
static file names.

CC

Ben Morrow

unread,
Mar 6, 2008, 10:27:42 AM3/6/08
to

Quoth "Rose" <ro...@russ.org>:

>
> Frank, Thanks a lot for your response. Indeed, @arr is not known beforehand
> and the content of @arr is generated by another perlscript. How would you
> recommend to bridge these 2 perlscripts?

Do they need to be separate scripts? Are they run at different times? If
you are using separate scripts simply as a way of putting the code in
separate files, you may want to use modules instead.

The easy and straightforward way to pass data from Perl to Perl is the
use the Storable module, which is core as of 5.8. In the first script
you say

use Storable qw/store/;

store \@arr, 'file' or die "store failed";

and then in the second

use Storable qw/retrieve/;

my $aref = retrieve 'file' or die "retrieve failed";

If you want the data to be human-readable, or readable from another
language, you could use YAML instead.

Ben

0 new messages