質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

2回答

778閲覧

perlのパスワード生成ソースについて

nofriends

総合スコア1

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

1クリップ

投稿2022/04/15 05:47

$password = join ("" ,map { ("a".."z", 0..9)[rand 36] } 1..8);

上記ソースはperlにおけるパスワード生成のソースらしいのですがmapの仕組みについて教えてください。
mapは配列の要素変換に使われるもので調べると map [変換文]@配列 という構文しか出てこなく理解できず困っています。

よろしければ初学者でもわかるようにご教授いただければ幸いです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nofriends

2022/04/15 06:00

どのような仕組みで変数passwordに8桁のパスワードが格納されるのか教えていただきたいです
m.ts10806

2022/04/15 07:28

質問は編集できます。 まず自身が調べたこと試したことを記載してください
guest

回答2

0

mapを使わずに分かりやすく書き換えるとこんな感じでしょう。

perl

1my @chars_in_password; 2for my $i (1..8){ 3 my @chars = ("a".."z", 0..9); 4 my $c = $chars[rand 36]; 5 push(@chars_in_password, $c); 6} 7my $password = join("", @chars_in_password);

1 .. 8 はどの配列に格納されているのでしょうか。

mapのなかで要素が一つづつ$_に代入されます。

randが[]で括られている理由

$x[0]が、リスト@xの0番目の要素を参照しているのは理解できますか? この0の部分は定数に限らず任意の式を書くことが出来、$x[rand 36]のように書くことが出来ます。
さらに、名前のついた配列ではなく、(1,2,3)とか('a','b','c')とかqw/a b c/とか直接的にリストを表現することも出来ます。これを組み合わせると例題のようなコードになります。

いまから Perl の学習をするなんて、大変ですね…

検索するとオワコンだ何だといい加減な主張をしている人が結構居ますが、まだまだ立派に現役の言語です。勉強した分だけ確実に出来ることが増えるので頑張って勉強してください。

投稿2022/04/15 07:36

編集2022/04/15 08:08
KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nofriends

2022/04/15 08:30

ものすごくわかりやすい回答ありがとうございます。 例まで書いていただき助かりました! 名前の付いた配列ではなくリストでも同様のことができるのが理解できていませんでした。 本当にありがとうございました!!
guest

0

ベストアンサー

いまから Perl の学習をするなんて、大変ですね…

map [変換文]@配列 という構文しか

依然として、この通りなのです。
1..8 で 1から8の数値からなる配列を生成しています。 これの要素が変換文の入力ですが、("a".."z", 0..9)[rand 36] は入力を無視して、a〜z 0〜9 の36文字から乱数で1つを選びます。36種類の文字からランダムで選んだ文字が8個入った配列が結果になるわけです。

投稿2022/04/15 06:37

編集2022/04/15 06:38
int32_t

総合スコア20878

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nofriends

2022/04/15 06:49

ご回答ありがとうございます!! なかなか情報がなくて大変です、、、 1 .. 8 はどの配列に格納されているのでしょうか。(宣言がないのでよくわからないです、、、) また、randは通常rand(36)であれば36未満?の数字が乱数で出力されると思うのですが、この場合は特殊なのでしょうか(randが[]で括られている理由も可能であれば教えていただけますでしょうか。) 色々質問してしまいすみませんが、よろしくお願いします。
int32_t

2022/04/15 07:31

> 1 .. 8 はどの配列に格納されているのでしょうか。 どこにも格納されません。map の入力になって、その後捨てられます。 > randは通常rand(36)であれば36未満?の数字が乱数で出力 そのとおりです。 > randが[]で括られている ("a".."z", 0..9) という36要素の配列のインデックスとして 0〜35 の乱数が使われています。
nofriends

2022/04/15 08:22

上記の件、理解できました。 ("a".."z", 0..9)も配列([0]~[35])に格納されていて、その要素をrandにより選んでいるということですね。 本当に助かりました。ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問