# 記号

CFML では、# 記号は特別な意味を持っています。ColdFusion では、# 記号で区切られたテキストの処理は、普通のテキストと異なります。ColdFusion は、式を処理するときに、式のテキストとそれを囲んでいる # 記号を、結果の値で置き換えます。

たとえば、"Form.MyFormVariable" という変数から現在の値を出力するには、変数名を # 記号で区切る必要があります。

<CFOUTPUT> 値は #Form.MyFormVariable# です。</CFOUTPUT>

上の例では、式 #Form.MyFormVariable# は、それに割り当てられた値と置き換えられています。

# 記号を使用するときは、次のガイドラインに従ってください。

次の節では、CFML における # 記号の使い方について詳しく説明します。

cfoutput タグ内の # 記号

1 つの変数または 1 つの関数を持つ式は、その式が # 記号によって囲まれている限り、CFOUTPUT タグ内で自由に使うことができます。

<cfoutput>
  値は #Form.MyTextField# です。
</cfoutput>

<cfoutput>
  名前は #FirstName# #LastName# です。
</cfoutput>

<cfoutput>
  Cos(0) は #Cos(0)# です。
</cfoutput>

# 記号が省略されると、cfoutput 文により生成された出力には式の値ではなく式のテキストが表示されます。

# 記号内の 2 つの式は、以下のように並べることができます。

<cfoutput>
  "Mo" と "nk" を連結すると #Left("Moon", 2)# #Mid("Monkey", 3, 2)#
</cfoutput>

複合式と cfoutput タグ

1 つ以上の変数または関数を含む複合式は、cfoutput タグ内に挿入できません。次の例は、エラーになります。

<cfoutput>1 + 1 は #1 + 1# です。</cfoutput>

cfoutput 文によって生成された出力に複合式の値を挿入するには、次のように、cfset を使用し変数を式の値に設定し、cfoutput 文内でその変数を使用します。

<cfset Result = 1 + 1>
<cfoutput>1 + 1 は #Result# です。</cfoutput>

文字列内の # 記号

1 つ以上の変数または関数を含む式は、# 記号で囲まれている場合は文字列内で使用できます。

<cfset TheString = " 値は #Form.MyTextField# です。">
<cfset TheString = " 名前は #FirstName# #LastName# です。">
<cfset TheString = "Cos(0) は #Cos(0)# です。">

ColdFusion の式テキストは、変数の値または関数によって返される値で自動的に置き換えられます。たとえば、次の 2 つの cfset 文では、同じ結果が出力されます。

<cfset TheString = " こんにちは、#FirstName#!">
<cfset TheString = " こんにちは、" & FirstName & "!">

# 記号が省略される場合、式の値ではなく式のテキストが文字列に表示されます。たとえば、次の 2 つの cfset 文では、同じ結果が出力されます。

<cfset TheString = " こんにちは、FirstName!">
<cfset TheString = " こんにちは、" & "First" & "Name!">

cfoutput 文の場合と同様に、文字列では、次のように、2 つの式を並べることができます。

<cfset TheString="Monk は #Left("Moon", 2)##Mid("Monkey", 3, 2)# です。">

"Moon" と "Monkey" の前後の二重引用符は、エスケープ処理させる (""Moon"" と ""Monkey""のように二重に引用符で囲む) 必要はありません。その理由は、# 記号の間のテキストが、文字列にその値が挿入される前に評価される式として扱われるためです。

文字列への複合式の挿入

1 つ以上の演算子を持つ複合式は、文字列内で使用することはできません。次の例は、エラーになります。

<cfset TheString = "1 + 1 は #1 + 1# です。">

複合式の値を文字列に挿入するには、次の処理のいずれかを行います。

両方のテクニックは次の例で示されています。

<cfset Result = 1 + 1>
<cfset TheString = "1 + 1 は #Result# です。">
<cfset TheString = "1 + 1 は " & (1 + 1) です。>

文字列に # 記号を挿入するには、次のように 2 つの # 記号を使います。

<cfset TheString = " これはポンド記号 ## です。">

タグ属性値内の # 記号

文字列内で # 記号を使うときの規則は、タグ属性値内で # 記号を使うときにも適用されます。次の例では、そのポイントを示します。

<cfcookie name = "TestCookie"
  value = " 値は #CookieValue# です。">

タグ属性の値が変数、関数、または配列要素である場合は、次の構文を使います。

<cfcookie name = "TestCookie"
  value = #CookieValue#>
<cfcookie name = "TestCookie"
  value = #CookieValueArray[Index]#>

この使用法は value = "#CookieValue#" よりも効率的です。

カスタム タグ属性値内の # 記号

前の節で説明したルールがカスタム タグに適用されます。しかし、属性値として ColdFusion タグでは持つことのできない複合オブジェクトを、カスタム タグでは持つことができます。配列、連想配列、クエリ、COM オブジェクトなどの複合オブジェクトは、# 記号によって囲まれて、カスタム タグに渡されます。たとえば、次のとおりです。

<cfset myinfo = StructNew()>
<CF_FillInMyInfo info = #myinfo# name = "pete" size = "22">

ネストされた # 記号

# 記号が同じ式の中でネストできるケースは非常にまれです。次の例では、ネストされた # 記号の正しい使い方を示しています。

<cfset Sentence = " フル ネームの長さは
#Len("#FirstName# #LastName#")# です。">

Len 関数によって長さが計算される文字列に変数 FirstName および LastNameの値が挿入されるように # 記号をネストする必要があります。ネストされた # 記号があることは、複合式が存在することを意味します。たとえば、上記の CFML は、書き直して読みやすくすることができます。

<cfset FullName = "#FirstName# #LastName#">
<cfset Sentence = " フル ネームの長さは
  #Len(FullName)# です。">

次のように関数の引数の前後に # 記号を置くのは誤りです。

<cfset ResultText = "#Len(#TheText#)#">
<cfset ResultText = "#Min(#ThisVariable#, 5 + #ThatVariable#)#">
<cfset ResultText = "#Len(#Left("Some text", 4)#)#">

これらの文はエラーになります。一般的な規則として、関数の引数の前後に決して # 記号を置かないでください。

一般的な式内の # 記号

Macromedia 社では、必要なときだけ # 記号を使用することをお勧めします。次の例では、推奨する変数参照方法を示します。

<cfset SomeVar = Var1 + Max(Var2, 10 * Var3) + Var4>

対照的に、次の例では、不必要な場合にも # 記号を使っています。

<cfset #SomeVar# = #Var1# + #Max(Var2, 10 * Var3)# + #Var4#>