Как было отмечено в других ответах, ваше регулярное выражение не совпадает, и поэтому $1
и $2
не определены. Необходимо всегда проверять соответствие соответствующих регулярных выражений перед использованием этих переменных.
Ниже я обновил ваш скрипт с помощью некоторого правильного кода на Perl. +=
и %=
являются в этом случае удобным оператором. Вы можете прочитать о них в perlop
Ваше регулярное выражение использует \S*
и \s*
, оба из которых здесь совершенно не нужны, поскольку ваше регулярное выражение не привязано ни к чему другому. Другими словами, \S*foo\s*
будет соответствовать любой строке, содержащей foo
, так как она может соответствовать пустой строке вокруг foo
. Кроме того, {2,2}
означает «совпадение не менее 2 раз, максимум 2», что в действительности аналогично {2}
«совпадение 2 раза».
Вы увидите, что я изменил вашу математику, и это потому, что предполагается, что $mins
никогда не будет выше 120. Я полагаю, что технически это безопасное предположение, но, делая это, как показано ниже, он может справиться со всеми значения минут и успешно превратить их в часы.
Сценарий ниже для демонстрации. Если вы удалите DATA
и оставите <>
, вы можете использовать этот скрипт как есть:
last user | perl script.pl
Код:
use strict;
use warnings;
use v5.10; # required for say()
my ($hours, $mins);
while (<DATA>) { # replace with while (<>) for live usage
if (/\((\d{2})\:(\d{2})\)/) {
$hours += $1;
$mins += $2;
if( $mins >= 60 ) {
$hours += int ($mins / 60); # take integer part of division
$mins %= 60; # remove excess minutes
}
}
}
say "Hours: $hours";
say "Mins : $mins";
__DATA__
1. dodohert pts/1 pc-618-012.omhq. Wed Feb 8 09:19 still logged in
2. dodohert pts/6 ip98-168-203-118 Tue Feb 7 19:19 - 20:50 (01:31)
3. dodohert pts/3 137.48.207.178 Tue Feb 7 14:00 - 15:06 (01:05)
4. dodohert pts/1 137.48.219.250 Tue Feb 7 12:32 - 12:36 (00:04)
5. dodohert pts/21 137.48.207.237 Tue Feb 7 12:07 - 12:23 (00:16)
6. dodohert pts/11 ip98-168-203-118 Mon Feb 6 20:50 - 23:29 (02:39)
7. dodohert pts/9 ip98-168-203-118 Mon Feb 6 20:31 - 22:57 (02:26)
8. dodohert pts/5 pc-618-012.omhq. Fri Feb 3 10:24 - 10:30 (00:05)