Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在perl中解压(检查此文件中的文件)_Perl - Fatal编程技术网

在perl中解压(检查此文件中的文件)

在perl中解压(检查此文件中的文件),perl,Perl,我试图用Perl提取一个ZIP文件。 在我的脚本中,我可以检测到一个ZIP文件,我可以选择这个.ZIP,但是之后呢 elsif ( $$file{'ccname'} =~ /(\.zip)$/x ) { # Extraction ZIP my $zip_path= 你能帮我吗 关于,此作业的工具是模块 及 以下是一个例子: use strict; use warnings; use Archive::Extract; my $extracto

我试图用Perl提取一个ZIP文件。 在我的脚本中,我可以检测到一个ZIP文件,我可以选择这个.ZIP,但是之后呢

    elsif ( $$file{'ccname'} =~ /(\.zip)$/x )
    {
        # Extraction ZIP
        my $zip_path=
你能帮我吗


关于,此作业的工具是模块

以下是一个例子:

use strict;
use warnings;

use Archive::Extract;

my $extractor = Archive::Extract->new( archive => 'yourZippedfileName.zip' );
$extractor.extract;     #extract the files to the current working directory

实际上我只是为我写的一个程序做这个。我使用了IO::Uncompress::Unzip,这是Perl中的一个标准模块。我花了一段时间才拼凑起来。对IO::Uncompress::Unzip的解释并不是最好的,它需要一些尝试和错误

以下是要点:

您必须在IO::Uncompress::Unzip中观察方法的退出状态。如果状态小于零,则说明存在问题。那样的话,就去死吧。 有一个外部循环,可以提取下一个流的名称。从这里,您可以获得流的名称,它将是您的文件和目录名。 获得名称后,必须构建名称的路径。例如,如果名称为foo/bar/barfu/foobar.txt,则需要确保foo/bar/barfu存在,以便可以写出foobar.txt 有一个内部while循环,用于从流的缓冲区读取数据并写入文件本身。这必须是一个循环,因为在读取整个流之前可能需要多次尝试。这是我花了一段时间才意识到的。 我使用IO::File,这不是必需的。我这样做是因为这个程序中的所有其他东西都是面向对象的,我认为是时候尝试一下用于文件读写的OO接口了。这只会增加混乱。像在标准Perl中一样,使用open和print或直接说。 我使用File::Spec将目录和文件名连接在一起。这是连接文件名和目录名的正式正确方法。毕竟,你不知道你是否必须在Vax或Mac Plus运行System 7上运行你的程序。如果您知道您只在Windows、Linux、Unix或Mac OS X上运行,那么您可以使用$directory/$file而不是file::Spec->join$directory,$file。如果你的老板因为你的脚本不能在他的PDP-11上运行而感到不安,那就别怪我。 以下是我的节目摘录:

#! /usr/bin/env perl

use strict;
use warnings;
use feature qw(say);

use File::Basename qw(basename dirname);
use File::Path qw(make_path remove_tree);
use File::Spec;
use File::Temp qw(tempfile tempdir);
use IO::File;
use IO::Uncompress::Unzip;


sub update_zip { 
    my $old_zip_file = shift;
    my $old_version  = shift;
    my $new_version  = shift;

    my $zip_directory_name = dirname $old_zip_file;
    my $zip_file_name = basename $old_zip_file;
    my $unzip_directory = tempdir(
        "$old_zip_file.XXXX",
        DIR => $zip_directory_name,
    );
    #
    # Unzip Artifact
    #
    my $zip_fh = IO::Uncompress::Unzip->new( $old_zip_file )
        or die qq(Cannot open zip "$old_zip_file" for reading.);
    #
    # Go through each element in Zip file
    #
    while ( my $status = $zip_fh->nextStream ) {
        if ( $status < 0 ) {
            die qq(Error in Zip: $IO::Uncompress::Unzip::UnzipError.);
        }
        my $element_name = $zip_fh->getHeaderInfo->{Name};
        next if $element_name =~ m{/$};      # Skip Directories
        my $element_dir = dirname $element_name;
        my $full_element_dir = File::Spec->join( $unzip_directory, $element_dir );
        my $full_element_name = File::Spec->join( $unzip_directory, $element_name );
        if ( not -d $full_element_dir ) {
            make_path $full_element_dir
                or die qq(Can't make directory "$full_element_dir".);
        }
        my $unzipped_fh = IO::File->new( $full_element_name, "w" )
            or die qq(Can't open file "$full_element_name" for writing: $!);
        my $buffer;
        while ( my $status = $zip_fh->read( $buffer ) ) {
            if ( $status < 0 ) {
                die qq(Error in Zip: $IO::Uncompress::Unzip::UnzipError.);
            }
            $unzipped_fh->write( $buffer );
        }
        $unzipped_fh->close;
    }
    $zip_fh->close;
}

使用外部命令执行-@kostiashian:为什么使用外部命令?@JE SUIS CHARLIE:为什么不?我们可以通过系统调用运行外部程序,如:my$res=system$7zpath、$arc\u file\u path、$directory\u path,并使用$res变量控制结果执行。@kostiashian:因为最好使用像Archive::Zip这样的模块。
use strict;
use warnings;

use Archive::Extract;

my $extractor = Archive::Extract->new( archive => 'yourZippedfileName.zip' );
$extractor.extract;     #extract the files to the current working directory
#! /usr/bin/env perl

use strict;
use warnings;
use feature qw(say);

use File::Basename qw(basename dirname);
use File::Path qw(make_path remove_tree);
use File::Spec;
use File::Temp qw(tempfile tempdir);
use IO::File;
use IO::Uncompress::Unzip;


sub update_zip { 
    my $old_zip_file = shift;
    my $old_version  = shift;
    my $new_version  = shift;

    my $zip_directory_name = dirname $old_zip_file;
    my $zip_file_name = basename $old_zip_file;
    my $unzip_directory = tempdir(
        "$old_zip_file.XXXX",
        DIR => $zip_directory_name,
    );
    #
    # Unzip Artifact
    #
    my $zip_fh = IO::Uncompress::Unzip->new( $old_zip_file )
        or die qq(Cannot open zip "$old_zip_file" for reading.);
    #
    # Go through each element in Zip file
    #
    while ( my $status = $zip_fh->nextStream ) {
        if ( $status < 0 ) {
            die qq(Error in Zip: $IO::Uncompress::Unzip::UnzipError.);
        }
        my $element_name = $zip_fh->getHeaderInfo->{Name};
        next if $element_name =~ m{/$};      # Skip Directories
        my $element_dir = dirname $element_name;
        my $full_element_dir = File::Spec->join( $unzip_directory, $element_dir );
        my $full_element_name = File::Spec->join( $unzip_directory, $element_name );
        if ( not -d $full_element_dir ) {
            make_path $full_element_dir
                or die qq(Can't make directory "$full_element_dir".);
        }
        my $unzipped_fh = IO::File->new( $full_element_name, "w" )
            or die qq(Can't open file "$full_element_name" for writing: $!);
        my $buffer;
        while ( my $status = $zip_fh->read( $buffer ) ) {
            if ( $status < 0 ) {
                die qq(Error in Zip: $IO::Uncompress::Unzip::UnzipError.);
            }
            $unzipped_fh->write( $buffer );
        }
        $unzipped_fh->close;
    }
    $zip_fh->close;
}