>我在一个文件中有多个这样的字符串,每行一个:
[random string] was [failed/passed] 1y 2mo 3d 1h 51m 2s ago [some string]
现在我想做的是提取 6 个变量(年、月、日、小时、分钟、秒)的持续时间,以使用"日期"函数计算日期。我还想在变量(例如 O/1)中获取通过/失败。
我遇到了3个问题:
- 我无法读取包含这些字符串的文件中的每一行(for 循环效果不佳......也许一段时间会更好)
如果我设法读取一个字符串,我尝试用cut解析它,但我不知道如何摆脱字母(y,mo,h...)并只保留数字。
持续时间格式是可变的;不到一年时可以是 1 个月 2 小时 3 秒,也可以是 1 年 3 天 58 分 3 秒,或 3 小时 5 秒...... 等等。我不知道如何处理这种可变性。我猜该命令必须检查字母并分配其功能,并将 0 分配给不存在的字母。
非常感谢您的帮助!
这是我认为适合您的perl
代码。
#!/usr/bin/perl
my $string = <STDIN>;
chomp $userword; # Get rid of newline character at the end
@arr = $string =~ /(passed|failed).+?([d]+[yY].)?([d]+(?:mo|MO).)?([d]+[dD].)?([d]+[hH].)?([d]+[mM].)?([d]+[sS])/g;
$arr_len = scalar @arr;
print "Result: $arr[0]n";
for($i=1;$i<=$arr_len;$i=$i+1){
$arr[$i]=~/(d+)([A-Za-z]*)/g;
if ( $2 eq "y" | $2 eq "Y" ) {
print "Year is $1n";
} elsif ( $2 eq "mo" | $2 eq "MO") {
print "Month is $1n";
} elsif ( $2 eq "d" | $2 eq "D") {
print "Day is $1n";
} elsif ( $2 eq "h" | $2 eq "H") {
print "Hour is $1n";
} elsif ( $2 eq "m" | $2 eq "M") {
print "Minute is $1n";
} elsif ( $2 eq "s" | $2 eq "S" ) {
print "Second is $1n";
}
}
我尝试了三种不同的输入,它们是:
[random string] was failed 1y 2mo 3d 1h 51m 2s ago [some string]
[random string] was passed 2mo 3d 1h 51m 2s ago [some string]
asd sd asdg s passed 1y 2mo 3d 1h 2s
[random string] was failed 1y 4d 5h 3m 2s ago [some string]
所有三个的输出都相应地显示:
Result: failed
Year is 1
Month is 2
Day is 3
Hour is 1
Minute is 51
Second is 2
Result: passed
Month is 2
Day is 3
Hour is 1
Minute is 51
Second is 2
Result: passed
Year is 1
Month is 2
Day is 3
Hour is 1
Second is 2
Result: failed
Year is 1
Day is 4
Hour is 5
Minute is 3
Second is 2
以下是一些事情:
- 我没有使用
switch
,因为它可能会给出一个错误,说Can't locate Switch.pm in @INC (you may need to install the Switch module)
- 我已经尽力尽可能简化正则表达式,所以如果有人可以建议更好的正则表达式来选择,请发表评论。
- 这也是我第一次尝试用
perl
编程。如果有人找到改进代码的方法,请建议我。我将不胜感激。