perl之中类sed的代码范式
以下为替换串口的波特率的实例
- perl代码,存储为config_uart.pl
#! /usr/bin/perl
use v5.12;
use autodie;
no warnings 'experimental';
################################################################
sub deal_linux
{
my($file) = @_;
$^I=".bak";
@ARGV = ($file);
my $baudrate = $ENV{BOARD_BAUDRATE}//115200;
while(<>){
s/(\s+)(rockchip,baudrate).*/$1$2 = \<$baudrate\>\;/;
print;
}
}
sub deal_uboot
{
my($file) = @_;
$^I=".bak";
@ARGV = ($file);
my $baudrate = $ENV{BOARD_BAUDRATE}//115200;
while(<>){
s/(CONFIG_BAUDRATE)=.*/$1=$baudrate/;
print;
}
}
sub main
{
my($type,$file) = @ARGV;
print "type = $type\n";
print "file = $file\n";
given($type){
when("uboot") {deal_uboot($file);}
when("linux") {deal_linux($file);}
default {print "unknown type\n";}
}
}
################################################################
main
- 如何使用
./config_uart.pl uboot ./u-boot/configs/rk3568_defconfig
./config_uart.pl linux linux/arch/arm64/boot/dts/rockchip/rk3568.dts
- 以下代码可以从环境变量之中获取波特率,并在没有设置的情况下提供一个默认值
my $baudrate = $ENV{BOARD_BAUDRATE}//115200;
- s/string1/string2/是将字符串之中的string1替换成string2
- 这种范式不是为了替代sed的功能,只是为了可以将同一功能的多组替换给放到一起,便于管理,也可以使其与繁杂的shell代码分开,方便后续维护