2012-03-16 20 views
-7

私は文字列の始まりを印刷する方法は?

$t = '20110512102331'; 

を持っていると$tからのみ最初の4つの文字をご希望の場合。

どうすればよいですか?

+13

多くの場合、非常に基本的なものです。あなたはまだ文書を自分で検索することをまだ学んでいませんか?何故なの? – Konerak

+2

歴史に基づいて、私の本_Learning Perl_が役に立ったと思います。 :) –

答えて

2

最も簡単:substr機能を使用します。

my $firstfour = substr($t,0,4); 

もう一つの方法は、正規表現を使用することになります

my $firstfour = ($t =~ /(.{0,4}).*/s ? $1 : $t); 

または、短く、リストコンテキストで正規表現を呼び出すことにより:

my ($firstfour) = $t =~ /(.{0,4})/s; 
+2

'm /(。{4})/ ms'は"文字列の最初の4文字 "に適しています。もちろん、長さ4より短い文字列のコーナーケースがあります。文字列と同じ数の文字を返すという標準的な仮定です。だから、このケースでは、 'm /(。{1,4})/ ms'を実行することができます。 – Axeman

+2

@Axeman: '$ firstfour'を未定義のままにしておく、空の文字列の大文字小文字はまだ扱えません。 '/ m'修飾子もここでは無関係です。 '/(。{0,4})/ s'は正しいです。 – Borodin

+0

ありがとうAxeman、良い点! @Borodin:文字列が空のときに何が起こるかによって異なりますが、空の文字列を返すだけで意味があります。私は更新します! – Konerak

6

substrこのような機能を使用すると、

my $t = "20110512102331"; 
my $four = substr($t, 0, 4) 
2
$t='20110512102331'; 
print substr($t, 0, 4); 

詳細についてはperldoc -f substrを参照してください。

3

あなたの特定の問題については、文字列から年に見えるものを抽出すると、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あなたはフォーマットを記述することができれば、任意の日付形式を解析するための良い方法です。

実行する方法を問わず、実装の詳細をサブルーチンで隠すことができるので、プログラムの残りの部分を中断することなく変更することができます。

関連する問題