いくつかのperlを解説したページを読んでみたのですが、
以下の文でフォーマットとしての"%02x"の意味と
「^」(演算子?)の意味がわからずつまづいてます。

$val =~ s/./sprintf("%02x",ord($&)^ord($aaa[$i++ % @aaa])))/ge

どなたか教えてください・・・

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

A 回答 (2件)

これは出力のフォーマットですね。


まず x は16進数の小文字を出力する指示。その前の02ってには「左側にゼロを詰めた2桁」って意味です。

Cのリファレンスを探して printf の書式を調べてみてください。
検索してたらPHPのがヒットしましたが、意味は同じです。>参考URL

参考URL:http://www.asakawa.ne.jp/doc/php/ja/sjis/functio …
    • good
    • 0
この回答へのお礼

ありがとうございます。
Cと同じ意味なんですね。

左側に0を詰めた2桁ですか、なるほど。

お礼日時:2001/01/22 12:10

"%02x"についてはshigatsuさんが書いているとおりなので省略。


「^」は排他的論理和を表すビット論理演算子です。

この説明でわからなければ、コメントで補足してください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
xorですね。

perlだと[^ABC]などとしたときに意味が違ってくるので、
何か複雑に考えてしまったようです。

お礼日時:2001/01/22 12:12

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

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

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

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データを受け取る方法を調べてごらん

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]だけを返します.

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はいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。

Qperl qw(aaa bbb ccc)[$hoge]のような記述

my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
$wday = sprintf("%s", qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]);

2行目のsprintfですが、qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]はどのようなことが行われているのでしょうか?
sprintf("%s", "hello world!");みたいな基本的なものならsprintfの使い方はわかります。ですが、qw(aaa bbb ccc)[$hoge]のような記述についてがわかりません。
上記の例でいえば、どういう結果になるのかはわかるのですが、どういう過程で代入されているのかがわかりません。

qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]という書式はどういうことが行われているのか教えてください。よろしくお願いします。

Aベストアンサー

> my @weekname = ( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
> $wday = sprintf("%s", $weekname[$wday]);

ならわかりますか?

0~6の7要素の配列 @weekname を使うことで、数字から曜日名への変換をしてます。

この配列変数の代入は、qw 演算子を使うと、

> my @weekname = qw(Sun Mon Tue Wed Thu Fri Sat);
> $wday = sprintf("%s", $weekname[$wday]);

と書けます。
(qw演算子を使えば、文字列配列を簡潔に書けるようになります。結果は同じ)

さらに、@weekname という配列変数を作ってますが、一度きりしか使ってないのに変数を作るのは無駄なので、
> $wday = sprintf("%s", $weekname[$wday]);
このweename部分に@weeknameの中身である、qw(Sun Mon …) を入れてしまえば、
> $wday = sprintf("%s", qw(Sun Mon Tue Wed Thu Fri Sat)[$wday]);
になります。

でも、これって、ちょっと無駄な表現ですね。
「sprintf("%s",○○)」って、元の「○○」と同じ(何もしてない)ので、
> $wday = qw(Sun Mon Tue Wed Thu Fri Sat)[$wday];
で十分。

> my @weekname = ( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
> $wday = sprintf("%s", $weekname[$wday]);

ならわかりますか?

0~6の7要素の配列 @weekname を使うことで、数字から曜日名への変換をしてます。

この配列変数の代入は、qw 演算子を使うと、

> my @weekname = qw(Sun Mon Tue Wed Thu Fri Sat);
> $wday = sprintf("%s", $weekname[$wday]);

と書けます。
(qw演算子を使えば、文字列配列を簡潔に書けるようになります。結果は同じ)

さらに、@weekname という配列変...続きを読む

QPrel正規表現で'$1$'.$saltのあたりが理解できない。

小生Perlを勉強中です。
Perl Codeに以下のようなパスワード暗号処理のサブルーチンが
ありましたが、読めません。教えて下さい。

sub encrypt{
local($inpw)=$_[0];
local(@SALT,$salt,$encrypt);

@SALT=('a'..'z','A'..'Z','0'..'9','.','\');
srand;
$salt=$SALT[int(rand(@SALT)).$SALT[int(rand(@SALT))];
$encrypt=crypt($inpw,$salt)||crypt($inpw,'$1$'.$salt);
return $encrypt;
}

とあります。
特に、下から3行目の($inpw,'$1$'.$salt)が
理解できません。
解説していただければ幸いです。

Aベストアンサー

過去に同様の質問がありました。ctpsysさんの疑問にすべて答えられるかどうかわかりませんが、すくなくとも
>下から3行目の($inpw,'$1$'.$salt)が理解できません
というご質問に対しては参考になるかと思います。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=74593,http://oshiete1.goo.ne.jp/kotaeru.php3?q=74593,


おすすめ情報