我想将我的C++程序中的数据发送到外部管道,如下所示:
FILE* file = popen("my_prog -opt | other_prog", "w");
std::ostream fileStream = some_function(file);
fileStream << "some data";
Run Code Online (Sandbox Code Playgroud)
我知道没有简单的,跨平台的方式来做第二行,但有没有办法用其他东西来完成同样的事情popen?我不需要使用popen,但我确实需要使用ostream.它需要使用clang并gcc至少进行编译,但最好能与任何编译器一起使用.我也可以改变我处理管道的方式,但是我没有源my_prog或other_prog.
这两个例子之间有什么区别?
#!/usr/bin/perl
use warnings;
use 5.012;
my $str = "\x{263a}";
open my $tty, '>:encoding(utf8)', '/dev/tty' or die $!;
say $tty $str;
close $tty;
open $tty, '>:bytes', '/dev/tty' or die $!;
say $tty $str;
close $tty;
# -------------------------------------------------------
binmode STDOUT, ':encoding(utf8)' or die $!;
say $str;
binmode STDOUT, ':bytes' or die $!;
say $str;
Run Code Online (Sandbox Code Playgroud) 我需要弄清楚如何将文件输出写入Python中的压缩文件,类似于下面的双线程:
open ZIPPED, "| gzip -c > zipped.gz";
print ZIPPED "Hello world\n";
Run Code Online (Sandbox Code Playgroud)
在Perl中,这使用Unix gzip将打印到ZIPPED文件句柄的任何内容压缩到文件"zipped.gz".
我知道如何使用"import gzip"在Python中执行此操作,如下所示:
import gzip
zipped = gzip.open("zipped.gz", 'wb')
zipped.write("Hello world\n")
Run Code Online (Sandbox Code Playgroud)
但是,这非常缓慢.根据分析器,使用该方法占用了我运行时间的90%,因为我将200GB的未压缩数据写入各种输出文件.我知道文件系统可能是问题的一部分,但我想通过使用Unix/Linux压缩来排除它.这部分是因为我听说使用同一模块进行解压缩也很慢.
在perl中编写代码时,我经常从__DATA__脚本末尾的文件句柄中读取数据:
while (<DATA>) {
chomp;
say;
}
__DATA__
line1
line2
Run Code Online (Sandbox Code Playgroud)
我发现测试代码等比读取文件更快,因为这意味着我可以动态编辑其内容.
来自doc:
该
__DATA__标记告诉编译Perl代码完成perl的编译器.
__DATA__令牌之后的所有内容都可通过文件句柄进行读取FOOBAR::DATA,其中是到达令牌FOOBAR时当前包的名称__DATA__.
Python中有相应的东西吗?如果没有,任何人都可以建议实现类似事物的最多Python方法吗?
我试图弄清楚正确的PBP批准的方法,一次处理一行多行字符串.许多Perl程序员建议将多行字符串视为文件句柄,除非你的脚本中有"use strict",否则它可以正常工作.然后,您会收到编译器的警告,指出在使用严格的refs时无法使用字符串作为符号.
这是一个简单的问题工作示例:
#use strict;
use warnings;
my $return = `dir`;
my $ResultsHandle = "";
my $matchLines = "";
my $resultLine = "";
open $ResultsHandle, '<', \$return;
while (defined ($resultLine = <$ResultsHandle>)) {
if ($resultLine =~ m/joe/) {
$matchLines = $matchLines . "\t" . $resultLine;
}
}
close($ResultsHandle);
print "Original string: \n$return\n";
print "Found these matching lines: \n$matchLines\n";
Run Code Online (Sandbox Code Playgroud)
请注意,"use strict"行已注释掉.当我在没有使用严格的情况下运行此脚本时,我得到了我想要的和期望的:
Original string:
Volume in drive D has no label.
Volume Serial Number is 50D3-54A6
Directory of D:\Documents and Settings\username\My Documents\Eclipse\myTestProject …Run Code Online (Sandbox Code Playgroud) 如何在XS函数中支持autovivified文件句柄参数?
我是XS包装一个返回文件描述符的C函数,我想以open()的方式将该文件描述符呈现为perl文件句柄参数.例如,
myfunc(my $fh) or die "Error: $!";
do_something_with_fh($fh);
Run Code Online (Sandbox Code Playgroud)
现在我在XS函数的顶部使用perl包装器:
# -- in perl
sub myfunc {
my $fd = _myfunc();
return open($_[0], '+<&=', $fd) if defined($fd);
}
/* -- in XS */
SysRet
_myfunc()
CODE:
RETVAL = some_c_function_returning_an_fd();
OUTPUT:
RETVAL
Run Code Online (Sandbox Code Playgroud)
这适用于Just Fine(tm),但是,我再次将实现完全转移到XS中.
到目前为止,我已经尝试sv_2io了一个类型为mapmap的参数SV *,但是在未定义的标量上引发了一个异常.我没有尝试将第一个参数映射到一个FILE *或一个PerlIO *对象,因为我不知道我将如何"fdreopen"(如果你愿意)这些对象.
在示例中,它们具有正常的$ -prefixed变量用于文件句柄的位置:
open(my $fh, "<", "input.txt")
Run Code Online (Sandbox Code Playgroud)
以及使用裸字的示例:
open(FOO, "|tr '[a-z]' '[A-Z]'");
Run Code Online (Sandbox Code Playgroud)
一个问题是每个样式的名称是什么,在每种情况下"我正在使用_ _作为文件句柄"?另一种是,为什么他们开始使用裸字的open()文档中?它似乎是后来的用途都不涉及正常的文件名open().在这些情况下,$ -prefixed表单是不可接受的吗?
我正在使用jGit克隆远程现有仓库,遵循指南:
我正在使用CFML作为我的例子:
Git = createObject( 'java', 'org.eclipse.jgit.api.Git' );
localPath = createObject( 'java', 'java.io.File' ).init( expandPath( 'temp' ) );
result = Git.cloneRepository()
.setURI( 'https://github.com/github/testrepo.git' )
.setDirectory( localPath )
.call();
result.close();
Run Code Online (Sandbox Code Playgroud)
克隆工作得很好,但在temp\.git\objects\pack我停止Java进程之前,文件锁不会在"pack"文件中发布.
然后我也注意到API文档对于结果.close()方法的行为似乎有些过于谨慎:http:
//download.eclipse.org/jgit/site/4.0.1.201506240215-r/apidocs/org/eclipse/jgit/ LIB/Repository.html#close()方法
减少使用次数,并可能关闭资源.
也许?那是什么意思?为了"放弃任何底层资源",我需要做什么,如AutoCloseable该.close()方法帮助实现的接口中指定的那样?
在SO上有几个类似的问题,但没有一个涉及使用静态方法org.eclipse.jgit.api.Git来克隆新的repo.
我从供应商那里得到了一个“csv 文件”(使用他们的 API),但他们所做的只是把整个事情都吐到他们的响应中。这不会是一个重大问题,当然,除了那些讨厌的人中的一些输入数据并放入诸如换行符之类的“功能”之外。我现在正在做的是为原始数据创建一个文件,然后重新打开它以读取数据:
open RAW, ">", "$rawfile" or die "ERROR: Could not open $rawfile for write: $! \n";
print RAW $response->content;
close RAW;
my $csv = Text::CSV_XS->new({ binary=>1,always_quote=>1,eol=>$/ });
open my $fh, "<", "$rawfile" or die "ERROR: Could not open $rawfile for read: $! \n";
while ( $line = $csv->getline ($fh) ) { ...
Run Code Online (Sandbox Code Playgroud)
不知何故,这似乎……不雅。似乎我应该能够从 $response->content (多行字符串)中读取数据,就好像它是一个文件一样。但我对如何做到这一点完全空白。一个指针将不胜感激。谢谢,保罗
在下面的小代码中,我没有收到行 [09] 和 [18] 的错误或警告。我得到的唯一警告是第 [21] 行:
use strict; # [01]
use warnings FATAL => 'unopened'; # [02]
# [03]
open(my $outHandleA, ">outputA.txt") or die ("A: $!\n"); # [04] Opened $outHandleA
print $outHandleA "FILE A\n"; # [05]
close $outHandleA; # [06] Closed $outHandleA
# [07]
print $outHandleA; # [08]
print $outHandleA "ABC\n"; # [09] <---
print $outHandleA; # [10]
print "-----"; # [11]
# [12]
open(OUT, ">outputB.txt") or die ("B: $!\n"); # [13] Opened OUT
print OUT "FILE B\n"; # …Run Code Online (Sandbox Code Playgroud)