Perlのeval文で、
$str='hoge';
eval "print+$str";
とすると「hoge」と出力されます。
このとき+はスペースとして扱われているようなのですが、
そのことについてマニュアルなどに記載されていないようです。

eval "print+1+2";
の場合はちゃんと3と表示されるし、
きっとevalのほうで+を適当に解釈してるんだと思いますが、
それであってるんでしょうか。

またこのようなeval中で特殊に評価される文字があるのでしょうか。
できれば関連文献などを教えていただけるとなお嬉しいです。

マニュアルを見落としてる可能性もあるなあ。
そうだったら恥ずかしい。^^;

このQ&Aに関連する最新のQ&A

A 回答 (1件)

別に eval でなくても


print + "abc\n";
で abc が出ますね。あと、
print - "abc\n";
だと、-abc が出ます。
これらから想像すると、数値に単項演算子の + や - をつけたのと
同じような解釈をしているようです。

というわけで、マニュアル perlop の Symbolic Unary Operators
の節を見てみると(日本語のは持ってないので、英語のを簡単に訳
すと)、
「単項の "+" は(文字列に対してさえも)まったく何の効果も持たない」
とあります。

ついでに、
「単項の "-" は、オペランドが数値なら算術の否定。識別子なら、
"-" とその識別子をくっつけた文字列。オペランドの文字列が +
か - で始まっていたら、それを逆にした文字列。」
とあります。つまり、
- "-abc" -> "+abc"
なんですねぇ…。知らなかった… ^^
    • good
    • 0
この回答へのお礼

やっぱり単項+でいいんですね。
とても参考になりました。

Perlって記号がいろいろな使われ方するから、
まだまだ自分の知らない文法が隠されてるんじゃないか思うことが
ときどきあります。
単に読み方を間違えてるだけなんですけどね。たいてい。^^;

お礼日時:2001/03/09 15:54

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

Qmy($Str)とmy $Strの違い

いつもお世話になります。
某高機能アクセス解析プロのPerlで書かれたCGIファイルの中に、
my($Str)と、my $Str が出てきます。
これは、何か特別な違いがあるのでしょうか。
知識も無いのにCGIを改造していて恐縮ですが、
このような ちょっとした事で非常に悩みます。
どうか教えて下さい。
よろしく、お願いします。

Aベストアンサー

my $str;とmy($str);はどちらもローカル変数にしているという点で同じですよ。ただNo.2の方も説明しているとおり、
同時に代入 (初期化) をする場合にその解釈 (スカラー、リスト) が違うので結果が変わり得ます。

括弧は同時に複数の変数をmy宣言する場合にも使います。
my($str1, $str2, @array, %hash);
これはmy $str1; my $str2; my @array; my %hash;と同じです。
1つの変数の場合は面倒なのでふつうは括弧を書かないでしょう。

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。

Q$hts =~ s/##([^#]+)##/$FORM{$1}/g の意味を教えてください!

お世話になります。
perl素人なのですが必要に迫られてWEBで調べながら
ソースを解析していますが、次のコードで完全に止まってしまいました。

$hts =~ s/##([^#]+)##/$FORM{$1}/g

この場合、
#hts から ##([^#]+)## を探して $FORM{$1} に全て置き換えようとしていると思うのですが、以下2点が理解できず困っています。

1.##([^#]+)## の意味
$htsに##で囲まれた文字列が複数あるのでそれら全てを探すということでしょうか?

2.$FORM{$1} の意味
$1は1.で検索した結果だと思いますが、$FORM{ }は一体なんでしょうか?

素人がいきなり解析するのは無謀なのは承知の上ですが、
どうしても業務で必要なので、お知恵をお貸し下さい。
よろしくお願いいたします。

Aベストアンサー

1.
perlを基準に「正規表現」で調べてごらん

2.
同じくperlでHTMLのformデータを受け取る方法を調べてごらん

Q$yerr = "$year (Y)"; と記述していいでしょうか?

「" "」の中で、かっこ「( )」を使っても問題ないですか?
エスケープが必要でしょうか?

Aベストアンサー

> $yerr = "$year (Y)";
のような、単なる文字列の文字としてカッコを使う分には、エスケープの必要はありません。
エスケープしなければならないのは、「$ 自身」と「@ 自身」くらいでしょう。
(これらは "~" の中では変数展開されてしまうので、エスケープする必要があります。)


このカテゴリの人気Q&Aランキング

おすすめ情報