如何打印字符串的开头?

时间:2012-03-16 10:00:35

标签: perl

如果我有

$t = '20110512102331';

并且只希望来自$t的前4个字符。

我该怎么做?

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