寒假【perl语言学习脚本】16.1 16.2 16.3 16.4

博客围绕Perl程序展开,包含切换工作目录、使用exec函数执行命令、重定向标准输出和错误输出、字符串匹配判断、信号处理等代码示例。介绍了代码功能,如exec函数使perl进程执行任务,通过设置信号处理句柄捕获信号等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
#!/usr/bin/perl -w
chdir ‘/home/zhangjingjing’ or die “can’t chdir to /home/zhangjingjing directory: ! " ; e x e c ′ l s ′ , ′ − l ′ o r d i e " c a n ′ t e x e c l s : !"; exec 'ls','-l' or die "can't exec ls: !";execls,lordie"cantexecls:!”;
#第一行的程序代码会将当前工作目录切换到根目录,它的名称总是固定的
#第二行使用了多参数的exec函数来将结果传递到标准输出
#exec函数导致perl进程自己去执行任务,

例如:要运行/tmp目录下的bedrock命令并带上-o args以及程序本身所调用的参数:

chdir ‘/tmp’ or die “Cannot chdir /tmp:$!”;

exec ‘bedrock’, ‘-o’, ‘args1’, @ARGV;

在这里插入图片描述
#!/usr/bin/perl -w
open STDOUT,’>’,‘ls.out’ or die “can’t write to ls.outL ! " ; o p e n S T D E R R , ′ > ′ , ′ l s . e r r ′ o r d i e " c a n ′ t w r i t e t o l s . e r r : !"; open STDERR,'>','ls.err' or die "can't write to ls.err: !";openSTDERR,>,ls.errordie"cantwritetols.err:!”;
chdir ‘/home/zhangjingjing’ or die “can’t chdir to /home/zhangjingjing directory: ! " ; e x e c ′ l s ′ , ′ − l ′ o r d i e " c a n ′ t e x e c l s : !"; exec 'ls','-l' or die "can't exec ls: !";execls,lordie"cantexecls:!”;
#程序的前两行会重新打开STDOUT和STDERR并将它们重定向到当前工作目录下的两个文件里(在切换工作目录之前)
#在工作目录切换之后,将会执行显示目录清单里的命令,并把数据传送到之前打开的两个文件里
在这里插入图片描述
#!/usr/bin/perl -w
print date;
if (date=~/\AS/){
print “go play!\n”;
}else{
print “get to work!\n”;
}
#因为Saturday周六和Sunday周日都是以S开头,而且date命令的输出结果又是以“今天是星期几”作为开始
#所以只要检查date命令的输出,看看它是否以S开头就可以了
#可以将模式换成/\A(Sat|Sun)/

\A: 匹配字符串的绝对开头

在这里插入图片描述
#!/usr/bin/perl -w
use 5.010;
sub my_hup_handler {state n ; s a y ′ c a u g h t H U P : ′ , + + n; say 'caught HUP:',++ n;saycaughtHUP:,++n}
sub my_usr1_handler {state n ; s a y ′ c a u g h t U S R 1 : ′ , + + n; say 'caught USR1:',++ n;saycaughtUSR1:,++n}
sub my_usr2_handler {state n ; s a y ′ c a u g h t U S R 2 : ′ , + + n; say 'caught USR2:',++ n;saycaughtUSR2:,++n}
sub my_usr2_handler {say ‘caught INT.Exiting.’;exit}
say " I am $$";
foreach my $signal (qw(int hup usr1 usr2)){
$SIG{uc KaTeX parse error: Expected 'EOF', got '}' at position 7: signal}̲="my_{signal}_handler";
}
while(1){sleep 1};
#我们需要另外打开一个终端会话来运行程序以发送信号
$ kill -HUP 61203
$perl -e ‘kill HUP => 61203’
$perl -e ‘kill USR2 => 61203’
#该程序的输出显示每次信号来到时我们已经见过的次数:
KaTeX parse error: Expected 'EOF', got '#' at position 144: …t INT.Exiting. #̲让它能捕获信号并报告之前收到该…kill -USR1 12345

#要捕获某些信号,就要设置信号处理句柄,做一些重复性的工作,对每个信号处理句柄子程序,都设置一个state变量
#这样每次调用子程序时都可以访问之前累计的数字
#用foreach循环一次将正确的子程序名称赋值给%SIG中的适当值
#最后创建一个无限循环,让程序一直运行着,准备接收信号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值