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 的回答可能就是我要做的。
假设我有一个这种格式的变量:
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 的回答可能就是我要做的。