• ベストアンサー

変数の定義について

perl中級者です。 とあるPGMの修正を頼まれて行っていたのですが、 変数の定義において print "$ABC{$DEF}\n" という記述がありました。 $ABC$DEF や $ABC[$DEF]、 $ABC${DEF} という記述は使用しますが、 $ABC{$DEF} のような記述ってあるのでしょうか? 前後の処理は関係無しにこのような表現があるのかどうかを教えてください。 また、その場合print等で表現すると、 どのような表示になるのでしょうか? perl:Ver4 開発環境:HP-UX 以上、よろしくお願いいたします。

  • Perl
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

現在は、ハッシュといわれていますが、かつては連想配列といわれていました。 これは、配列の添え字として文字をつかうことが、出来る特殊な配列です。 たとえば、 A君の年齢=16 住所=SHINJUKU B君の年齢=18 住所=SHIBUYA とすると ------------------ $nenrei{"A"} = 16; $nenrei{"B"} = 18; $jusho{"A"} = "SHINJUKU"; $jusho{"B"} = "SHIBUYA"; $name = "A"; #A君の名前 print "名前:$name"," 年齢:$nenrei{$name}"," 住所:$jusho{$name}","\n"; $name = "B"; #B君の名前 print "名前:$name"," 年齢:$nenrei{$name}"," 住所:$jusho{$name}","\n"; --------------------------- を実行すると 名前:A 年齢:16 住所:SHINJUKU 名前:B 年齢:18 住所:SHIBUYA となります。

kal1119
質問者

お礼

早速のご回答ありがとうございます。 連想配列で間違いないようです。 正直あまり使ったことのない記述ですので 頭にありませんでした。 助かりました。

その他の回答 (2)

回答No.2

単純に中括弧を出力したいだけなのかもしれません。 その場合は、 print "$ABC\{$DEF\}\n"; ですが・・・

kal1119
質問者

お礼

早速のご回答ありがとうございます。 どうやら連想配列のようです。 参考になりました、、、

  • tessyu
  • ベストアンサー率53% (59/110)
回答No.1
kal1119
質問者

お礼

早速のご回答ありがとうございます。 どうやらそれっぽいです。 助かりました。

関連するQ&A

  • 変数表示について

    #! /usr/bin/perl $a='$b$c'; $b='abc'; $c='-def'; print "$a\n"; このようなプログラムで 結果が abc-def という結果にしたいと思い上記のようなプログラムを 作りましたが 結果として表示されたのは $b$c というものでした。 「abc-def」という結果を表示するようにするのは 無理でしょうか? やはり正規表現で文字列を置換してやる必要があるのでしょうか?

    • ベストアンサー
    • Perl
  • Perlのキャプチャ

    プログラム #!/usr/bin/perl my $str = "abc,def,ghi"; ($a,$b,$c) = $str =~ /(.*),(.*),(.*)/; print $a,"\n"; print $b,"\n"; print $c,"\n"; 実行結果 abc def ghi このようなプログラムで ($a,$b,$c) = $str =~ /(.*),(.*),(.*)/;は それぞれ$a,$b,$cにabc,def,ghiが入ります. キャプチャしたすべてを変数に入れるならこの方法ですが, defだけが欲しいのに変数を3つ用意する必要がないと思います. 間違った表記ですが, ($b) = $str =~ /(.*),(.*),(.*)/$2/; 2つ目にキャプチャした$2が変数$bに入るような表記は出来ないのでしょうか?

  • Perlで変数中のエスケープされた特殊文字を展開

    Perlで、変数に既に格納されているエスケープされた特殊文字を、もとの文字に展開するには どのようにしたらよいでしょうか。 つまり、\t という値で格納されているのをタブ文字にしたり、\\ という値であれば\の一文字に するという事です。 ダブルクォートで定義すれば展開されると思いましたが、展開は変数の代入時に行われるだけで、 既に変数中にエスケープされて入っているものはダブルクォートを使い変数を囲んだりしても展開されません。 下記は簡単な例でやろうとしてる事を示したものです。 add変数に\tというタブを意味するエスケープされた特殊文字を含んでいるとして、その\tを タブとして展開し、abc defのようにさせたいのですが、abc\tdefと入ってしまいます。 $ cat unescape.pl #!/bin/perl $add = '\tdef'; #シングルクォートで代入すると、もちろんエスケープされたまま代入される #$add = "\tdef"; #ダブルクォートで代入すると代入時にタブへ展開される #$add = $ARGV[0]; #本当はAGRVからエスケープ特殊文字を含んだ文字列を取りたい。ARGVから代入すると、シングルクォートの時のようにそのまま代入される $tgt = 'abc'; print "add: " . $add , "\n"; print "before: " . $tgt . "\n"; $tgt .= "$add"; #既にエスケープされた形で代入されているものを、ダブルクォートで囲んで使っても展開されない print "after: " . $tgt . "\n"; $ perl unescape.pl add: \tdef before: abc after: abc\tdef

    • ベストアンサー
    • Perl
  • 変数はグローバルなんですか?

    初心者です。 関数sub xxx{  $abc=10; } 関数sub yyy{  $def=$abc } というように、関数xxxで宣言した変数もPerlでは 関数yyy内で参照できるのでしょうか。つまり、同じ ファイルにあれば関数内で宣言してもグローバル 変数として使用されるのでしょうか。 (my変数は除きます)

    • ベストアンサー
    • Perl
  • フォルダの移動をおこないたいのですが・・・

    よろしくお願いします。 CGIの中間プログラムとして、 「カレントフォルダを移動して特定のフォルダを削除する」 というようなPGMを作っているのですが、フォルダ移動の処理がうまくいきません。 ----------------------------- use Cwd; $tmpdir="tmp"; if(-d $tmpdir)){  if(chdir("$tmpdir"){   print"成功\n";  }  else{   print"失敗\n";  } } ----------------------------- 上記記述の結果は失敗となります(実際のPGMより簡略化しております)。 「tmp」フォルダは存在するが 移動に失敗しているということです。 私の記述方法が間違っているのでしょうか? サーバー・・・HP-UX 開発言語・・・Perl5 開発端末・・・windows2000(Tera Term 使用) 以上、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 関数定義での変数について

    Perl/CGIより移行してきた者です。 この度、サブルーチン(PHPで言う関数定義)にて疑問があります。 当方、PHP5を利用しています。 Perl/CGIでは関数外で定義した変数も利用できたかと思うのですが、PHPでは利用できますか? 簡単なスクリプトでテストしたら表示されなく頭を悩ませています。 以下コードになります。 <?php $prints ="aaa"; $printss ="bbb"; function check3(){ print "$prints"; print "$printss"; } check3(); ?> Perl/CGIですと $test = "aaa"; &print(); sub print { print "$test"; } でもばっちり表示されたかと思うのですが。 伝わりにくいかと思いますが、ご存知の方宜しくお願い致します。

    • ベストアンサー
    • PHP
  • perlで変数をunix時間から時刻表示に変換したいがうまくできない

    変数に入ったUNIX時間を下記のようなperlコマンドで普通の時刻表示に変換したいのですが、 変数がうまく展開できません。 (↓のままだと、1970年1月1日になります) 'や"や\を組み合わせたらどうにかなるかと思うのですが、どうすればいいでしょうか? #! /bin/sh UX_TIME=113423423 perl -e 'print localtime($UX_TIME) . "\n"' exit 0 以上、よろしくお願いします。

  • 入力フォームを変数に格納

    Perlを始めたばかりの初心者です。 inputで入力した情報を変数として取得する方法は可能でしょうか? #! c:/perl/bin/perl print "Content-type: text/html\n\n"; print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n"; print "<head><title>TEST</title></head>\n"; print "<body>\n"; print "<p><input type=\"text\" name=\"name\"></p>\n"; print "</body>\n"; print "</html>"; 上記の入力フォームで、777と入力した場合、サーバーを経由しないで、777を変数に格納したいのですが、可能でしょうか? 宜しくお願いします。

    • ベストアンサー
    • Perl
  • グローバル変数

    perlで。。。下のように実行ファイル間で変数の値が取得できないのでしょうか?できないのでが正しいのでしょうか? ファイル名:1.pl $test=1; sleep(5); $test=2; sleep(5); $test=3; sleep(5); ファイル名:2.pl print "$test\n"; sleep(1); print "$test\n"; sleep(1); print "$test\n"; sleep(1); print "$test\n"; sleep(1); print "$test\n"; sleep(1); print "$test\n"; sleep(1);

  • perl で環境変数を表示できない

    perlの初心者です。下記のCGIを実行しましたが、全く表示しません。 最初の「環境変数」と言う文字も表示しません。 どこか初歩的なエラーがあると思いますが、わかりませんので質問させていただきます。 --- #!/usr/local/bin/perl print "Content-type: text/html", "\n\n"; print "<HTML><BODY>", "\n"; print "<H1>環境変数</H1><HR>", "\n"; foreach my $key( keys %ENV ){ print "$key: $ENV{$key}<BR>", "\n"; } print "<HR>", "\n"; print "</BODY></HTML>", "\n";

    • ベストアンサー
    • Perl

専門家に質問してみよう