Perlでconstant(定数)をhashのキーに使う

2021-04-19
perl
    

目次

概要

Perlでconstant(定数)をhashのキーに使う方法でハマりました。その時の解決方法です。

ハマった事象

例えば以下のようなコードがあったとします。

use constant VAR_1 => 'var_2';

my $hash_ref = {
    VAR_1 => 'hoge'
};

print $hash_ref;

ここで期待する出力はvar_2をキーとするハッシュ(リファレンス)を想定していましたが、実際にはVAR_1がキーとなっていました。

# 期待していた値
$VAR1 = {
          'var_2' => 'hoge'
        };
# 実際に定義された値
$VAR1 = {
          'VAR_1' => 'hoge'
        };

解決方法

1 括弧をつける

Perlのconstantはサブルーチンと同じ扱いとなるようなので、括弧をつけて呼び出します。

use constant VAR_1 => 'var_2';

my $hash_ref = {
    VAR_1() => 'hoge'
};

print $hash_ref;
# $VAR1 = {
#           'var_2' => 'hoge'
#         };

2 & をつける

use constant VAR_1 => 'var_2';

my $hash_ref = {
    &VAR_1 => 'hoge'
};

print $hash_ref;
# $VAR1 = {
#           'var_2' => 'hoge'
#         };

参考にしたサイト

Is there any way to use a “constant” as hash key in Perl?

[Perl]定数をHashのKeyに使用するときの注意点

constant - 定数を宣言するための Perl プラグマ - perldoc.jp

    

関連記事

[Perl] CentOS8 に plenv をインストール
インストール Step1 事前準備 Step2 PATHを通す (README通りにインストール) Step2 PATHを通す ($HOME以外にplenvをインストール) Step3 Perlインストール Step4 cpanmインストール CentOS…

CentOS8にDNFでPerl5.30のインストール
Modularityについて Perl5.30インストール dnf module でハマったところ その他 Perl5.26の場合 Perl5.24の場合 CentOS8 or CentOS Streamに Perl5.30をDNF…

CentOS8とcpanm(cpanminus)によるPerlモジュールの導入・環境構築
cpanmについて cpanmのインストール (DNFでインストール) cpanmのインストール (shell経由でインストール) cpanmのインストール (cpan経由) cpanmでCPANモジュールをインストール 参考にしたサイト おまけ cpanm…

CentOS7 に Perl + CPAN 環境を構築
環境 Perl関連rpmインストール CPANの起動と設定 CentOS7 に Perl + CPAN 環境を構築する。\nPerl は CentOS7 標準 (5.16.3 ) を利用する。 環境 CentOS Linux release 7.7.190…

CentOS7 に Perl環境を構築する
環境 Perlインストール Docker上のCentOS7 に Perl および 重要なrpm類を尾インストールしPerl環境を構築する。 環境 CentOS7\n\nPerl 5.16.3 (CentOS標準) Perl…

最新の投稿

Node.js で作成した REST API を Docker化
Node.jsでREST APIを作成 コンテナ化 コンテナ化定義 コンテナ化作業 参考 Node.js で作成した REST API を Docker化した際のメモです。 Node.jsでREST APIを作成 まずはNode.js…

JavaScriptで優先度付きキューを実装する
優先度付きキューについて ソース 参考 JavaScriptで優先度付きキュー (プライオリティキュー) を実装する 優先度付きキューについて 具体的には次のような機能があります。 キューに対して要素を優先度付きで追加 (push…

AWS Amplify で コンテナベースのデプロイを行い REST API を構築
検証した環境 やってみる 初期準備 パイプラインを確認 終了処理 参考 AWS Amplify で コンテナベースのデプロイを行い REST API を構築した際のメモです。 検証した環境 amplify 5.1.…

Pythonでソケット通信を実装しメッセージの送受信を行う
ソース server.py client.py 動かしてみる 参考 Pythonでソケット通信を実現する方法です。 ソース server.py サーバ側のソースです。 client.py…

next_permutationをJSで実装する
ソース 使い方 参考 C++で提供されている順列を生成する next_permutation のJS実装です。 ソース 順列が存在する場合はtrueを返し、そうでなければfalse…

応用情報技術者試験の合格体験記
受験時のステータス 受験結果 対策 スケジュール 午前問題 午後問題 参考書等 令和…

[JS]ラジアンから度数に度数からラジアンに変換する
コード 度数からラジアンへ ラジアンから度数へ サンプル ラジアンから度数に度数からラジアンに変換する際のスニペット。 コード 度数からラジアンへ ラジアンから度数へ サンプル

CentOS8 に Python + OpenCV をインストール
インストール テスト CentOS8 で標準で提供されているパッケージで Python + OpenCV 環境を構築する方法です。 検証した環境は CentOS8.3 (Docker) です。 インストール まず opencv…

[Perl] CentOS8 に plenv をインストール
インストール Step1 事前準備 Step2 PATHを通す (README通りにインストール) Step2 PATHを通す ($HOME以外にplenvをインストール) Step3 Perlインストール Step4 cpanmインストール CentOS…

JS/TSのclassでclass名を取得する
コード JS/TSのconstructorを利用して自分自身のクラス名を取得する際のメモ。 コード このコードの結果は次のようになります。

Tags

Dates

s-yoshiki
s-yoshiki
githubtwitterqiita
Web作ってますが、インタラクティブなプログラミングも好きです。
JavaScript / Vue / node.js / PHP / AWS / OpenCV
© 2021   404 motivation not found