如果我有
$t = '20110512102331';
并且只希望来自$t
的前4个字符。
我该怎么做?
答案 0 :(得分:6)
使用像这样的substr函数 -
my $t = "20110512102331";
my $four = substr($t, 0, 4)
答案 1 :(得分:3)
对于您的特定问题,从字符串中提取看似年份的内容,substr
意外地起作用,但这里确实是错误的答案。 “角色”的概念不是我们对“角色”的看法。请注意résumé
的不同规范化形式如何产生不同的结果。您可能需要前四个字形,可以与\X
匹配(尽管在ASCII中字形和字符给出相同的结果)
use v5.10.1;
use utf8;
use strict;
use warnings;
use Unicode::Normalize qw(NFD NFC);
my $string = '20110512102331';
say "$string → ", substr $string, 0, 4;
my $ustring = NFD( 'résumé' );
say "NFD $ustring → ", substr $ustring, 0, 4;
$ustring = NFC( 'résumé' );
say "NFC $ustring → ", substr $ustring, 0, 4;
$ustring = NFD( 'résumé' );
say "\\X with NFD $ustring → ", $ustring =~ m/(\X{4})/;
$ustring = NFC( 'résumé' );
say "\\X with NFC $ustring → ", $ustring =~ m/(\X{4})/;
请注意NFD结果不同:
$ perl -C substr.pl
20110512102331 → 2011
NFD résumé → rés
NFC résumé → résu
\X with NFD résumé → résu
\X with NFC résumé → résu
但是,substr
确实有一些Unicode功夫,如果你从Unicode::GCString给它一个字符串:
use v5.10.1;
use utf8;
use strict;
use warnings;
use Unicode::GCString;
use Unicode::Normalize qw(NFD);
my $gcstring = Unicode::GCString->new( NFD('résumé') );
say "$gcstring → ", $gcstring->substr( 0, 4 );
这得到了正确的结果:
$ perl -C gcsubstr.pl
résumé → résu
然而,所有这些都解决了字符串不仅仅是一组字符。这些字符具有特殊含义,因此您可以使用该特殊含义来做正确的事情,而无需考虑字符串操作。如果您可以描述格式,DateTime::Format::Strptime是解析任意日期格式的好方法:
use v5.10.1;
use utf8;
use strict;
use warnings;
use DateTime::Format::Strptime;
my $Strp = DateTime::Format::Strptime->new(
pattern => '%Y%m%d%H%M%S',
);
my $Strf = DateTime::Format::Strptime->new(
pattern => '%Y',
);
my $dt = $Strp->parse_datetime('20110512102331');
my $year = $Strf->format_datetime($dt);
say "year is $year";
您可能还想查看How can I parse dates and convert time zones in Perl?。
无论您决定如何操作,都可以在子程序中隐藏实现细节,以便在不中断程序其余部分的情况下进行更改。
答案 2 :(得分:2)
最简单:使用substr功能:
my $firstfour = substr($t,0,4);
另一种方法是使用正则表达式:
my $firstfour = ($t =~ /(.{0,4}).*/s ? $1 : $t);
或更短,通过在列表上下文中调用regexp:
my ($firstfour) = $t =~ /(.{0,4})/s;
答案 3 :(得分:2)
$t='20110512102331';
print substr($t, 0, 4);
有关详细信息,请参阅perldoc -f substr。