Perl 截取字符串的精确部分并存储第一个定界符

Perl cut exact part of the string and store the first delimiter

假设我有一个这种格式的变量:

my $time1 = "2021-01-02T11:12:00+01:00";

我想获取字符串的一部分,从 + 或最后一个 - 到最后一个 : 以及第一个分隔符应该是 +-

到目前为止我尝试了什么:

print (split(/\+/, $time))[0];

但它随后会打印:

01:00

而不是:

01

并且也不存储第一个分隔符。

您可以使用正则表达式更轻松地提取此类信息:

my $time1 = "2021-01-02T11:12:00+01:00";
($hourpart) = ($time1 =~ /.*[+-](\d{2}):\d{2}$/);
print($hourpart,"\n");

(你也可以使用 split,但需要多次调用 split)

如果您肯定长度不会改变(对于固定格式的日期字符串通常是正确的),您也可以尝试 substr

print(substr($time1, 20, 2),"\n");

请调查以下使用 split 填充散列的代码片段。然后你可以随心所欲地访问时间戳的任何部分。

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my $time1 = "2021-01-02T11:12:00+01:00";

my $date_time;
my @fields = qw/year month day hour minute second hour_tz minute_tz/;

$date_time->@{@fields} = split("[-+:T]",$time1);

say "Timestamp: " . $time1;
say Dumper($date_time);

my $tz;
$tz->@{qw/sign hour minute/} = $time1 =~ /([-+])(\d+):(\d+)\z/;

say Dumper($tz);

输出

Timestamp: 2021-01-02T11:12:00+01:00
$VAR1 = {
          'second' => '00',
          'day' => '02',
          'hour_tz' => '01',
          'year' => '2021',
          'minute' => '12',
          'hour' => '11',
          'month' => '01',
          'minute_tz' => '00'
        };

$VAR1 = {
          'hour' => '01',
          'sign' => '+',
          'minute' => '00'
        };

由于您正在解析 ISO 8601 日期时间字符串,您可能会考虑使用一些对日期时间字符串很智能的东西。

Date::Parse 可以为您提供以秒为单位的时区偏移量,您可以将其转换为整数小时(或您可能想做的任何其他操作):

use v5.10;
use Date::Parse;

my $datetime = '2021-01-02T11:12:00-01:30';

my @t = Date::Parse::strptime( $datetime );

say "Time zone offset in seconds: $t[-2]";
printf '%02d', abs($t[-2])/3600;

否则,Wes 的回答可能就是我要做的。