作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个 Rust 程序,它通过管道从外部程序输入并通过管道吐到另一个外部程序,就像三明治一样。更具体地说,我尝试创建的玩具模型是“gzip -cd input | rust | gzip -c -> output”。
基本上,我知道如何通过以下方式完成第一部分(管道输入):
let child = match Command::new("zcat")
.args(&["input"])
.stdout(Stdio::piped())
.stderr(Stdio::null())
.spawn();
let filehand = BufReader::new(child.stdout.unwrap());
for line in filehand.lines() {
...
}
但我卡在了第二部分,我也不知道如何将两者拼凑在一起。我知道 Perl 可以优雅地做到这一点:
open filehand_in, "gzip -cd input |";
open filehand_out, "| gzip -c - > output";
while ( <filehand_in> ) {
# processing;
print filehand_out ...;
}
我所说的优雅是指输入和输出的外部处理对主程序透明:您只需将第一个管道视为标准输入,将第二个管道视为标准输出,无需担心.我想知道是否有人知道如何在 Rust 中实现类似的功能,谢谢。
最佳答案
你可以这样做:
use std::io::{BufRead, BufReader, Write};
use std::process::{Command, Stdio};
pub fn main() {
let mut left_child = Command::new("/bin/ls")
.stdout(Stdio::piped())
.spawn()
.expect("failed to execute child");
let mut right_child = Command::new("/bin/cat")
.stdin(Stdio::piped())
.spawn()
.expect("failed to execute child");
// extra scope to ensure that left_in and right_out are closed after
// copying all available data
{
let left_in = BufReader::new(left_child.stdout.take().unwrap());
let mut right_out = right_child.stdin.take().unwrap();
for line in left_in.lines() {
writeln!(&mut right_out, "{}", line.unwrap()).unwrap();
}
}
let left_ecode = left_child.wait().expect("failed to wait on child");
let right_ecode = right_child.wait().expect("failed to wait on child");
assert!(left_ecode.success());
assert!(right_ecode.success());
}
关于rust - 三明治管使用rust 了怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68323175/
在离散选择问题中使用 mlogit() 拟合多项式 Logit (MNL) 后,我试图计算稳健/集群标准误差。不幸的是,我怀疑我遇到了问题,因为我使用的是 long 格式的数据(在我的情况下这是必须的
我是一名优秀的程序员,十分优秀!