我试图一次读取一个40字节的二进制文件,然后检查所有这些字节是否为0x00,如果是,则忽略它们.如果没有,它会将它们写回另一个文件(基本上只是删除大块的空字节).
这可能不是最有效的方法,但我并不担心.但是,现在我收到了"错误的文件描述符"错误,我无法弄清楚原因.
my $comp = "\x00" * 40;
my $byte_count = 0;
my $infile = "/home/magicked/image1";
my $outfile = "/home/magicked/image1_short";
open IN, "<$infile";
open OUT, ">$outfile";
binmode IN;
binmode OUT;
my ($buf, $data, $n);
while (read (IN, $buf, 40)) { ### Problem is here ###
$boo = 1;
for ($i = 0; $i < 40; $i++) {
if ($comp[$i] != $buf[$i]) {
$i = 40;
print OUT $buf;
$byte_count += 40;
}
}
}
die "Problems! $!\n" if $!;
close …Run Code Online (Sandbox Code Playgroud) 来自SELECT_TUT:
"...用于有效地监视多个文件描述符,以查看它们中的任何一个是否已成为"准备好";也就是说,查看I/O是否成为可能,或者是否出现"异常情况"描述符....
那么select()有什么意义呢?我不能随时随地读写我的描述符吗?select()的意思是它同时监视多个描述符,并在没有活动时正确地将进程置于休眠状态.Unix程序员经常发现他们必须处理来自多个文件描述符的I/O,其中数据流可能是间歇性的.如果你只是创建一个read(2)和write(2)调用序列,你会发现你的一个调用可能会阻止等待来自/到文件描述符的数据,而另一个文件描述符虽然已经准备就绪但未被使用/ O.select()有效地应对了这种情况."
有人可以解释我,这意味着什么以及如何运作,也许只是一个小例子.
例如,这里只选择一个文件句柄,为什么我需要监控?
my $timeout = 10;
my ( $in, $out ) = ( '', '' );
vec( $in, fileno( STDIN ), 1 ) = 1;
select( $out = $in, undef, undef, $timeout );
Run Code Online (Sandbox Code Playgroud) 我是一名自学成才的Perler,寻求Perl专家的帮助:
我一直收到一个错误,说我不能在foreach循环中使用文件句柄,即使我确定close它(或者undef它,我已经尝试过).请在此处查看完整错误:http://cl.ly/image/2b2D1T403s14
该代码可在GitHub上获得:https://github.com/bsima/yeast-TRX
有问题的代码可以在第90行的"script.pl"文件中找到:
foreach my $species (keys %Saccharomyces) {
open(RAW,">./data/$species/$geneName/raw.csv");
print RAW "gene,dinucleotide,position,trx.score,energy.score\n";
undef RAW;
open(SMOOTH,">./data/$species/$geneName/smooth.csv");
print SMOOTH "gene,position,trx.score,energy.score\n";
undef SMOOTH;
}
Run Code Online (Sandbox Code Playgroud)
非常感谢帮助!我不知道Perl如何处理文件句柄的复杂性,可能是因为我缺乏正式的培训.如果有人感觉特别有帮助,那么对我的整体代码质量的任何评论也是受欢迎的.
编辑:发现问题.Perl无法动态生成目录,因此$species/$geneName甚至都没有创建目录.我在foreach循环的开头添加了一行简单说明mkdir("$species/$geneName");并解决问题.
我遵循以下建议: 文件作为argparse的命令行参数 - 如果参数无效 以打印文件内容,则出现错误消息.这是一个MWE:
import argparse
import os
def is_valid_file(parser, arg):
"""
:rtype : open file handle
"""
if not os.path.exists(arg):
parser.error("The file %s does not exist!" % arg)
else:
return open(arg, 'r') # return an open file handle
parser = argparse.ArgumentParser(description='do shit')
parser.add_argument("-i", dest="filename", required=True,
help="input file with two matrices", metavar="FILE",
type=lambda x: is_valid_file(parser, x))
args = parser.parse_args()
print(args.filename.read)
Run Code Online (Sandbox Code Playgroud)
但是,我得到的不是文件内容:
<built-in method read of _io.TextIOWrapper object at 0x7f1988b3bb40>
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
虽然我在perl中找到了很多关于如何在for循环中打开文件的帖子,但我在创建目录中的文件(也是数组变量)时遇到了一个特定的问题 -
我正在使用打开文件
foreach my $dir (@listofdirs) {
open (my $OUTFILE, '>', "$dir/$dir.txt") or die "$!";
Run Code Online (Sandbox Code Playgroud)
,这不会创建一个文件,并给我一个错误没有这样的文件或目录.
如果我只是使用open (my $OUTFILE, '>', "$dir.txt") or die; 它工作并在我执行脚本的主目录下创建一个文件.
如何控制/指定路径以便在每个$ dir变量(目录)中打开一个文件?如果早些时候已经解决了这个问题,我很抱歉,但我不确定指定新文件路径的正确方法是什么.
编辑 -
我可以更改循环内创建文件的目录,并且每次都为其分配$ dir变量值吗?
perl -f ref列出的名称似乎都不是文件句柄.以下代码返回GLOB,因此似乎filehandle内部映射到或作为typeglob进行管理.那是对的吗?
open FH, '>', "out.txt";
my $ref = \*FH;
print "ref \$ref:", ref $ref, "\n";
Run Code Online (Sandbox Code Playgroud)
文件句柄是否有自己的类型名称?
我有一个带有模板的Perl模块(由模块模块处理)存储在文件末尾的__DATA__和__END__关键字之间.尝试使用模板生成文件时,生成的文件为空,没有警告或错误输出.调试之后,我发现DATA文件句柄在传递给Template模块之前实际上是空的.
此模块的先前版本能够从DATA正确读取模板,但我所做的任何更改都不应影响此部分代码.这些更改包含完全独立函数中的逻辑更改,并将以下use语句添加到模块:
use DBI;
use DBI::Const::GetInfoType;
use Switch;
Run Code Online (Sandbox Code Playgroud)
我已经尝试在perl模块上添加写权限(它最初是只读的)并删除了__END__关键字,因为我发现这不是必需的.不幸的是,DATA文件句柄仍然显示为空.
什么样的问题可能导致DATA文件句柄为空,并且这些问题中的任何一个都适用于我的情况?我使用的是perl v5.12.5.
我有一个看起来像这样的代码:
let fileName = "name.txt"
let fileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(fileName)
try! "".write(to: fileURL, atomically: true, encoding: String.Encoding.utf8)
let fileHandle = try! FileHandle(forWritingTo: fileURL)
fileHandle.seekToEndOfFile()
Run Code Online (Sandbox Code Playgroud)
这段代码有效。但是,如果我删除该行:
try! "".write(to: fileURL, atomically: true, encoding: String.Encoding.utf8)
Run Code Online (Sandbox Code Playgroud)
我得到运行时异常。我不确定为什么需要这条线?
执行以下简化代码时:
use strict; # [01]
use warnings FATAL => 'unopened'; # [02]
# [03]
my ($inHandle, $outHandle) = (\*STDIN, \*STDOUT); # [04]
print $outHandle "STDOUT 1\n"; # [05]
# [06]
# $outHandle re-assigned to outputA.txt ??? # [07]
open($outHandle, ">outputA.txt") or die ("A: $!\n"); # [08]
print $outHandle "FILE A\n"; # [09]
print "STDOUT? 2\n"; # [10]
print STDOUT "STDOUT 3\n"; # [11]
close $outHandle; # [12]
# [13]
# $outHandle is closed # [14]
print STDOUT "STDOUT 4\n"; # …Run Code Online (Sandbox Code Playgroud) 我有这样的代码:
std::string getInfo(FILE *fp)
{
char buffer[30];
if (fread(buffer, 19, 1, fp) == 1)
buffer[19] = '\0';
else
buffer[0] = '\0';
return buffer;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 cppcheck 进行静态分析,它会发出警告:
error: Resource leak: fp [resourceLeak]
return buffer;
^
Run Code Online (Sandbox Code Playgroud)
在我看来,由于返回是按值计算的,因此数据将从“缓冲区”复制到 std::string 的存储中,因此不会发生泄漏。
这会带来一些真正的问题还是误报?