我的system功能有问题。我想将系统函数输出存储到变量。
例如,
system("ls");
这里我希望当前目录中的所有文件名都存储在变量中。我知道我可以通过将输出重定向到一个文件并从中读取并将其存储到变量来实现。但我想要一种有效的方法。有什么办法。
答案 0 :(得分:18)
不,你不能存储ls输出的值, 因为系统总是将命令作为子进程执行, 所以尝试使用backtick`command`来执行当前的命令 过程本身!
答案 1 :(得分:15)
最简单的方法是使用反引号或qx()
:
my $value = qx(ls);
print $value;
输出类似于ls
。
答案 2 :(得分:10)
我的回答并未解决您的问题。但是,如果您真的想要进行目录列表,请不要像这样调用系统ls
。使用opendir(),readdir()或while
循环。
例如,
while (<*>){
print $_ ."\n";
}
事实上,如果它不是第三方专有程序,请始终尝试使用Perl自己的功能。
答案 3 :(得分:9)
正如abubacker所说,你可以使用反引号将程序的输出捕获到变量中供以后使用。但是,如果您还需要检查异常返回值,或绕过调用shell,则需要引入CPAN模块IPC::System::Simple:
use IPC::System::Simple qw(capture);
# Capture output into $result and throw exception on failure
my $result = capture("some_command");
可以通过多种方式调用此模块,并允许您自定义哪些错误返回值是“可接受的”,是否绕过shell,以及如何处理参数分组。它还为system()
提供了直接替代,这增加了更多的错误检查。
答案 4 :(得分:7)
内置system函数的官方Perl文档声明:
这不是您想要使用的 捕获命令的输出,for 你应该只使用反引号 或qx //,如“
STRING
”中所述 perlop中。
有很多方法可以轻松访问文档:
perldoc -f
system
如果您希望将每个目录列表存储到单独的数组元素中,请使用:
my @entries = qx(ls);
答案 5 :(得分:2)
使用反引号将输出存储在变量
中$output = `ls`;
答案 6 :(得分:0)
执行此操作的一种快速而简单的方法是专门为您的示例使用qx()
:
my $output = qx(ls 2>&1);
2>&1
部分是捕获stdout和stderr。
答案 7 :(得分:0)
由于尚未被其他答案提及,因此您还可以使用Capture::Tiny将任意STDOUT(和/或STDERR)存储到变量中,包括从系统命令中存储。
var { LMap, LTileLayer, LMarker } = Vue2Leaflet;
new Vue({
el: '#app',
components: { LMap, LTileLayer, LMarker },
data() {
return {
zoom:13,
center: L.latLng(47.413220, -1.219482),
url:'http://{s}.tile.osm.org/{z}/{x}/{y}.png',
attribution:'© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors',
marker: L.latLng(47.413220, -1.219482),
tileProviders: [
{
id: 1,
name: 'Light',
url: 'https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png',
attribution: '© <a href=\'http://www.openstreetmap.org/copyright\'>OpenStreetMap</a> © <a href=\'https://carto.com/attributions\'>CARTO</a>',
},
{
id: 2,
name: 'Dark',
url: 'https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png',
attribution: '© <a href=\'http://www.openstreetmap.org/copyright\'>OpenStreetMap</a> © <a href=\'https://carto.com/attributions\'>CARTO</a>',
}
],
}
},
methods: {
reverse: function() {
this.tileProviders.reverse();
},
}
});