加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl中的反引号`` system exec

发布时间:2020-12-16 00:12:41 所属栏目:大数据 来源:网络整理
导读:关于perl中的反引号(``),system和exec 在perl中反勾号(``),system和exec都用来实行号令,这篇文章将给我们先容它们各自的利用方式,接洽,以及区别。 ? 一、利用方式 1. 反勾号(``) 起首,我们有号令输入操纵符,也叫反勾号操纵符,由于它看起来象如

关于perl中的反引号(``),system和exec

在perl中反勾号(``),system和exec都用来实行号令,这篇文章将给我们先容它们各自的利用方式,接洽,以及区别。

?

一、利用方式

1. 反勾号(``)

起首,我们有号令输入操纵符,也叫反勾号操纵符,由于它看起来象如许:

$info = `finger $user`;

一个用反勾号(手艺上叫重音号)引起的字串起首举行变量替代,就象一个双引号引起的字串一样。获得的成果然后被体系看成一个号令行,并且阿谁号令的输出成为伪文本的值。(这是一个近似 Unix shell 的模块。)在标量情况里,返回一个包罗全部输出的字串。在列表情况里,返回一列值,每行输出一个值。(你可以经由过程设置 $/ 来利用分歧的行竣事符。)

每次计较伪文本的时辰,该号令都得以实行。该号令的数字状况值保留在 $?(参阅第二十八章获取 $? 的诠释,也被称为 $CHILD_ERROR )。和这条号令的 csh 版本分歧的是,对返回数据不做任何转换——换行符仍旧是换行符。和全部 shell 分歧的是,Perl 里的单引号不会埋没号令行上的变量,使之制止代换。要给 shell 通报一个 $,你必需用反斜杠把它埋没起来。我们上面的 finger 例子里的 $user 被 Perl 代换,而不是被 shell。(由于该号令 shell 处置,参阅第二十三章,平安,看看与平安有关的内容。)

反勾号的一样平常情势是 qx//(意思是“引起的实行”),但这个操纵符的感化完全和通俗的反勾号一样。你只要选择你的引起字符就行了。有一点和引起的伪函数近似:若是你可巧选择了单引号做你的分开符,那号令行就不会举行双引号代换;

$perl_info = qx(ps $$); # 这里 $$ 是 Perl 的处置工具 $perl_info = qx'ps $$'; # 这里 $$ 是 shell 的处置工具

下面是一个例子:

在笔者的F盘中存在一个perl文件F://Demo3.pls,它的感化便是被别的一个法式F://Demo1.pls挪用,然后F://Demo3.pls读取log3.log中的数据。

Demo3.pls

#!/usr/bin/perl -w

use strict;

use warnings;

unless(open(FILE_H,"

print "Can not open the file";

}

my @str = ;

my $count = @str;

close(FILE_H);

for(my $i = 0;$i<$count;$i++){

print "$str[$i]";

Demo.pls

#!/usr/bin/perl –w

my @str = qx/perl F://Demo3.pls/;#大概` perl F://Demo3.pls `结果#一样

print "@str";

Log3.log

代码诠释,当实行Demo.pls时,my @str = qx/perl F://Demo3.pls/;这一句会被操纵体系挪用而且启动Demo3.pls,然后Demo3.pls会读取log3.log中的数据。

我们首要存眷的是my @str = qx/perl F://Demo3.pls/;这句中的返回值@str,我们都知道@str是一个列表情况,反勾号返回Demo3.pls中的print的打印值,固然我们也可以利用标量情况,比方,my $str = qx/perl F://Demo3.pls/;如许也可以一次性的掏出全部的数据。

末了总结:反勾号返回的是号令行返回的print的数值。详细的诠释看上面的申明。

2. System

l system PATHNAME LIST

l system LIST

这个函数为你实行任何体系里的法式并返回该法式的退出状况——而不是它的输出。要捕捉号令行上的输出,你应该用反勾号大概 qx//。system 函数的运转很是近似 exec,只不外 system 先做一个 fork,然后在 exec 之后期待实行的法式的竣事。也便是说它为你运行这个法式而且在它完成之后返回,而 exec 用新的法式取代你运行的法式,以是若是替代乐成的话它从不返回。

参数的处置因参数的数量的分歧而分歧,就象在 exec 里形貌的那样,包罗判定是否挪用 shell 以及你是否用声明别的一个 PATHNAME 的方式利用了该函数其他的名称。

由于 system 和反勾号梗阻 SIGINT 和 SIGQUIT,以是向那些正在如许运行的法式发送这些旌旗灯号之一(好比经由过程一个 Control-C)时并不会间断你的主法式。可是你运行的别的一个法式简直收到这个旌旗灯号。请查抄 system 的返回值,判定你运行的法式是否正常退出。

@args = ("command","arg1","arg2");

system(@args) == 0

or die "system @args failed: $?"

返回值是和该函数经由过程 wait(2) 体系挪用返回的一样的退出状况。在传统的语意里,要获取现实的退出值,要除以 256 大概右移 8 位。这是由于低 8 位里有一些其他的工具。(现实上是其他的两些工具。)最低七位标识杀死该历程的旌旗灯号号码(若是有的话),而第八位标识该历程是否倾倒了焦点。你可以经由过程 $?($CHILD_ERROR)来查抄全部失效大概性,包罗旌旗灯号和焦点倾倒:

$exit_value = $? >> 8;

$exit_value = $? & 127; # 大概 0x7f,0177,0b0111_1111

$dumped_core = $? & 128; # 大概 0x80,0200,0b1000_0000

若是该法式是经由过程体系 shell (注:界说为 /bin/sh 大概任安在你的平台上故意义的工具,但不是那些用户可巧在某个时辰用到的 shell。)运行的,这大概是由于你只有一个参数并且该参数内里有 shell 元字符,那么凡是返回码受阿谁 shell 的怪癖和功效的影响。换句话说,在这种环境下,你大概无法获取我们前面形貌了具体信息。

3. exec

o exec PATHNAME LIST

o exec LIST

exec 函数竣事当出息序的运行而且实行一条外部号令而且决不返回!!!若是你但愿在该号令退出之后规复节制,那么你应该利用 system。exec 函数只有在该号令不存在以及该号令是直接实行而没有经由过程你的体系的号令行 shell(下面会商)实行的时辰才失败并返回假。

若是只有一个标量参数,那么 exec 查抄该参数是否 shell 的元字符。若是找到元字符,那么它代表的全部参数都通报给体系的尺度号令行诠释器(在 Unix 里是 /bin/sh)。若是没有如许的元字符,那么该参数被割裂成单词然后直接实行,出于服从思量,如许做绕开了全部 shell 处置的过荷。并且若是该法式没有退出,如许也给你更多错误规复的节制。

若是在 LIST 里有多于一个参数,大概若是 LIST 是一个带有跨越一个值的数组,那么就决不会利用体系的 shell。如许也绕开了 shell 对该号令的处置。在参数中是否呈现元字符并不影响这个列表触发特征,这么做也是有平安思量的法式的比力好的做法,由于它不会把本身表露在潜伏的 shell 逃逸之中。

下面的例子令当前运行的 Perl 法式用 echo 法式取代自身,然后它就打印出当前的参数列表:

exec 'echo','Your arguments are: ',@ARGV;

下面这个例子表现了你可以 exec 一个流水线,而不但仅是一个法式:

exec "sort $outfile | uniq"

or die "Can't do sort/uniq: $!/n";

凡是,exec 从不返回——就算它返回了,它也老是返回假,而且你应该查抄 $! 找出什么工具犯错了。要注重的是,在老版本的 Perl 里,exec(和 system)并不革新你的输出缓冲,以是你必要在一个或更多个文件句柄上经由过程设置 $| 打开号令缓冲功效以制止在 exec 的环境下丢失输出,大概在 system 的环境下打乱了输出挨次。在 Perl 5.6 里环境大抵如斯。

若是你让操纵体系在一个现有的历程里运行一个新的法式(好比 Perl 的 exec 函数做的如许),你要报告体系要实行的法式在那边,可是你也报告了这个新的法式(经由过程它的第一个参数)是什么法式实行了它。风俗上,你报告它的名字只是该法式的位置的一个拷贝,但这么做不是必需的,由于在 C 说话的级别上,有两个自力的参数。若是这个名字不是拷贝,那么你就大概看到奇异的成果:这个新法式以为本身因此一个和它地点的现实路径名完全分歧的名字运行的。凡是如许对那些满腹困惑的法式来说没什么题目,但有些法式简直体贴本身的名字,而且按照本身的名字的转变会有分歧的性格。好比,vi 编纂器会看看本身是作为“vi”仍是作为“view”挪用的。若是作为“view”,那么它就主动打开只读模式,就好象它是带着 -R 号令行选项挪用的一样。

这个时辰便是 exec 的可选 PATHNAME 参数起感化的处所了。从语意上来看,它放在间接工具的位置,就好象 print 和 printf 的文件句柄一样。是以,它并不必要在背面有一个工具,由于它现实上不是参数列表的一部门。(从某种意义上来说,Perl 与操纵体系采纳的方式正相反,它以为第一个参数是最主要的,而且若是它分歧那么就让你点窜路径名。)好比:

$editor = "/usr/bin/vi";

exec $editor "view",@files # 触发只读模式

or die "Couldn't execute $editor: $!/n";

和任何其他间接工具一样,你也可以用一个包罗肆意代码的块取代上面这个保留法式名的简略标量,如许就可以把前面这个例子简化为:

exec { "/usr/bin/vi" } "view" @files # 触发只读模式

如前所述,exec 把一个分离的参数列表看成一个它应该绕开 shell 处置的标记。不外,仍旧有一个处所大概把你拌倒。exec 挪用(以及 system)不克不及区别单个标量参数和一个只有一个元素的列表。

@args = ("echo surprise") # 只有一个元素在列内外

exec @args # 仍旧大概有 shell 逃逸

or die "exec: $!"; # 由于 @args == 1

为了制止这种环境,你可以利用 PATHNAME 语法,明白地把第一个参数当路径名复制,如许就逼迫其他的参数诠释成一个列表,纵然现实上只有一个元素:

exec { $args[0] } @args # 就算是只有一个元素的列表也平安了

or die "can't exec @args: $!";

第一个没有花括弧的版本,运行 echo 法式,给它通报“surprise”做参数。第二个版本不是如许——它试图运行一个字面上叫 echo surprise 的法式,但找不到(我们但愿如斯),然后把 $! 设置为一个非零值以暗示失败。

由于 exec 函数凡是是紧跟在 fork 之后挪用的,以是它假定任何原先一个 Perl 历程停止的时辰要产生的工作都被纰漏。在 exec 的时辰,Perl 不会挪用你的 END 块,也不会挪用与任何工具相干的 DESTROY 方式。不然,你的子历程竣事的时辰会做那些你筹办在父历程里做的清算事情。(我们但愿在实际糊口中便是如斯。)

由于把 exec 看成 system 用是一个很是遍及的错误,以是若是你带着风行的 -w 号令行开关运行,大概你用了 use warnings qw(exec syntax) 用法的时辰,若是 exec 背面随着的语句不是 die,warn,或则 exit,那么 Perl 就会告诫你。若是你真的想在 exec 背面跟一些其他的语句,你可以利用下面两种气概之一以制止告诫:

exec ('foo) or print STDERR "couldn't exec foo: $!";

{ exec ('foo') }; print STDERR "couldn't exec foo: $!";

正如上面的第二行表现的那样,若是挪用 exec 的时辰是一个块里的末了一条语句,那么就可以免于告诫。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读