• ベストアンサー

perlスクリプト $1 qq などについて。

以下のスクリプトについて質問があります。 $_ = $mail; m/(^[a-zA-Z0-9\.\_\-]+\@[a-zA-Z0-9\.\_\-]+)/g; $mail = $1; if($in{mail} ne $mail){ &PrintError('メールアドレスは、半角文字で書いてください。'); } このスクリプトなのですが、$mailの値を$_に代入し、$_の値をm/・・・ の部分で半角チェックしているのは分かるのですが、半角チェックされた後どうなっているのかがわかりません。また、$1 とはどうゆう意味なのでしょうか??ifより後の部分は分かっています。 また、 open(IN, "<database.dat"); while (<IN>) { print; } close(IN); の全体的な説明をお願いしたいです。ファイルハンドルという概念とopen,close両関数は分かっています。 最後に print qq(Content-type: text/html; charset=Shift_JIS\n\n); とあった場合の qq の意味が分かりません。 分かる方いらっしゃいましたらご教授くださると幸いです。よろしくお願いします。

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

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>$1 とはどうゆう意味なのでしょうか? その前のマッチングで( )でマッチした部分 >全体的な説明 "database.dat" を一行毎読み出し、標準出力に表示します。 print; は、 print $_; と同じで、この場合の$_ は、<IN> で読み込まれた一行 >qq qq( 中身 ) は、関数呼出(形?)による "中身" とほぼ同じ

fortunefeeling
質問者

お礼

回答ありがとうございます! 一つ質問を追加してもよろしいでしょうか?? PrintErrorとはどのような時に使う関数なのでしょうか?分かる方いらっしゃいましたらよろしくお願いします。

その他の回答 (2)

  • jikenjp
  • ベストアンサー率38% (5/13)
回答No.3

追: すいません、一言、忘れてました。UNIX/Linux 以外では、動作確認いっさいしておりません。

fortunefeeling
質問者

お礼

遅くなって申し訳ないです、みなさん回答ありがとうございました!サブルーチンだったのですね。。気づきませんでした。

  • hara_peko
  • ベストアンサー率28% (11/38)
回答No.2

PrintError そのスクリプトのどこかに定義されているサブルーチンですね。(もしくは require か use されているライブラリ、モジュール内に定義されているサブルーチン) 名前からすると html でエラーメッセージを出力する為の物かと。

関連するQ&A

  • perlスクリプト

    perlの勉強をしているものです。人様の作ったスクリプトを解析しています。以下のスクリプトについて質問があります。 while(chomp($in = <STDIN>)){ last if ($in eq "\cD"); print "$in"; } このスクリプトに出てきている、"\cD"の意味と、ifの前に出てきているlastの働きが分かりません。またこのスクリプトは全体としてどのような仕事をするのでしょうか?? 分かる方いらっしゃいましたら、ご教授いただけると幸いです。よろしくお願いします。

  • Perlのワンライナーをスクリプトにしたい

    初歩的な質問で恐縮ですが、以下のPerlのワンライナーを、スクリプトファイルに記述するには、どのように書けば良いのでしょうか。 perl -ne "print if ( /aaa/ ); print if ( /bbb/ ); print if ( /ccc/ );" "in.txt" > "out.txt" 下記のようにしてみたのですが、ダメでした。 perl "script.pl" "in.txt" > "out.txt" ----- script.plの内容 ----- print if ( /aaa/ ); print if ( /bbb/ ); print if ( /ccc/ ); --------------------------- 環境はWindowsのコマンドプロンプトです。バッチファイルでの使用を想定しています。 自分はPerlに関する知識が無いので、Perlに関するサイトも見てみたのですが、情報が膨大で、ピンポイントでこの問題を解決する情報を探し出す事が出来ませんでした。 やり方が分かる方がおられましたら、お教え頂けないでしょうか。

    • ベストアンサー
    • Perl
  • perlでファイルからメールアドレスを抽出

    perlでエラーアドレスを抽出したく いろいろ調べてみましたがどうにもうまくいきません。 主に携帯アドレスが中心ですので RFCに基づいているというよりは簡易な正規表現で、 重複排除くらいはできると理想なのですが 既成で何かいいものはありませんかね? $format='[\w.-]+\@([\w-]+\.)+\w+'; # 簡略なメールアドレス正規表現 open(IN, "エラー.dbx"); foreach(<IN>) { if($_ =~ /($format)/){ push(@emails,$1."\n"); } } close(IN); print @emails; とか open(IN, 'エラー.dbx'); @data = <IN>; close(IN); foreach(@data){ s/ //g; print "$_\n" if /([\w._-]+@[\w._-]+)/ ; } 試してみましたがうまくいきませんでした。

    • ベストアンサー
    • Perl
  • 正規表現を使って入力チェックを行う

    JavaScriptで正規表現を用いて半角英数入力チェックを行いたいのですが、うまくいきません。 ご協力お願いします。 --【1】------------------------------------------------- if((element2.value.match(/^[^0-9a-zA-Z]$/)){  document.FORM01.in_AAA.value="";  return false; } ------------------------------------------------------- 【1】では、半角、全角に関わらず正常に処理が行われます。 --【2】------------------------------------------------- if(!element2.value.match(/^[^0-9a-zA-Z]$/)){   document.FORM01.in_AAA.value="";   return false; } ------------------------------------------------------- 【2】にすると、半角、全角ともエラーとなってしまいます。 どのようにすれば、実装できるのでしょうか。 皆さん、よろしくお願いします。

  • このスクリプトの意味を教えてください。

    大変恐縮なんですが、下記のスクリプトは何をしようとしているのか判りやすく教えて下さると助かります。 C言語やDelphiなどならわかるのですが、perlは全く知らないもので・・・ open(SRC, "a.u") || die; open(DST, "> a.v") || die; select DST; while (<SRC>) { if (/^`eval/) { s/$&//; eval; } else { print; } } close SRC; close DST; exit 0;

    • ベストアンサー
    • Perl
  • perlでurlが正しいか判定したい

    perlでホームページのURLが正しいか判定したいのですが、ネットで調べていても出てくるのがメールアドレスの判定方法ばかりで、ホームページに関してのことがなかなか見つかりません。 if($url !~ /^https?:\/\/[\w\.-~\?&=\/]{4,}/) { } こんな感じで適当にやっていたのですが、なぜか ,(カンマ) のチェックをスルーしてしまったりと思うように制御できておらず、 http://www.din.or.jp/~ohzaki/perl.htm#httpURL このページを読んでもちんぷんかんぷんで、とりあえず if($url !~ /\b(?:https?|shttp)://(?:(?:[-_.!~*'()a-zA-Z0-9;:&=+$,]|%[0-9A-Fa-f ][0-9A-Fa-f])*@)?(?:(?:[a-zA-Z0-9](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?\.) *[a-zA-Z](?:[-a-zA-Z0-9]*[a-zA-Z0-9])?\.?|[0-9]+\.[0-9]+\.[0-9]+\. [0-9]+)(?::[0-9]*)?(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f] [0-9A-Fa-f])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A- Fa-f])*)*(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f ])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])*)*) *)?(?:\?(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f]) *)?(?:#(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A-Fa-f])* )?/){ } こんな感じで代入してみても予想どおり構文エラーとなってしまい、どうやればいいのか困っています。(あまりの長さに理解できていないためエスケープも一切させてないので、エラーが出て当然といえば当然ですが) そこまで厳密にでなくてもかまわないのですが、ホームページのURLに間違いがないかチェックする方法はないでしょうか。 (特に . と , や : と ; や ~ と ^ の入力間違い、スペースが入っていないかとか全角入力になっていないかなどをチェックしたいです)

    • ベストアンサー
    • Perl
  • Perlを使った正規表現について

    テキストファイルを読み込んで、以下のルールに従った文字列だけを.txtで出力するプログラムを書いています。 具体的にはテキストファイル中の "text":"★★★","to_user" で囲まれている★★★の部分のみを抽出したいです。 そこで正規表現に触りだしたのですが、表現がうまくいっていないようで1週間ほどはまっています。。うまく出力できるように直しをいただけないでしょうか。 打ち明けてしまうと、★★★の部分はtwitterの呟き(日本語)になります。 以下がそのソースになります。よろしくお願いします。 print "Input file name: "; $ifname = <STDIN>; open(IN, $ifname); open(OUT, "> out.txt"); #出力ファイル while(<IN>){ if($ifname =" m/"test":(.*?),"to_user"/; next if($_ eq ""); print OUT "$_\n"; #書き出し } close(OUT); close(IN);

    • ベストアンサー
    • Perl
  • 文字列チェックの動作がおかしい・・・

    フォームのメールアドレスチェックで動作がおかしいです。 自分では、問題がないと思っているのですが、どこかおかしなところがあればご指摘ただければと思います。 動作確認を簡単にするために作ったソースは if(!ereg("^[0-9a-zA-Z\_\.\-\@]+$",'k_kkkk@kkkkk-kkkkk.com')) { print "NG1\n"; }else { print "OK1\n"; } if(!ereg("^[0-9a-zA-Z\_\.\-\@]+$",'kkkkk@kkkkk-kkkkk.com')) { print "NG2\n"; }else { print "OK2\n"; } if(!ereg("^[0-9a-zA-Z\_\.\-\@]+$",'k_kkkk@kkkkkkkkkk.com')) { print "NG3\n"; }else { print "OK3\n"; } if(!ereg("^[0-9a-zA-Z\_\.\-\@]+$",'kkkkk@kkkkkkkkkk.com')) { print "NG4\n"; }else { print "OK4\n"; } if(!ereg("[0-9a-zA-Z\_\.\-\@]+$",'k_kkkk@kkkkk-kkkkk.com')) { print "NG5\n"; }else { print "OK5\n"; } if(!ereg("[0-9a-zA-Z\_\.\-\@]+$",'kkkkk@kkkkk-kkkkk.com')) { print "NG6\n"; }else { print "OK6\n"; } if(!ereg("[0-9a-zA-Z\_\.\-\@]+$",'k_kkkk@kkkkkkkkkk.com')) { print "NG7\n"; }else { print "OK7\n"; } if(!ereg("[0-9a-zA-Z\_\.\-\@]+$",'kkkkk@kkkkkkkkkk.com')) { print "NG8\n"; }else { print "OK8\n"; } です。予想していた結果は、全てOKとなるはずだったのですが、予想に反して NG1 NG2 OK3 OK4 OK5 OK6 OK7 OK8 となり、マッチングパターン部分が「^[0-9a-zA-Z\_\.\-\@]+$」となっているときだけ、ハイフンが文字列に含まれていると、予想と違っています。 自分的には??なのですが・・・ どこがおかしいのか、ご指摘いただければと思います。 長文ですみません。

    • ベストアンサー
    • PHP
  • Perlをcshスクリプトに書きなおしたい

    以下のPerlで書かれたCGIをcshスクリプトに書き直したく思っています。 #!/usr/local/bin/perl # load libraries require ("/usr/local/bin/cgi-lib.pl"); # cancel stdout buffering $| = 1; # header response print "Content-type: text/html\n\n"; print STDOUT "<HTML><HEAD></HEAD><BODY>\n"; &ReadParse; open(COMM, "|./message > ./message.out") || die; $in_text = $in{"Name"}; print COMM "Name: $in_text\n"; ... "Name"という変数名で受け取った文字列を$in_textに代入している ようですが、この辺りの処理、cshではどう書けばよいのでしょうか。

    • ベストアンサー
    • CGI
  • perlで以下の動作が出来る機能を作っています。

    perlで以下の動作が出来る機能を作っています。 1.ファイル名が載っているfname.txtを読み込む。 2.読み込んだファイル名を開く。 3.ファイルの内容を変換。 4.変換したファイル内容をnew_fileディレクトリに保存。※ファイル名はそのまま。 1~4までを作ったのですが、fname.txtで指定した全てのファイル名を変換して保存したいのに、一番最初に記載されてあるファイル名しか置換されません。書籍などで調べてもわからないのと今日中に製作したいのでここで質問しました。 ご教授お願いします。 以下にソースを貼ります。 #!/usr/local/bin/perl -w use strict; my $x = 0; my $y = 0; my $z = 0; open(IN,"<"."fname.txt")or die "cannot open txt_file: $!";#fname.txtを開く while(<IN>){ #chomp $_;#改行してファイル名を書き込んでいるので、改行を消去 my $fn = $_; my @F = $fn; foreach my $FNAME (@F){ open(FILE,"$FNAME")or die "cannot open txt_file: $!";#fname.txtに記載してあるファイルを開く open(OUT,">". "new_file/$FNAME")or die "cannot write txt_file: $!";#new_fileを開いて書き込む while(<FILE>){#以下、ファイルの置換内容 my @d; if (m/^[X1-9]+ (.*)/s) { ($y,$z)=(0,0); $d[0] = ++$x; $d[1] = 0; $d[2] = 0; $_ = $d[0] . " " . $1; } if (m/^[X1-9]+\.[X1-9]+ (.*)/s) { $z=0; $d[0] = $x; $d[1] = ++$y; $d[2] = 0; $_ = $d[0] . "." . $d[1] . " " . $1; } if (m/^[X1-9]+\.[X1-9]+\.[X1-9]+ (.*)/s){ $d[0] = $x; $d[1] = $y; $d[2] = ++$z; $_ = $d[0] . "." . $d[1] . "." . $d[2] . " " . $1; } print OUT $_; } } close(IN); close(FILE); close(OUT); exit ; }

専門家に質問してみよう