On Mon, 2006-11-06 at 14:26 +0100, Roderich Schupp wrote:
> On 11/6/06, Peter Gordon <[EMAIL PROTECTED]> wrote:
> > >  has Scalar/Util.pm (and also Scalar/Util.so or Scalar/Util.dll) been 
> > > packaged,
> > >   run "unzip -l your_executable" to check
> > # unzip -l app_diag.exe | grep Util
> > 56:     2050  11-06-06 08:21   lib/List/Util.pm
> > 61:     3572  11-06-06 08:21   lib/Scalar/Util.pm
> > 117:        0  11-06-06 08:21   lib/auto/List/Util/Util.bs
> > 118:    32871  08-29-06 12:49   lib/auto/List/Util/Util.dll
> > 119:      789  08-29-06 12:49   lib/auto/List/Util/Util.exp
> 
> OK, they are in the zip part (but stale copies might also be in the
> "embedded" stuff
> of the executable). Could you run the attached script on app_diag.exe and
> check whether the extracted Util.* stuff matches your installed stuff
> (pm's might have comments/pod stripped, that's normal).

I did the extract and and I ran unzip. Even the dlls have different
sizes.

perl /tmp/extract-embedded.pl app_diag.exe /tmp/extract  
find . -name 'Ut*' -ls
9732524    4 drwxr-xr-x   2 root     root         4096 Nov  7 08:16 
./auto/List/Util
9732525   32 -rw-r--r--   1 root     root        28746 Nov  7 08:16 
./auto/List/Util/Util.dll
9732472    4 -rw-r--r--   1 root     root          596 Nov  7 08:16 
./List/Util.pm
9732474    4 -rw-r--r--   1 root     root          909 Nov  7 08:16 
./Scalar/Util.pm

unzip -l app_diag.exe | grep Util
     2050  11-06-06 08:50   lib/List/Util.pm
     3572  11-06-06 08:50   lib/Scalar/Util.pm
        0  08-29-06 12:49   lib/auto/List/Util/Util.bs
    32871  08-29-06 12:49   lib/auto/List/Util/Util.dll
      789  08-29-06 12:49   lib/auto/List/Util/Util.exp

================================================================
This is List/Util.pm as extracted with extract-embedded.pl


more /tmp/extract/List/Util.pm

#line 1 "D:/cpanrun/build/5-8-0/lib/List/Util.pm"
# List::Util.pm
#
# Copyright (c) 1997-2001 Graham Barr <[EMAIL PROTECTED]>. All rights
reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.

package List::Util;

require Exporter;
require DynaLoader;

our @ISA       = qw(Exporter DynaLoader);
our @EXPORT_OK = qw(first min max minstr maxstr reduce sum shuffle);
our $VERSION   = "1.07_00";
our $XS_VERSION = $VERSION;
$VERSION = eval $VERSION;

bootstrap List::Util $XS_VERSION;

1;

__END__

====================================================================

And this is List/Util.pm from the unzip.

mkdir /tmp/localtest
unzip /mnt1/utils/Utils/Diagnostics/app_diag.exe
cd /tmp/localtest/lib/List
more Util.pm

#line 1 "List/Util.pm"
# List::Util.pm
#
# Copyright (c) 1997-2005 Graham Barr <[EMAIL PROTECTED]>. All rights
reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.

package List::Util;

use strict;
use vars qw(@ISA @EXPORT_OK $VERSION $XS_VERSION $TESTING_PERL_ONLY);
require Exporter;

@ISA        = qw(Exporter);
@EXPORT_OK  = qw(first min max minstr maxstr reduce sum shuffle);
$VERSION    = "1.18";
$XS_VERSION = $VERSION;
$VERSION    = eval $VERSION;

eval {
  # PERL_DL_NONLAZY must be false, or any errors in loading will just
  # cause the perl code to be tested
  local $ENV{PERL_DL_NONLAZY} = 0 if $ENV{PERL_DL_NONLAZY};
  eval {
    require XSLoader;
    XSLoader::load('List::Util', $XS_VERSION);
    1;
  } or do {
    require DynaLoader;
    local @ISA = qw(DynaLoader);
    bootstrap List::Util $XS_VERSION;
  };
} unless $TESTING_PERL_ONLY;


# This code is only compiled if the XS did not load
# of for perl < 5.6.0

if (!defined &reduce) {
eval <<'ESQ'

sub reduce (&@) {
  my $code = shift;
  no strict 'refs';

  return shift unless @_ > 1;

  use vars qw($a $b);

  my $caller = caller;
  local(*{$caller."::a"}) = \my $a;
  local(*{$caller."::b"}) = \my $b;

  $a = shift;
  foreach (@_) {
    $b = $_;
   $a = &{$code}();
  }

  $a;
}

sub first (&@) {
  my $code = shift;

  foreach (@_) {
    return $_ if &{$code}();
  }

  undef;
}

ESQ
}

# This code is only compiled if the XS did not load
eval <<'ESQ' if !defined &sum;

use vars qw($a $b);

sub sum (@) { reduce { $a + $b } @_ }

sub min (@) { reduce { $a < $b ? $a : $b } @_ }

sub max (@) { reduce { $a > $b ? $a : $b } @_ }

sub minstr (@) { reduce { $a lt $b ? $a : $b } @_ }

sub maxstr (@) { reduce { $a gt $b ? $a : $b } @_ }

sub shuffle (@) {
  my @a=\(@_);
  my $n;
  my [EMAIL PROTECTED];
  map {
    $n = rand($i--);
    (${$a[$n]}, $a[$n] = $a[$i])[0];
  } @_;
}

ESQ

1;

__END__


=======================================================================

At this point either I have made a mistake and/or am thoroughly
confused.
=======================================================================




> > > - did you build PAR yourself (esp. on Windows) on the computer where you
> > >   did the pp'ing?
> > Yes
> 
> ... and with the version of perl and Scalar::Util that is now installed?
> 

> > There is an odd thing that I noticed in Archive::Tar.pm, which may
> > provide a clue to what is happening.
> >
> > BEGIN {
> >     use Config;
> >     $HAS_PERLIO = $Config::Config{useperlio};
> >
> >     ### try and load IO::String anyway, so you can dynamically
> >     ### switch between perlio and IO::String
> >     eval {
> >         require IO::String;
> >         import IO::String;
> >     };
> >     $HAS_IO_STRING = $@ ? 0 : 1;
> 
> Shouldn't be a problem.
> 
> > > > 1. Besides adding lots of print statements, is it possible to debug a pp
> > > > package?
> > >
> > > Sorry, no, because you can't pass the "-d" switch down to the packaged
> > > version of perl.
> > >
> > If I unpack the files, is it then possible to use -d somehow?
> 
> Again no, because it is using a custom-built perl interpreter that does not
> obey the -d switch (and has no other way to enable debug mode):
> 
> > I also have another problem: I run external programs using backticks and
> > pack without using the --gui flag. When the user double clicks on the
> > file name a dos box shows. With the --gui flag, no dos box shows, but on
> > the other hand, every time I run the backticks, a dos box starts up and
> > closes down, which appears as a flashing dos box to the user. This does
> > not happen without pp.
> 
> I know that one, but see no easy fix.
> 
> What happens is this:
> - programs started with backticks need to run in
>   a "DOS box", otherwise Windows won't endow them with stdin/stdut/stderr
> - the perl runtime knows about this and will start the program in a DOS box
>   if itself isn't runing in one already
> - so without --gui, you already got one, no need to create any for backticks
>   (but of course the users sees the initial DOS box)
> 
> You could try what happens for system() (don't remember). If  system() doesn't
> flash a DOS box with --gui, you could replace the backticks by using
> IPC::Run3 (that allows you to catch stdout/stderr into a string, but way more
> flexible as backticks), because it uses system() internally.
> 
> If system() doesn't work, maybe some advanced use of Win32::Process and/or
> Win32::Console might to the trick?
> 
> Cheers, Roderich

Reply via email to