Reset an array at the end of the frill processing

Hi,

I have a question with the array resetting after the end of the frill processing.

Originally, I planned to use an array to store texts on each page for indexing. The result is perfect when composing only one page. Unfortunately, when composing more than a page (compose range(+)), the array on each page has changed. I wonder if this is caused by the variables from the next page moved to the previous page for pagination checking.

I have undef the array at the end of the frill processing but the issue still exists. Can anyone point me in the right direction?

Regards,

Terrence

  • Hi Terrence,

    Maybe other customers will know what you are asking about, but with the little that you have stated I have no idea what you are asking about.

    What "array" are you talking about?

    Jonathan Dagresta
    SDL XPP Engineering

  • Hi Terrence,

    Just like Jonathan I have trouble understanding exactly what you are asking.

    I guess that the 'array' you are talking about is a perl array? Correct?
    But you will have to give us a lot of more info before we can help you.
    Maybe some extracts of your code might help.
    Also a bit more explanation on what and how you put things into the array and how and where you read them back out.

    Regards

    Bart

  • Hi Jonathan & Bart,

    Thanks for your response. Let me rephrase the question.

    I have a division in which some pages contain tagged text <index>..</index> and I use an array (@index) to store all the captured text and print it to an index page.

    On page 1:
    %<index>Index 1</index>The following are the details ...

    On page 2:
    %We provide property developers, <index>Index 2</index>property owners and <index>Index 3</index>residents with a variety of property management services ...

    The result is perfect when composing only one page, i.e. @index on page 1 contains Index 1 whereas @index on page 2 contains Index 2 and Index 3. However, when composing Whole Division, @index on page 1 contains not only Index 1, but also Index 2 and Index 3. @index on page 2 also contains Index 2 and Index 3. Is there any solution to prevent this from happening?

    Regards,

    Terrence

  • Still insufficient information. You didn't provide any extracts of your Perl code nor provide any detailed explanations regarding the questions Bart asked about. How do you separate the "index" entries that are from different pages when they are being being written to the array (or is that your problem because you are not doing that)?

    I'm going to defer to Bart's Perl expertise.

  • Yes Terrence,

    Like Jonathan said already, we need to see actual code in order to help you.
    In theory there should be no problem with what you are trying to achieve.
    But the devil is sometimes in the detail.
    (like are you using 'our' or 'my' variables, how/when are you trying to empty the arrary, how do add entries onto the array, ...?)

  • I defined the <index>..</index> macros to call a xyPerl function with the 'i' mode flag set, because of the multiple occurrences of the <index> on the same page, and every occurrence has been pushed onto the array. During the frill processing, I shift each index item every time when it hit a line with an <index> and undef the @index at the end of the frill processing to make it ready for the next page.

    In order to pass the array to frill processing, I use 'our' for the array (@index), but use 'my' for the variable for each captured text from perl and undef the array at the end of the frill processing.

    Belows are extract of the codings and how it undef the array

    ##################
    $X -> open_db("first","main","stream");
    if(open_ok) {
       $X->open_db("first","main","block");
       if(open_ok) {
          $X->open_db("first","main","line");
       }
    }
    while(open_ok) {
       if(db("flag")) {
          my $temp = shift @index;
          # Do something
       }
       $X->open_db("next","main","line");
       if(!open_ok){
          $X->open_db("next","main","block");
       }
    } # end while
    undef @index;

    ###################

    Regards,
    Terrence

  • Terrence,

    Do the frills processing function and the function that you use to push index terms onto the @index live in the same package?
    Do you call both functions using the 'p' (persistent) flag?

    Can you try what happens when you explicitly empty the array:
    @index = (); 
    (instead of undef it)

  • Hi Bart,

    Yes, both functions are in the same package and 'p' flag is using when calling perl function.

    The result is the same when using @index = () instead of using undef. 

    Regards,

    Terrence

  • Terrence,

    I just went through the trouble to build my own test job to see if I can duplicate your problem.

    And I can't.
    Everything works without a problem on my system.

    I just entered some text on a page and added some <index>term1</index> (term2, term3,...) entries to it.
    I just push the index term onto the @index array.
    And in the frills I read out all the terms on the index array and then undef the array.

    No problem at all when composing 1 page or all pages or any combination.

    Here is the xyPerl:

    ------------------
    package xybase2;

    our @index;

    sub capture {
      local $/;
      my $term = <STDIN>;
      push @index, $term;
    }

    sub dump {
      my $X = XPPcompo->new();
     ....frills processing loop...
     while(open_ok) {
       if(db("flag")) {
          my $term = shift @index;
         $X->sz('12pt');
         $X->set_text($term);
         $X->qa();
       }
      ...rest of frills processing loop...
      undef @index;

    capture is called from the <index> tag in the main text
    dump is called from the frills block

    and this is the screenshot of page 2:

    note that the <index> will suppress the the text.
    The item4, 5.. are located in the frill block.

    As said before the devil must be in the detail.

    Maybe you need to dumb down your setup and start from something simple like my example.
    This will enable to convince you that what you are trying to do actually works and might help you in finding the error in your real job.

    PS: last question:
    Do you call the xyPerl using the 'm' option?
    If so do not forget to strip the surrounding tags before you output them in the frills block.

  • Let's back up a bit.

    I wonder if this is caused by the variables from the next page moved to the previous page for pagination checking.

    Now I'm wondering if fundamentally you're process is not accounting for how XPP composition works (as I now understand that you might have been asking about in your original post), in that (when there is sufficient text) composition first oversets the bottom of blocks (by some twenty or so lines) in order to determine where it is going to vertically break (to account for any keeps and/or widow/orphan rules and/or VJ squeeze rules).

    So, if there are any <index>...</index> occurrences within that "overset" text that then gets pushed to the next page then I can see that your saved array for a page might include index entries that end up on the next page.

    If that's what is happening, then you'll have to figure out a way to account for that.

    Jonathan Dagresta
    SDL XPP Engineering