2011-08-17 17 views
4

私は以下のような名前の配列を持っています。配列要素間に 'AND'を印刷するには?

"Hi joe and jack and john"を印刷するにはどうすればよいですか?

アレイに名前が1つしかない場合でもアルゴリズムは機能するはずです。

#!/usr/bin/perl 

use warnings; 
use strict; 

my @a = qw /joe jack john/; 

my $mesg = "Hi "; 

foreach my $name (@a) { 

    if ($#a == 0) { 
    $mesg .= $name; 
    } else { 
    $mesg .= " and " . $name; 
    } 
} 

print $mesg; 
+0

http://www.ideone.com/iN2dt? – Konerak

答えて

8

通常我々は、配列がこれを達成する方法を結合を使用します。ここで擬似コード:

@array = qw[name1 name2 name2]; 
print "Hey ", join(" and ", @array), "."; 
+0

Henningに感謝してこれをPerlに変換してください。しかし、コンセプトは同じです。 –

2

未テスト:

{ local $, = " and "; print "Hi "; print @a; } 
+0

ワンライナーをテストするにはどうすればよいですか? 'perl -e'を実行してください! (私は冗談を言っています:p) – Yuji

+0

'$、'とはどういう意味ですか? –

+3

$、means:配列要素間で出力する文字列です。 – Ingo

2

特殊変数$"を使用してください。

$"="and"; #" (this last double quote is to help the syntax coloring) 
$mesg="Hi @a"; 
+0

それは動作します。しかし、なぜ? =) '$"はどういう意味ですか? –

+1

@Sandraこのマニュアルを読む:http://perldoc.perl.org/perlvar.html – Yuji

2

perldoc perlvarの回答を収集するには、(少なくとも)2つのいずれかを行うことができます。

1)を設定$"(区切り):配列または配列スライスが二重引用符で囲まれた文字列または /.../のような同様のコンテキストに補間さ

、その要素であります をこの値で区切ります。デフォルトはスペースです。例えば、この:

print "The array is: @array\n"; 

これに相当する:

print "The array is: " . join($", @array) . "\n"; 

=>$"ストリング

2にアレイの補間の挙動に影響を与えます)$,(出力フィールドセパレータ)を設定します。

印刷オペレータの出力フィールドセパレータ。定義されている場合、この の値は、各印刷の引数の間に印刷されます。デフォルトはundefです。 ニーモニック:printステートメントに "、"があるときに出力されるもの。

=>$,は、printステートメントの動作に影響します。

いずれかが機能し、localと一緒に使用して、囲みスコープ内でのみ特殊変数の値を設定することができます。私は推測の違いは、$"を使用すると、printコマンドに限定されるものではないということです:「魔法」がない、印刷コマンドで3行目にたまたまここ

my @z = qw/ a b c /; 
local $" = " and "; 
my $line = "@z"; 
print $line; 

実際には、joinを使用するのが最も読みやすく、小さな囲みブロックを使用しない限り、将来の読者は魔法の変数の設定に気付かず(たとえば、トップに近い)、行動が期待どおりの正常なパフォーマンス小さなワンオフやワンライナーのためにこれらの手口を省き、生産コード用の可読なjoinを使用します。