pp(PAR)在哪里解压缩(-a)文件?

这是我试图通过提出的“为什么我的系统调用在我用PP包装的Perl程序中工作”这个无关的问题? 我在linux系统上创build了一个简单的Perl脚本:

new-net:~/scripts # cat ls_test.pl @ls_out = `ls -l`; map { print "$_\n" } @ls_out; $out = `sh out_test.sh`; print "$out\n"; 

这个脚本调用一个简单的shell文件:

 new-net:~/scripts # cat out_test.sh echo "I'm here" 

我用pp将Perl脚本和shell脚本一起打包到ls_test中:

 new-net:〜/ test#unzip -l ls_test
存档:ls_test
  长度date时间名称
  -------- ---- ---- ----
         0 07-13-09 16:41脚本/
       436 07-13-09 16:41 MANIFEST
       214 07-13-09 16:41 META.yml
        93 07-13-09 16:41 script / ls_test.pl
       538 07-13-09 16:41 script / main.pl
        16 07-13-09 16:20 out_test.sh
  -------- -------
      1297 6个文件

如果我在其他空目录中运行打包文件,则找不到shell脚本:

 new-net:〜/ test#./ls_test
总计3391

 -rwxr-xr-x 1 root root 3466177 Jul 13 16:41 ls_test

 sh:out_test.sh:没有这样的文件或目录

如果我将shell脚本复制到目录中,则按预期方式运行压缩脚本:

 new-net:〜/ test#./ls_test 
总计3395 -rwxr-xr-x 1 root root 3466177 Jul 13 16:41 ls_test -rw-r - r-- 1 root root 16 Jul 13 16:20 out_test.sh 我在这

那么, pp打包脚本在哪里可以find一个包含的文件呢? 如何在原来的Perl脚本中configuration对包含文件的调用?

Solutions Collecting From Web of "pp(PAR)在哪里解压缩(-a)文件?"

打包的可执行文件被提取到一个临时目录(通常是/ tmp / par-USERNAME / cache-XXXXXXX)。 要访问这些文件,请执行以下操作:

 #!/usr/bin/perl # Reads a data file from the archive (added with -a) print PAR::read_file("data"); # Will execute "script2" in the archive and exit. Will not return to this script. require PAR; PAR->import( { file => $0, run => 'script2' } ); 

您还可以制作与您要运行的脚本具有相同名称的可执行文件的同步链接,然后运行这些链接。

其实,重读你的问题,只需访问PAR_TEMP环境变量可能更有用:

 #!/usr/bin/perl use File::Slurp qw(slurp); $data_dir = "$ENV{PAR_TEMP}/inc"; $script_dir = "$data_dir/script"; print slurp("$data_dir/datafile"); # file access permissions are not preserved as far as I can tell, # so you'll have to invoke the interpreter explicitly. system 'perl', "$script_dir/script2", @args; 

感谢大家为这个答案做出贡献。 我添加了这个答案来提炼出每个人的宝贵意见的部分,我曾经提出了在我的特定应用程序中为我工作的解决方案。

该应用程序是使用POE和Tk在ActiveState Perl中编写的,并使用pp进行打包分发。它使用多个外部文件; 一些用于输入到程序(来自DNS的通用数据),一些用于用户采取的行动(创建和删除DNS别名记录)。

PAR包装器(pp)包含使用-a参数的外部文件。 这些文件在软件包创建的“temp”路径下解压到\ inc目录下,并可通过脚本使用

 $ENV{PAR_TEMP} 

解决方案的第一步是将这些信息添加到POE“$ heap”中。 下面的行处于内联状态“_start”;

 $heap->{t_path} = "$ENV{PAR_TEMP}\\inc\\"; 

当我在Win32环境中工作时,我使用转义的反斜杠将\ inc目录附加到临时路径中。

当调用外部文件输入到应用程序时,我使用了一个变量(@zone)来返回数据;

 @zone = `$heap->{t_path}dnscmd aus-dc1 /enumrecords company.pvt @`; 

对于调用来完成外部操作,调用文件时不保存输出;

 `$heap->{t_path}cpau -dec -file $heap->{t_path}del_event.job -nowarn -wait`; 

再次感谢大家的贡献,并感谢提供这个伟大的环境的计算器。

这是在我的系统上工作的东西:

 C:\ tmp> cat build.bat
 @echo关闭
 mkdir输出
调用pp -o runner.exe runner.pl -a sayhello.bat
移动runner.exe输出\ runner.exe
  C:\ tmp> cat sayhello.bat
 @echo我在说你好...

 C:\tmp> cat runner.pl #!/usr/bin/perl use strict; use warnings; use File::Spec::Functions qw( catfile ); my $prog_path = catfile $ENV{PAR_TEMP}, inc => 'sayhello.bat'; my $output = `$prog_path`; print "The output was: >>> $output <<< "; __END__ 

输出:

 C:\tmp\output> runner.exe The output was: >>> I am saying hello ... <<< 

虽然这感觉有点肮脏。