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

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

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

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

Q&A

3回答

1198閲覧

[Perl]既存のメールアドレス管理/削除スクリプトをID名管理/削除に使いたいです。

charmee2928

総合スコア17

Perl

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

0グッド

0クリップ

投稿2017/07/10 07:23

編集2017/07/10 10:52

既存のcgiをつかってPerlを勉強中です。

◾ 前提・実現したいこと
既存にあるメールアドレスごとにグループ管理/削除するスクリプトを、メールアドレスではなくID名で実装したいのですがうまく動きません。

◾発生している問題
スクリプトで削除やグループ変更を実行すると、空白のあるID名だけが削除/変更共に失敗します。

◾問題が発生するまでの流れ・手順
1.スクリプト内の「入力チェック」部分にあった以下(メールアドレス正規表現チェック)を省きました。
if($in{$p_batch} !~ /^$mail_regex$/o){
$err = 5;
&err;
}

2.friends_sjis.datのメアドをID名(ひらがな漢字英数字空白含む)に変えました。

◾ソースコード
http://luvly.biz/Sample.txt

※上記はサンプルです。$f_mailなどの変数名は$f_idなどには変えずそのままになっています。copyrightなどのかかるhtml部分は添削してあります。

◾$f_mailがあるfriends_sjis.datの中身(××はFirstNameです。ID名部分は元はメアドで稼働されていた箇所です)

Saito ××,1,,,,,,,,,,,,
Yamada ××,,,1,,,,,,,,,,
Kuroki ××,1,,,,,,,,,,,,


・続く

◾ 問題の発生した環境
Perl

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

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

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

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

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

guest

回答3

0

KojiDoi様の回答の補足のような形になってしまいますが,
①について

%はPerlの連想配列(この呼び方で正しいかはわかりませんが,'名前'でアクセスする配列です)です.

$mldata{'ml_'.$f_id[$i]} = $i;
はmldataという(連想)配列の「ml_Saito XXX」という要素に$iを代入しています.
ml_というのは「文字列」ですから特に意味があるようには思えません.
※Perlのドットは文字列(この言い方も微妙ですが)に対して適用すると結合演算子となります.構造体やクラスのドットとはここでは動作が異なります.

したがって,このスクリプトの動作としては
datファイルに記載された人の名前に対して,datファイルの行数?を割り当てているように思えます.
$mldata{'Saito xx'} には1が
$mldata{'Yamada xx'}には2が



という風です.

②はこの情報ではわからないですね
IDを削除するならdatファイルの中身を書き換えなければならないような気もしますし,どのような仕組みのデータ管理課が不明です

投稿2017/07/10 08:03

編集2017/07/10 08:21
ElecDove

総合スコア254

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

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

charmee2928

2017/07/10 08:39

Doi様、ElecDove様親切ていねいなご説明ありがとうございます。 なるほど、よくわかりました。どうやら手前のスクリプトで削除する対象とそれに対する動作がすでに作られている感じだったのですかね...手前のスクリプトをのせてみました。 my %mldata = (); #ID情報を格納 for(my $i=0;$i<$id_cnt;$i++){ $mldata{'ml_'.$f_id[$i]} = $i; } print "<br>\n"; print "<FORM action=\"$list_cgi\" method=\"post\">\n"; print "<input type=\"hidden\" name=\"pass\" value=\"$in_pass\">\n"; print "<input type=\"hidden\" name=\"flag\" value=\"3\">\n"; print "<input type=\"hidden\" name=\"start\" value=\"$in_start\">\n"; print "<input type=\"hidden\" name=\"max\" value=\"$in_max\">\n"; print "<input type=\"hidden\" name=\"batch_mode\" value=\"",$in{'batch_mode'},"\">\n"; for(my $i=0;$i<$id_cnt;$i++){ my $p_batch = 'batch_'.($i + 1); if ($in{$p_batch}){ print "<input type=\"hidden\" name=\"$p_batch\" value=\"$in{$p_batch}\">\n"; print ($i + 1),"\n"; print "",'(',$f_name[$mldata{'ml_'.$in{$p_batch}}],') ',$f_data2[$mldata{'ml_'.$in{$p_batch}}],"<br>\n"; print ' ',$in{$p_batch},"\n"; print "<br>\n"; } } print "<br>\n"; if($in{'batch_mode'} > 0){ my $exeval = '$flagname'.$in{'batch_mode'}; my $retval = eval $exeval; print "上記のIDを",$retval,"に変更\n"; }else{ print "上記のIDを削除\n"; } print "<br>\n"; print "<input type=\"submit\" value=\"変更する\">\n"; print "</FORM>\n"; print "<br>\n";
ElecDove

2017/07/10 09:11

$inが不明です.何が保存されている配列ですか? my $exeval = '$flagname'.$in{'batch_mode'}; が不明です.'$flagname'がシングルクォートで囲まれているため変数展開しない(はず)ですが... inputのtype属性がhiddenしかないので,ユーザーに何を入力させたいのかが不明です(プログラムの本質とはあまり関係ないかもしれませんが,理解しづらいです) もうすこし,スクリプトが何をしたいのか,というバックグラウンドと,各変数の説明(乗せていただいたソースの中で宣言がされていないものだけでも)が欲しいですね ここだと見づらいので,質問の本文を編集したほうがいいと思います
charmee2928

2017/07/10 10:57

ご指摘ありがとうございます。大幅に書き直してみました。このスクリプト動作に直接関連する外部ファイルは基本的にはdatファイルのみになります。あとの変数などはURL上のスクリプトにのっている?のではないかと思います。Perl初心者で必要箇所の抜きだしに困ったので、該当スクリプトをURLにアップしました。
guest

0

質問1について。
"ml_Saito XX"のようなIDを作ってそれに通し番号を振っていますね。
それがなぜ「削除」になるのかはちょっと分かりませんが。

質問2について。
上記の通り「削除」定義が良くわからないので回答困難です。
何を以て「削除」が上手くいかないと判断されたのか御説明ください。

投稿2017/07/10 07:37

KojiDoi

総合スコア13671

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

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

charmee2928

2017/07/10 09:06

ありがとうございます。 質問1の部分では通し番号をふっているだけだったのですね。 質問2については、このスクリプト全体を実行したところ、空白スペースのないIDについては削除されていて、名前と苗字の間に空白のあるIDなどはすべて削除されずにそのままdatファイルにのこっておりました。 このスクリプトはメールアドレス管理/削除用に以前使われていて、そちらをID管理/削除用に使いたいと思いましたが、仕様がメールアドレス用になっているのか、空白でひっかかってしまっているのかと思いました。
guest

0

追加提示されたスクリプトざっと見ましたが、通常の感覚で削除と云える処理が為されている様には見えません。
%mldataについては最初に番号を振って以来何もされていないですね。
"名前と苗字の間に空白のあるIDなどはすべて削除されずにそのままdatファイルにのこっておりました。"とのことですがdatファイルの操作など提示されたスクリプトの中ではされていません。

また、inなんちゃらという変数が多用されていますがこれらの内容も不明なので追試もできません。

投稿2017/07/10 09:26

KojiDoi

総合スコア13671

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問