我对perl很新 这是我正在做的事情,我有这样的输入行 我想替换匹配的每一行的值 字符串通过传递变量名,变量值和替换值 作为命令行的输入参数
input_data:
total_sum 0x0C Uint8,unsigned char
num 0x0D Uint8,unsigned char
max 0x4A Uint8,unsigned char
padd 0x00 Uint8,unsigned char
ideal 0x01 Uint16, unsigned short
min 0xffdd7f Uint16, unsigned short
预期产出:
1.total_sum 0x0C Uint8,unsigned char //change 0x0B with 0x0C
2.also if the string conation Uin16 then I need to pad 0x00 as i
want to read only one byte at a time
for e.g ideal should be pad with (0x00,0x01)
3.also if the string contain value more than one byte then i need
to split with 1 byte each
for e.g oxffdd7f should be (0x0ff,0xdd,0x7f)
代码:
#! /usr/bin/env perl
use strict;
use warnings;
# input variable pass as a input argument
my $variable_name =shift @ARGV;
# variable value pass as a input argument
my $variable_value =shift @ARGV;
#variable value need to be replaced with new value
my $Replacement_var = shift @ARGV;
# Name of the file the data is in
my $input_filename = 'my_input.txt';
# Name of the file you want to dump the output to
my $output_filename = 'my_output.txt';
open my $input_fh, "<", $input_filename or die $!;
my @array;
while (my $eachline = <$input_fh>)
{
if ($eachline=~/^$variable_name/ and /$variable_value/)
{
$eachline=s/$variable_value/$Replacement_var/ ;
}
#here extracting only hex values from each line
while ($eachline =~ m/(0x(?:[0-9]|[A-f])+)/gi)
{
push @array, $1;
}
}
close $input_fh;
open my $output_fh, ">", $output_filename or die $!;
print {$output_fh} join(", ", @array);
我正在检查变量名称和值,然后替换变量值 使用新的但没有发生替换(field_ind 0x0B-&gt; 0x0C) 请帮助我,我在做错了。
答案 0 :(得分:4)
$eachline=~/^$variable_name/ and /$variable_value/
应该是
$eachline=~/^$variable_name/ and $eachline=~/$variable_value/
当绑定运算符(=~
)未明确用于正则表达式的左侧时,Perl会将其隐式绑定到$_
变量。
您还想在其他地方使用绑定运算符并说
$eachline =~ s/$variable_value/$Replacement_var/ ;
而不是
$eachline = s/$variable_value/$Replacement_var/ ;