答えて
最も簡単: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文字 "に適しています。もちろん、長さ4より短い文字列のコーナーケースがあります。文字列と同じ数の文字を返すという標準的な仮定です。だから、このケースでは、 'm /(。{1,4})/ ms'を実行することができます。 – Axeman
@Axeman: '$ firstfour'を未定義のままにしておく、空の文字列の大文字小文字はまだ扱えません。 '/ m'修飾子もここでは無関係です。 '/(。{0,4})/ s'は正しいです。 – Borodin
ありがとうAxeman、良い点! @Borodin:文字列が空のときに何が起こるかによって異なりますが、空の文字列を返すだけで意味があります。私は更新します! – Konerak
substrこのような機能を使用すると、
my $t = "20110512102331";
my $four = substr($t, 0, 4)
$t='20110512102331';
print substr($t, 0, 4);
詳細についてはperldoc -f substrを参照してください。
あなたの特定の問題については、文字列から年に見えるものを抽出すると、substr
が誤って動作しますが、ここでは間違った答えです。 「キャラクター」という考えは、「キャラクター」という考え方ではありません。 résumé
の異なる正規化された形式が異なる結果をどのように生成するかに注目してください。しかし、
$ 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
:(ASCIIに書記素と文字が同じ結果を与えるが)あなたはおそらくNFD結果が異なっているのお知らせ
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})/;
あなたは
\X
と一致させることができ、最初の4つの書記素を、したいです
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を取得します:substr
は、あなたがそれをUnicode::GCStringから文字列を与えた場合、一部のUnicodeカンフーを持っていますlt:
$ perl -C gcsubstr.pl
résumé → résu
ただし、すべての文字列が文字の集合以上のものになります。これらの文字は特別な意味を持っているので、文字列操作について考えることなく、その特別な意味を使って適切なことを行うことができます。
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?を見たいかもしれません:DateTime::Format::Strptimeあなたはフォーマットを記述することができれば、任意の日付形式を解析するための良い方法です。
実行する方法を問わず、実装の詳細をサブルーチンで隠すことができるので、プログラムの残りの部分を中断することなく変更することができます。
- 1. gdbのNULで始まる印刷文字列
- 2. Javascript配列 - 文字列のみを印刷する方法
- 3. 印刷文字列
- 4. 文字列をスペースで区切らずに文字列で印刷する方法はありますか?
- 5. 文字配列内の文字を重複なく印刷する方法は?
- 6. アルファベットの文字で始まる行を印刷する
- 7. ハッシュセットのリストから文字列を印刷する方法
- 8. 文字列の印刷
- 9. 印刷文字列の逆
- 10. 文字列の印刷(アセンブリ)
- 11. Java:文字列メソッドで見積もりを印刷する方法は?
- 12. C文字列を印刷ジャンク文字
- 13. 文字列に合計を入れて印刷する方法
- 14. タイムゾーンで日付文字列を印刷する方法
- 15. アセンブリ言語で文字列を印刷する方法
- 16. Ada:列挙型を小文字で印刷する方法
- 17. 文字列[C]の最初の文だけを印刷する方法は?
- 18. リバース文字列を文字列で印刷しますか?
- 19. クリスタルレポート9印刷文字列
- 20. 印刷文字列 - C
- 21. ユニコード文字を作成、割り当て、印刷する方法
- 22. stderr.write;文字列を印刷する
- 23. Javaで文字列の配列を印刷/ログする方法は?
- 24. 文字列に印刷できない文字を表示する方法
- 25. 文字列をそのままPythonで印刷するには
- 26. 印刷可能なcharctersのみをバイナリファイル(Linuxでは文字列と同等)で印刷する方法は?
- 27. TASM文字列の文字を印刷します。
- 28. 印刷する文字列の数を制限する方法は?
- 29. C++文字列を後方に印刷するには?
- 30. Javaすべての文字列の配列をランダムに印刷する方法
多くの場合、非常に基本的なものです。あなたはまだ文書を自分で検索することをまだ学んでいませんか?何故なの? – Konerak
歴史に基づいて、私の本_Learning Perl_が役に立ったと思います。 :) –