回答
最簡單:使用substr功能:
my $firstfour = substr($t,0,4);
另一種方法是使用正則表達式:
my $firstfour = ($t =~ /(.{0,4}).*/s ? $1 : $t);
,或者更短,通過調用列表環境正則表達式:
my ($firstfour) = $t =~ /(.{0,4})/s;
'm /(。{4})/ ms'更適合「字符串的前四個字符」。當然,弦長小於長度4的情況也是如此。標準假設將返回字符串所具有的字符數量。所以我們可以這樣做:'m /(。{1,4})/ ms'。 – Axeman 2012-03-16 12:10:12
@Axeman:仍然不處理空字符串的情況,這會使$ firstfour未定義。另外'/ m'限定符在這裏是不相關的。 '/(。{0,4})/ s'是正確的。 – Borodin 2012-03-16 13:16:22
謝謝Axeman,好點! @Borodin:它取決於當一個字符串爲空時應該發生什麼,但是「只返回一個空字符串」是有道理的。我會更新! – Konerak 2012-03-16 13:50:59
通過使用這樣的substr功能 -
my $t = "20110512102331";
my $four = substr($t, 0, 4)
$t='20110512102331';
print substr($t, 0, 4);
更多信息請參見perldoc -f substr。
對於您的特定問題,從字符串中提取似乎是年份,substr
意外地起作用,但在這裏確實是錯誤的答案。 「性格」的概念不是我們的「性格」概念。請注意0的不同歸一化形式如何產生不同的結果。你可能想前四個字形,您可以用\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);
這得到正確的RESU lt:
$ 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?。
你決定這樣做,你可以隱藏子程序的實現細節,所以你可以在不破壞程序的其餘部分改變方式不管。
- 1. 如何使用awk打印以特定字符串開頭的多行段
- 2. 如何打印字典字符串
- 3. 如何打印字符串的標籤
- 4. 打印字符串
- 5. 如何在javascript中打印字符串(數字)打印
- 6. 如何打印類型(任何字符串(IO字符串))?
- 7. C++如何向後打印字符串?
- 8. 如何在JTextField上打印字符串
- 9. erlang如何打印unicode字符串?
- 10. 如何打印不匹配字符串
- 11. 如何打印字符串「\ n」
- 12. 如何打印子字符串?
- 13. 如何打印v字符串?
- 14. 如何打印字符串C++ MFC
- 15. 如何在另一個字符串之後打印字符串?
- 16. 打印字符串的字符
- 17. RegEx匹配字符串開頭的符號或字符串本身的開頭
- 18. 如何在c#中打印字符串到打印機?
- 19. 如何用打印機打印字符串?
- 20. 打印出以兩個不同的字符串輸出開頭的行嗎?
- 21. LUA字符串打印
- 22. 打印編碼字符串
- 23. 打印「在Java字符串
- 24. 打印json到字符串
- 25. 打印字符串反向
- 26. 打印一個字符串
- 27. 打印多行字符串
- 28. 向後打印字符串
- 29. 打印字符串先後
- 30. 打印字符串在python
你問了很多Perl問題,通常都是非常基本的東西。您現在還沒有學會自己搜索文檔嗎?爲什麼不? – Konerak 2012-03-16 10:12:42
根據你的歷史,我認爲我的書_Learning Perl_可以提供幫助。 :) – 2012-03-16 21:31:15