类似于我可以在Perl中找到文件句柄中的文件名吗?但在Tcl.
我计划缓存filename-filehandle关联,所以我纯粹是出于好奇 - 特别是链接中提到的"操作系统魔法".在Tcl中有可能吗?
如果重要的话,我(强制进入)在SunOS 5.10上使用Tcl 8.0.5.
我想用cython编译一个python函数,用于读取跳过一些记录的二进制文件(不读取整个文件然后切片,因为我的内存不足).我可以想出这样的事情:
def FromFileSkip(fid, count=1, skip=0):
if skip>=0:
data = numpy.zeros(count)
k = 0
while k<count:
try:
data[k] = numpy.fromfile(fid, count=1, dtype=dtype)
fid.seek(skip, 1)
k +=1
except ValueError:
data = data[:k]
break
return data
Run Code Online (Sandbox Code Playgroud)
然后我可以使用这样的功能:
f = open(filename)
data = FromFileSkip(f,...
Run Code Online (Sandbox Code Playgroud)
但是,为了用cython编译函数"FromFileSkip",我想定义函数中涉及的所有类型,所以"fid"也是文件处理程序.如何在cython中定义其类型,因为它不是"标准"类型,例如整数.谢谢.
我在perldoc中读到-t文件操作符用于决定是否向tty打开文件句柄.然后我读了一个tty是什么,从我的理解,这是一个终端的旧术语?
然而,我的主要问题是此代码用于:
if(-t STDERR) {
die "some warning/error message here"
}
Run Code Online (Sandbox Code Playgroud)
我想我真的不明白"将文件句打开到tty"意味着什么.这是否意味着该文件句柄的特定输出出现在tty - 或终端上?除了终端之外,还可以参考一些东西吗?
我有一个子程序,它以文件句柄作为参数.如何从命令行上指定的文件路径创建文件句柄?我不想自己对这个文件进行任何处理,我只是想将它传递给另一个子程序,该子程序返回一个包含文件中所有已解析数据的哈希数组.
这是我正在使用的命令行输入:
$ ./getfile.pl /path/to/some/file.csv
这是我调用的子程序的开头看起来像:
sub parse {
my $handle = shift;
my @data = <$handle>;
while (my $line = shift(@data)) {
# do stuff
}
}
Run Code Online (Sandbox Code Playgroud) 我想在Perl(在Linux上运行)中建立一个流程管道,包括在不同时间运行的两个部分.
例如:
启动消费者流程:
open( OUT, "| tar xvf - " ) || die "Failed: tar: $!";
Run Code Online (Sandbox Code Playgroud)
然后很久以后开始制作过程:
open( IN, "gpg -d $file |" ) || die "Failed: gpg: $!";
Run Code Online (Sandbox Code Playgroud)
但然后以某种方式将gpg的输出重定向到tar的输入.
我可以通过构建一个循环来做到这一点:
while (<IN> ) {
print OUT;
}
Run Code Online (Sandbox Code Playgroud)
但我想知道我是否可以通过重定向将两个进程粘合在一起.
我有一个带有返回文件句柄的方法的对象,我想从该句柄中读取.以下方法不起作用,因为方法调用的右尖括号被解释为输入阅读器的右尖括号:
my $input = <$object->get_handle()>;
Run Code Online (Sandbox Code Playgroud)
这被解析为:
my $input = ( < $object- > ) get_handle() >;
Run Code Online (Sandbox Code Playgroud)
这显然是语法错误.有什么方法可以在角度运算符中执行方法调用,还是需要将它分成两个这样的步骤?
my $handle = $object->get_handle();
my $input = <$handle>;
Run Code Online (Sandbox Code Playgroud) 问题出在这里:我有一个守护进程,它从客户端获取请求,由于请求而执行一个函数(来自某个模块),并向客户端返回一个答案.在fork()之后我关闭了STDIN,STDOUT和STDERR.一个功能是检查dmesg.为此,我通过open(DMESG,"/ bin/dmesg |")获得dmesg输出.读完之后我没有关闭这个fh,因为我认为它会在函数完成后自动关闭.但这不会发生,每次调用dmesg我都会得到一个僵尸.
关于如何重新初始化Perl的STDIN/STDOUT/STDERR?我发现"关闭STDOUT而不是重新打开的问题是,如果你打开其他文件,它们可能会得到fd 0,1或2 - 阻止你将来重新打开STDOUT." 作者:jmanning2k我认为它与它有关但我并没有真正得到它.我希望有人可以向我解释.
我知道我可以避免这个问题,例如通过qx()调用dmesg; 或者只是关闭fh,但我想了解僵尸的来源.
这是我到目前为止的代码,我想知道它是否正确?
$handle = fopen($file, 'w') or die("can't open file");
$closed = fclose($handle);
while($closed){
DOAWESOMETHINGS(); // btw I only want to have this run once for each handle
$closed = false;
}
Run Code Online (Sandbox Code Playgroud)
非常感谢!
是否可以将文件句柄作为参数发送到PERL中的子例程?
如果是,您是否可以帮助显示如何接收它并在子例程中使用它的示例代码段?
我想更好地理解typeglobs并编写小程序:
use Symbol;
open F, '>', \my $var;
t( F );
t( \F );
t( *F );
t( \*F );
sub t {
my $fh = shift;
print ">>$fh<<" . ref( $fh ) ."\n";
}
Run Code Online (Sandbox Code Playgroud)
输出是:
>>F<<
>>SCALAR(0x1e67fc8)<<SCALAR
>>*main::F<<
>>GLOB(0x1e53150)<<GLOB
Run Code Online (Sandbox Code Playgroud)
为什么GLOB仅在最后一种情况下被返回?