最終更新日: 2025年8月22日
HubLでは、テンプレートのロジックと機能を拡張するための主な演算子と式評価をサポートしています。演算子を使用すると、算術関数の実行、比較、テンプレートロジックの複雑化、マークアップのレンダリングの変更を行うことができます。この記事では、HubLで使用できる式評価も含めて紹介します。

演算子

演算子は、HubLコンパイラーに対して各種の演算を行うよう指示する記号です。これらの演算の結果、最終出力が生成されます。演算子は、算術関数の実行、比較、ブール式の実装などのために、2つの値を関連付けるためにオペランド間に配置されます。
operators-and-operands-diagram
以下は、HubLで使用できる演算子をタイプ別にまとめたものです。

数学

標準の算術演算子を使用して、テンプレートのコンテキストで値を計算できます。
{% set my_num = 11 %}
{% set my_number = 2 %}

{{ my_num + my_number }}
<!-- 11 + 2 = 13 -->

{{ my_num - my_number }}
<!-- 11 - 2 = 9 -->

{{ my_num / my_number }}
<!-- 11 / 2 = 5.5 -->

{{ my_num % my_number }}
<!-- 11 % 2 = 1 -->

{{ my_num // my_number }}
<!-- 11 // 2 = 5 -->

{{ my_num * my_number }}
<!-- 11 * 2 = 22 -->

{{ my_num ** my_number }}
<!-- 11 ** 2 = 121 -->
記号説明
+2つのオブジェクト(通常は数値)を加算します。文字列やリストを連結させるには、代わりに~演算子を使用する必要があります。
-ある数値を別の数値から減算します。
/数値を除算します。
%数値を除算した余りを返します。
//2つの数値を除算した余りを整数に切り捨てて返します。たとえば、{{ 20 // 7 }}2です。
*数値を乗算します。
**左辺のオペランドを右辺のオペランドで累乗します。

比較

比較演算子を使用すると、テンプレートロジックに対して値を評価できます。if文で、比較演算子の使用例を確認できます。
{% set my_num = 11 %}
{% set my_number = 2 %}

{{ my_num == my_number }}
<!-- Evaluates to false -->

{{ my_num != my_number }}
<!-- Evaluates to true -->

{{ my_num > my_number }}
<!-- Evaluates to true -->

{{ my_num >= my_number }}
<!-- Evaluates to true -->

{{ my_num < my_number }}
<!-- Evaluates to false -->

{{ my_num <= my_number }}
<!-- Evaluates to false -->
記号省略形説明
==eq次の値に等しい。2つのオブジェクトの値が等しい場合、trueと評価されます。
!=ne次の値に等しくない。2つのオブジェクトが等しくない場合、trueと評価されます。
>gt次の値より大きい。左辺のオペランドの値が右辺のオペランドの値よりも大きい場合、trueと評価されます。
>=gte次の値以上。左辺のオペランドが右辺のオペランドと同じかそれよりも大きい場合、trueと評価されます。
<lt次の値より小さい。左辺のオペランドが右辺のオペランドよりも小さい場合、trueと評価されます。
<=lte次の値以下。左辺のオペランドが右辺のオペランドと同じかそれより小さい場合、trueと評価されます。
短縮形の比較演算子は、|selectattr()などの式を評価するHubLフィルターで使用できます。

論理

論理演算子を使用すると、ブール式を実装するだけでなく、複数の式を1つのステートメント(文)に結合できます。
Two non-empty strings:
{{ "a" and "b" }}
<!-- Evaluates to true -->

Empty string and non-empty string:
{{ "" and "b" }}
<!-- Evaluates to false -->

Two non-zero numbers:
{{ 1 and 2 }}
<!-- Evaluates to true -->

Zero and non-zero number:
{{ 0 and 1 }}
<!-- Evaluates to false -->

Two non-empty lists:
{{ [1] and [2] }}
<!-- Evaluates to true -->

Empty list and non-empty list:
{{ [] and [2] }}
<!-- Evaluates to false -->

Two non-empty dicts:
{{ {a: 1} and {b: 2} }}
<!-- Evaluates to true -->

Empty dict and non-empty dict:
{{ {} and {b: 2} }}
<!-- Evaluates to false -->
記号説明
and左辺のオペランドと右辺のオペランドの両方がtruthyの場合にtrueを返します。それ以外の場合は、falseを返します。

この演算子は、Pythonのand演算子やJavaScriptの&&演算子のようには動作しません。and演算子の使用の詳細については、以下をご覧ください。
or第1オペランドがtruthyの場合に、そのオペランドを返します。それ以外の場合は、第2オペランドを返します。

この演算子は、PythonおよびJavaScriptのor|| 相当します。or演算子の使用の詳細については、以下をご覧ください。
is肯定文の2つのオペランドを結合します。
notステートメント(文)をisと組み合わせて否定します。
(expr)演算順を示すために、式をグループ化します。例:(10 - 2) * variable
?三項演算子を使用すると、条件付きロジックをすばやく記述できます。3つの引数(式、true条件、false条件)を受け入れます。式を評価し、該当した条件を返します。
AND/OR演算子の使用 HubLでは、or演算子はPythonのor演算子やJavaScriptの||演算子のように動作します。式がtrueと評価された場合は第1オペランドを返し、それ以外の場合は第2オペランドを返します。or演算子の一般的な使用例は、変数値が定義されていない場合のフォールバック値の設定です。
Two non-empty strings:
{{ "a" or "b" }}
<!-- Evaluates to "a" -->

Empty string and non-empty string:
{{ "" or "b" }}
<!-- Evaluates to "b" -->

Defining a fallback value:
{{ some_variable or "default value" }}
<!-- If some_variable is defined, print its value,
otherwise print "default value" -->
ただし、and演算子は、Pythonのand演算子やJavaScriptの&&演算子とは異なる動作をします。HubLでは、andは常にブール値を返します。式がtrueと評価された場合はtrueが返され、それ以外の場合はfalseが返されます。一方、PythonとJavaScriptの演算子は、ステートメント(文)がtrueとfalseのどちらとして評価されるかに基づいてオペランド値を返します。
Two non-empty strings:
{{ "a" and "b" }}
<!-- Evaluates to true -->

Empty string and non-empty string:
{{ "" and "b" }}
<!-- Evaluates to false -->
HubLでは、空のリスト([])と空のディクショナリー({})はfalsyと見なされます。これはPythonでの動作と同等ですが、[]{}がtruthyであるJavaScriptとは異なります。
Empty list and non-empty list:
{{ [] or [2] }}
<!-- Evaluates to [2] -->

Empty dict and non-empty dict:
{{ {} and {b: 2} }}
<!-- Evaluates to false -->

その他のHubL演算子

以下に、さまざまなタスクを実行するために使用できる、その他の重要なHubL演算子を示します。
記号説明
in値がシーケンス内に含まれているかどうかをチェックします。
is式評価を実行します。
|フィルターを適用します。
~値を連結します。

式評価

式評価は、論理演算子を使用して評価できる各種のブール条件です。

boolean

オブジェクトがブール値かどうかを評価します(厳密なチェックであり、truthy式の評価ではありません)。
{% set isActive = false %}

{% if isActive is boolean %}
isActive is a boolean
{% endif %}

containing

変数のリストに値が含まれているかどうかを評価します。
{% set numbers = [1, 2, 3] %}

{% if numbers is containing 2 %}
Set contains 2!
{% endif %}

containingall

変数のリストに別のリストの全ての値が含まれているかどうかを評価します。
{% set numbers = [1, 2, 3] %}

{% if numbers is containingall [2, 3] %}
Set contains 2 and 3!
{% endif %}

{% if numbers is containingall [2, 4] %}
Set contains 2 and 4!
{% endif %}

defined

変数がテンプレートのコンテキスト内で定義済みかどうかを評価します。演算子を使わずにif文を記述してこの式評価を使用することもできますが、その場合は既定で、変数が定義されているかどうかだけがチェックされます。 以下の例では、カラーモジュールのcolorパラメーターがテストされます。Colorパラメーターに値がない場合、テンプレートは既定の背景色として黒をレンダリングします。値が定義されている場合、ユーザーが設定した背景色がテンプレートによってレンダリングされます。
{% color "my_color" color="#930101", export_to_template_context=True %}
<style>
{% if widget_data.my_color.color is defined %}
body{
background: {{ widget_data.my_color.color }};
}
{% else %}
body{
background: #000;
}
{% endif %}
</style>

divisibleby

オブジェクトを別の数値で割り切れるかどうかを評価します。 例えば、以下のforループは、動物の種類のリストを反復処理するために作成されています。動物の各種類がdiv内に出力され、5つ目ごとのdivに異なるインラインスタイルが適用されます(幅: 100%)。このコンセプトをブログに適用すると、特定のパターンの記事に別のマークアップをレンダリングできます。Forループとloop.indexの詳細については、こちらの記事を参照してください
{% set animals = ["lions", "tigers", "bears", "dogs", "sharks"] %}
{% for animal in animals %}
{% if loop.index is divisibleby 5 %}
<div style="width:100%">{{animal}}</div>
{% else %}
<div style="width:25%">{{animal}}</div>
{% endif %}
{% endfor %}

equalto

変数の値が定数または別の変数の値と等しいかどうかを評価します。これと同じ評価は、==演算子を使用して行うこともできます。 以下の例では、ループ内の投稿の合計数に応じてブログ記事の幅を調整します。この出力例では、ブログに4件の記事があると仮定しています。
{% for content in contents %}
{% if loop.length is equalto 2 %}
<div style="width:50%;">Post content</div>
{% elif loop.length is equalto 3 %}
<div style="width:33.333332%;">Post content</div>
{% elif loop.length is equalto 4 %}
<div style="width:25%;">Post content</div>
{% else %}
<div style="width:100%;>Post content</div>
{% endif %}
{% endfor %}

even

数値型変数の値が偶数かどうかを評価します。 以下の例は、単純化したブログリストのループを示しています。この例では、ループの現在の反復処理での値が偶数の場合、その投稿アイテムのdivにeven-postクラスを割り当てます。それ以外の場合は、odd-postクラスを割り当てます。
{% for content in contents %}
{% if loop.index is even %}
<div class="post-item even-post">Post content</div>
{% else %}
<div class="post-item odd-post">Post content</div>
{% endif %}
{% endfor %}

float

数値型変数の値が浮動小数点数かどうかを評価します。
{% set quantity = 1.20 %}
{% if quantity is float %}
quantity is a floating point number
{% endif %}

integer

変数が整数かどうかを評価します。
{% set quantity = 120 %}
{% if quantity is integer %}
Quantity is an integer
{% endif %}

iterable

変数がループ処理を適用できるかどうかを評価します。 以下の例では、jobsという変数が反復可能かどうかをチェックします。この変数にジョブのリストが格納されている場合、if文trueと評価されて、ループが実行されます。変数に1つの値しか格納されていない場合は、if文により、別のマークアップを使用してその値が出力されます。ループの詳細については、こちらを参照してください
{% set jobs = ["Accountant", "Developer", "Manager", "Marketing", "Support"] %}

{% if jobs is iterable %}
<h3>Available positions</h3>
<ul>
{% for job in jobs %}
<li>{{ job }}</li>
{% endfor %}
</ul>
{% else %}
<h3>Available position</h3>
<div class="single-position">{{ jobs }}</div>
{% endif %}

lower

文字列が小文字かどうかを評価します。 以下の例では、unless文と小文字フィルターを使用して、テキストモジュールに入力されるテキストの文字列が常に小文字になるようにしています。
{% module "my_text" path="@hubspot/text" label="Enter text", value="Some TEXT that should be Lowercase", export_to_template_context=True %}

{% unless widget_data.my_text.value is lower %}
{{ widget_data.my_text.value|lower }}
{% endunless %}

mapping

オブジェクトがディクショナリー(辞書型)かどうかを評価します。 以下の例では、contactオブジェクトが辞書型かどうかをチェックしています。
{% if contact is mapping %}
This object is a dictionary.
{% else %}
This object is not a dictionary.
{% endif %}

none

変数にnull値があるかどうかを評価します。
{% module "user_email" path="@hubspot/text" label="Enter user email", value="example@hubspot.com", export_to_template_context=True %}
{% unless widget_data.user_email.value is none %}
{{ widget_data.user_email.value }}
{% endunless %}

number

変数の値が数値かどうかを評価します。 以下の例では、変数をチェックして、数かどうかを調べ、数の場合は百万に変換します。
{% set my_var = 40 %}
{% if my_var is number %}
{{ my_var * 1000000 }}
{% else %}
my_var is not a number.
{% endif %}

odd

数値型変数の値が奇数かどうかを評価します。 以下の例は、前述のeven式評価の例の逆バージョンです。
{% for content in contents %}
{% if loop.index is odd %}
<div class="post-item odd-post">Post content</div>
{% else %}
<div class="post-item even-post">Post content</div>
{% endif %}
{% endfor %}

sameas

2つの変数の値が同じかどうかを評価します。 以下の例では、2つの変数を設定してから、これらの変数の値が同じかどうかをチェックします。
{% set var_one = True %}
{% set var_two = True %}
{% if var_one is sameas var_two  %}
The variables values are the same.
{% else %}
The variables values are different.
{% endif %}

sequence

iterable評価と同様に、この式評価では変数がシーケンスかどうかをチェックします。 以下の例では、変数がシーケンスかどうかを評価してから、音楽ジャンルのシーケンスを反復処理します。
{% set genres = ["Pop", "Rock", "Disco", "Funk", "Folk", "Metal", "Jazz", "Country", "Hip-Hop", "Classical", "Soul", "Electronica" ] %}
{% if genres is sequence %}
<h3>Favorite genres</h3>
<ul>
{% for genre in genres %}
<li>{{ genre }}</li>
{% endfor %}
</ul>
{% else %}
<h3>Favorite genre:</h3>
<div class="single-genre">{{ genres }}</div>
{% endif %}

string

変数の値が文字列であるかどうかを評価します。 以下の例では、変数をチェックして、それが文字列かどうかを調べます、文字列の場合はタイトルフィルターを適用して大文字に変更します。
{% set my_var = "title of section" %}
{% if my_var is string %}
{{ my_var|title }}
{% else %}
my_var is not a string
{% endif %}

string_containing

指定された部分文字列が別の文字列に含まれているかどうかを評価します。この式評価はis演算子と組み合わせて使用します。
{% if content.domain is string_containing ".es" %}
Markup that will only render on content hosted on .es domains
{% elif content.domain is string_containing ".jp" %}
Markup that will only render on content hosted on .jp domains
{% else %}
Markup that will render on all other domains
{% endif %}

string_startingwith

文字列が特定の文字列で始まるかどうかを評価します。is演算子と組み合わせて使用します。
{% if content.slug is string_startingwith "es/" %}
Markup that will only render on content hosted in a /es/ subdirectory
{% elif content.slug is string_startingwith "jp/" %}
Markup that will only render on content hosted in a /jp/ subdirectory
{% else %}
Markup that will render on all subdirectories
{% endif %}

truthy

式がTrueとして評価されるかどうかを評価します。 以下の例では、ブール値チェックボックスモジュールを使用してアラートメッセージを表示します。
{% boolean "check_box" label="Show alert", value=True, export_to_template_context=True %}

{% if widget_data.check_box.value is truthy %}
<div class="alert">Danger!</div>
{% endif %}

undefined

テンプレートのコンテキスト内で変数が未定義かどうかを評価します。この評価はnone式評価とは異なります。undefined式評価でtrueが返されるのは、変数が存在しても値が格納されていない場合です。一方、none式評価では変数にnull値が格納されている場合にtrueが返されます。 以下の例では、テンプレートで変数”my_var”の有無をチェックします。
{% if my_var is undefined %}
A variable named "my_var" does not exist on this template.
{% else %}
{{ my_var }}
{% endif %}

upper

文字列がすべて大文字かどうかを評価します。以下の例は、前述lower式評価の例の逆バージョンです。
{% module "my_text" path="@hubspot/text" label="Enter text", value="Some TEXT that should be Uppercase", export_to_template_context=True %}

{% unless widget_data.my_text.value is upper %}
{{ widget_data.my_text.value|upper }}
{% endunless %}

within

変数がリスト内に存在するかどうかを評価します。
{% set numbers = [1, 2, 3] %}

{% if 2 is within numbers %}
2 is in the list!
{% endif %}

{% if 4 is within numbers %}
4 is in the list!
{% endif %}