存档:Tar:can';t读取之前在Perl中创建的tar

存档:Tar:can';t读取之前在Perl中创建的tar,perl,tar,archive-tar,Perl,Tar,Archive Tar,我正在尝试读取刚创建的文件(a.txt)的内容。这个文件包含一个由“ABCDE”组成的字符串,然后我使用write()函数将其tar。我可以看到“a.tar”是在我的目录中创建的,但是当我使用read()函数时,我在testtar.pl第14行得到了一个错误:不能读取a.tar 我做错什么了吗?是因为我在Windows上吗 use strict; use warnings; use Archive::Tar; # $Archive::Tar::DO_NOT_USE_PREFIX = 1; my

我正在尝试读取刚创建的文件(a.txt)的内容。这个文件包含一个由“ABCDE”组成的字符串,然后我使用write()函数将其tar。我可以看到“a.tar”是在我的目录中创建的,但是当我使用read()函数时,我在testtar.pl第14行得到了一个错误:不能读取a.tar

我做错什么了吗?是因为我在Windows上吗

use strict;
use warnings;
use Archive::Tar;
# $Archive::Tar::DO_NOT_USE_PREFIX = 1;

my $tari = Archive::Tar->new();
$tari->add_files("a.txt");
$tari->write("a.tar");

my $file = "a.tar";

my $tar = Archive::Tar->new() or die "Can't create a tar object : $!";
if(my $error = $tar->read($file)) {
    die "Can't read $file : $!";
}

my @files = $tar->get_files();
for my $file_obj(@files) {
my $fh = $file_obj->get_content();
binmode($fh);
my $fileName = $file_obj->full_path();
my $date = $file_obj->mtime();
print $fh;
}

谢谢。

您误解了
读取的返回值:

$tar->read($filename |$handle,[$compressed,{opt=>'val'}])

返回标量上下文中读取的文件数,以及列表上下文中的
Archive::Tar::File
对象列表

请更改以下内容

if(my $error = $tar->read($file)) {
    die "Can't read $file : $!";
}


然后重试。

您误解了以下内容的
读取的返回值:

$tar->read($filename |$handle,[$compressed,{opt=>'val'}])

返回标量上下文中读取的文件数,以及列表上下文中的
Archive::Tar::File
对象列表

请更改以下内容

if(my $error = $tar->read($file)) {
    die "Can't read $file : $!";
}

然后重试。

这是错误的:

my $fh = $file_obj->get_content();
binmode($fh);
get_content()提供文件的内容,而不是文件句柄。binmode()需要一个文件句柄。还有,你可以用!定义而不是除非(我认为它更容易阅读)

改写如下:

#!/bin/env perl
use strict;
use warnings;
use Archive::Tar;

my $tari = Archive::Tar->new();
$tari->add_files("a.txt");
$tari->add_files("b.txt");
$tari->add_files("c.txt");
$tari->add_files("d.txt");
$tari->write("a.tar");

my $file = "a.tar";

my $tar = Archive::Tar->new() or die "Can't create a tar object : $!";
if(!defined($tar->read($file)))
{
    die "Can't read $file : $!";
}

my @files = $tar->get_files();
for my $file_obj(@files)
{
    my $fileContents = $file_obj->get_content();
    my $fileName = $file_obj->full_path();
    my $date = $file_obj->mtime();
    print "Filename: $fileName Datestamp: $date\n";
    print "File contents: $fileContents";
    print "-------------------\n";
}
这是错误的:

my $fh = $file_obj->get_content();
binmode($fh);
get_content()提供文件的内容,而不是文件句柄。binmode()需要一个文件句柄。还有,你可以用!定义而不是除非(我认为它更容易阅读)

改写如下:

#!/bin/env perl
use strict;
use warnings;
use Archive::Tar;

my $tari = Archive::Tar->new();
$tari->add_files("a.txt");
$tari->add_files("b.txt");
$tari->add_files("c.txt");
$tari->add_files("d.txt");
$tari->write("a.tar");

my $file = "a.tar";

my $tar = Archive::Tar->new() or die "Can't create a tar object : $!";
if(!defined($tar->read($file)))
{
    die "Can't read $file : $!";
}

my @files = $tar->get_files();
for my $file_obj(@files)
{
    my $fileContents = $file_obj->get_content();
    my $fileName = $file_obj->full_path();
    my $date = $file_obj->mtime();
    print "Filename: $fileName Datestamp: $date\n";
    print "File contents: $fileContents";
    print "-------------------\n";
}

好的,现在它正在和你的修正一起工作。你能解释一下为什么我的不正确吗?是因为read正在“读取”一个文件并计算为true,因此进入die语句吗?@Hawknight
read
返回1表示
a.tar
中有一个文件,您使用该返回值作为条件,它将被
if
语句解释为true,以便
die
将运行。好,我现在明白了。我将方法从Archive::Zip复制/粘贴到Archive::Tar,有些方法的工作方式不同。谢谢你的回答!好的,现在它正在和你的修正一起工作。你能解释一下为什么我的不正确吗?是因为read正在“读取”一个文件并计算为true,因此进入die语句吗?@Hawknight
read
返回1表示
a.tar
中有一个文件,您使用该返回值作为条件,它将被
if
语句解释为true,以便
die
将运行。好,我现在明白了。我将方法从Archive::Zip复制/粘贴到Archive::Tar,有些方法的工作方式不同。谢谢你的回答!谢谢你的建议!不管怎样,如果我保留binmode,我会收到一条警告信息:)我必须承认它更容易阅读!定义比除非,好的洞察力谢谢你的建议!不管怎样,如果我保留binmode,我会收到一条警告信息:)我必须承认它更容易阅读!定义比除非,良好的洞察力