• ベストアンサー

Perlのサンプルを見ていると

・・・・・・・・ #// クッキー取得 if ($ENV{'HTTP_COOKIE'}) { *data = GetCookie($ENV{'HTTP_COOKIE'}); @w = split(/\,/, $data{$cknm}); $test = @w[0]; } ・・・・・・・ というのがあったのですが @w[0] と書くのは正しいのでしょうか?

  • keyguy
  • お礼率68% (895/1314)
  • Perl
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
  • arcsin
  • ベストアンサー率70% (28/40)
回答No.3

$w[0] ですよ~ 配列そのものは @w という風に書きますが、 要素を指定する場合は、 $w[0] $w[1] $w[2] ・・・ という形です。

keyguy
質問者

お礼

ありがとうございます 懸念が取れました

その他の回答 (2)

  • arcsin
  • ベストアンサー率70% (28/40)
回答No.2

perlがバージョンアップしていく過程でマニュアル通りでない(正しくない)記述が対応しなくなるかもしれないってところですかね。 正しく記述をしたクリプトは、perlがバージョンアップしてもその環境でも正しく動くことが保障されるということだと思います。

keyguy
質問者

補足

ありがとうございます どう記述すれば経時変化を防止することができるでしょうか?

回答No.1

正しくありません。マニュアル通り記述しましょう。経時変化に対応できないからです。

keyguy
質問者

補足

ありがとうございます 経時変化に対応できないからです: とはどういうことでしょうか?

関連するQ&A

  • 指定ディレクトリからcookie取得

    $cook = $ENV{'HTTP_COOKIE'}; foreach ( split(/;/, $cook) ) { ($key, $val) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } $cook{'name'} ./index.cgiで、上記のように$ENV{'HTTP_COOKIE'}でクッキーを取得しています。 このままでは./に保存されたクッキーが取得されてしまいますが、これを、任意のディレクトリ(./../html/等)に保存された場所から取得したいと考えていますが、可能でしょうか。 CGIが設置されているディレクトリ = 'http://hogehoge/cgi-bin/'; COOKIEを読み込むディレクトリ = 'http://hogehoge/html/';

    • ベストアンサー
    • Perl
  • クッキーのデータ取得

    perlでのクッキーのデータ取得の方法について、ご質問です。 まず、同一のサイトから取得した、クッキーのパスは、/の、Aというクッキーと、Bというクッキーが存在して、 Aというクッキーのコンテンツのみを、 取得したいのですが、可能なのでしょうか? 下記のスクリプトに追加すると、 どういった形式になるのでしょうか? どなたかご教授いただけますでしょうか? よろしくお願いいたします。 &splt; sub splt { @cookdata = split(/;/,$ENV{'HTTP_COOKIE'}); foreach $tmp (@cookdata) { ($youso,$atai) = split(/=/,$tmp); $youso =~ s/ //; $COOKIE{$youso} = $atai; } }

    • ベストアンサー
    • CGI
  • perlの文法について

    はじめましてstaraman_sです。 今はPerl/CGI辞典という本を使いながらPerlの勉強をしていますが、インターネットで検索しても解決できず困っています。 皆さんのお力をお貸しください。 疑問点 sub getCookie { my ($tmp, $name, $value); for $tmp (split(/; */, $ENV{'HTTP_COOKIE'})) { ($name, $value) = split(/=/, $tmp); $value =~ s/\%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $COOKIE{$name} = $value; } } 本の中の掲示板のプログラムの中に上記のようなプログラムが書いてあるのですが、最後の方に$COOKIE{$name} = $value;とあります。変数$COOKIEの後に中括弧を使い{$name}と書いているのは、どういった文法からきているのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • クッキー取得処理のジャバスクリプトを拾ってきたんですが、壊れているのか効きません。

    これなんですが、firefoxIE6とどれも効いてくれないのですが、なぜなんでしょうか? 僕の設定がおかしいのでしょうか。 head内に設置しているんですが、どうすれば効いてくれるようになるんでしょうか? <script type="text/javascript"> <!-- //ページ読み込み時に発生する。(bodyのonLoadイベントで呼び出し) function init() { //クッキー取得処理を呼び出し、戻り値をcoocに代入 var cooc = getCookie(); //戻り値がOKの場合はクッキーが存在するのでb.htmlに飛ばす if (cooc == "OK") { location.href="b.htm"; } } //クッキー取得(取得できればOK、できなければNGを返す) function getCookie(){ //当日日付取得 var today = new Date().getTime(); //クッキー取得 var doc = document.cookie+";".indexOf("test="); //クッキーが取得できなければindexOfで-1が返されるのでif文で判別 if(doc != -1){ return("OK"); } else { //取得できなければクッキーを食べさせる。(expires=有効期限) document.cookie = "test=1;expires="+new Date(today + (60 * 60 * 24 * 1000 * 1)); return("NG"); } return(""); } //--> </script>

  • Perlで携帯電話の製造番号を取得

    Perlで携帯電話の製造番号を取得 Perlで携帯電話の製造番号を取得するスクリプトを作っています。 docomoのD905iしか持っておらず、他の携帯での動作確認ができません。 以下のスクリプトで正しいでしょうか? 以下のスクリプトで、他にやっておいたほうがよい事など、 何かアドバイスがありましたらお願いします。 やりたいことは、 docomo、au、ソフトバンクのみで取得する。 iPhone、イーモバイルは取得しない。 古い携帯電話で取得できないものは切り捨てる。 携帯電話でアクセスした人が、それぞれに画面をカスタマイズでき、 次回アクセスしたときも同じ画面が表示されるようなサイトを作ろうとしています。 普通はクッキーで本人確認するのだと思いますが、携帯電話ではクッキーが 無いので、代わりに製造番号を使って本人確認しようと考えています。 1ヶ月くらいだけオープンするサイトであり、金銭的な絡みも個人情報も無いので、 携帯電話の所有者が変わったときの問題は無いと思っています。 ■ HTML <a href="./test.cgi" utn>製造番号取得</a> ■ Perl #--ソフトバンク if($ENV{'HTTP_X_JPHONE_UID'} ne ''){ $uid = $ENV{'HTTP_X_JPHONE_UID'}; } #--au elsif($ENV{'HTTP_X_UP_SUBNO'} ne ''){ $uid = $ENV{'HTTP_X_UP_SUBNO'}; } #docomo else{ $agent = $ENV{'HTTP_USER_AGENT'}; $ser_index = index($agent,'ser'); if ($ser_index != -1) { $uid = substr($agent,$ser_index+3); } } print"製造番号:$uid<br>\n"; 以上、よろしくお願いします。

    • ベストアンサー
    • Perl
  • クッキーの保存時間

    クッキー保存のジャバスクリプトを拾ってきました。 いろいろあって、クッキーの保存の期間を次の24:00(夜の12時)までにしたいのです。 今の状態だと、おそらく24時間保存されると思います。 今のプログラム↓ <script type="text/javascript"> <!-- //ページ読み込み時に発生する。(bodyのonLoadイベントで呼び出し) function init() { //クッキー取得処理を呼び出し、戻り値をcoocに代入 var cooc = getCookie(); //戻り値がOKの場合はクッキーが存在するのでb.htmlに飛ばす if (cooc == "OK") { location.href="b.htm"; } } //クッキー取得(取得できればOK、できなければNGを返す) function getCookie(){ //当日日付取得 var today = new Date().getTime(); //クッキー取得 var doc = document.cookie+";".indexOf("test="); //クッキーが取得できなければindexOfで-1が返されるのでif文で判別 if(doc != -1){ return("OK"); } else { //取得できなければクッキーを食べさせる。(expires=有効期限) document.cookie = "test=1;expires="+new Date(today + (60 * 60 * 24 * 1000 * 1)); return("NG"); } return(""); } //--> </script> ↑↑ までです。 expires="+new Date(today + (60 * 60 * 24 * 1000 * 1)); の部分が保存期間だと思います。 これだとおそらく24時間保存されます。 ここを次の24:00(夜の12時)までも保存期限にしたいのです。 わかりにくいとは思いますが、わかりやすい回答をお願いいたします。 検索するにも方法がわからなかったので質問させていただいております。

  • 書き込んだばかりのcookieが読み込めません

    cookieを書込んだ直後、書込めたか(cookieをオフにしていたり、cookieを書込めない携帯端末からのアクセスかもしれないので)確認をしようと、cookieを読込もうとしたのですが、cookieが書込まれているにもかかわらず情報を取得することができません 実験環境として、htmlファイルにボタンを作って、cgiへ飛び、そのcgi内でcookieを書込み、cookieが書込めたかどうかで分岐して、表示するようにしています (cgiを一度実行したあと一旦ブラウザで前のhtmlファイルに戻って)cookieが既に書込まれた状態で、改めてhtmlファイルのボタンを押せばcookieは読込めますが、最初にcookieを書込んだ時に同じcgi内で即読込みを行ったら読込めません 書込が完結する前に読込みに行っているから読込めないのかとも思い、読込み前にタイムラグを作っても見ましたがやはり読込めません どうすれば書込み直後に読み込めるのでしょうか? 色々ネットで調べても見ましたが、いっこうに解決策が見つかりません ご存じの方ぜひご教授下さい よろしくお願いします なお、下にperlのコードを書いておきます #クッキーを書込 $test{sid} = "12345"; &set_cookie($test{sid}); #タイムラグ use Time::HiRes; Time::HiRes::sleep(0.8); #クッキーを読込 ($cookie{test}) = &get_cookie; if(!$cookie{test}){ print "読み込めてない"; } else{ print "読み込めた"; } ######→読み込めません##### #クッキー書込sub sub set_cookie { local(@cook) = @_; local($gmt, $cook, @t, @m, @w); @t = gmtime(time + 2*60*60); @m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); @w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); $gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT", $w[$t[6]], $t[3], $m[$t[4]], $t[5]+1900, $t[2], $t[1], $t[0]); foreach (@cook) { s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $cook .= "$_<>"; } print "Set-Cookie: SID=$cook; expires=$gmt; path=/;\n"; } #クッキー読込sub sub get_cookie { local($key, $val, *cook); $cook = $ENV{'HTTP_COOKIE'}; foreach ( split(/;/, $cook) ) { ($key, $val) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } foreach ( split(/<>/, $cook{'SID'}) ) { s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; push(@cook,$_); } return (@cook); }

    • ベストアンサー
    • Perl
  • 下のCookieの質問に関しまして補足です その2

    さらに調べていたのですが、どうやら登録されているURLのデータに「=」が含まれていると 上手くいかないことが解りました。 以下のスクリプトで保存及び抽出データに「=」が含まれていても上手く処理する方法は無いでしょうか。 #***************************************************************************** sub plink{ #パーソナルリンク &error("現在、パーソ\ナルリンクは使用出来ません。") if !($personallink); my ($a1,$a2,$a3,%temphash); for $a1(split(/; */,$ENV{'HTTP_COOKIE'})){ ($a2,$a3) = split(/=/,$a1); $a3 =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; if ($a2 eq 'plink_list'){ foreach(split(/<>/,$a3)){ $temphash{$_}=1; } last; } } &filelock("linkdata"); open (IN,"$linkdata"); while(<IN>){ if ($temphash{(split(/<>/,$_))[15]}){ $totalct++; push(@site,$_) if ($totalct >= $startnum) && ($totalct <= $endnum); } } close (IN); &fileunlock("linkdata"); $endnum = $totalct if $totalct < $endnum; $startnum = 0 if $totalct == 0; $action = "パーソ\ナルリンク"; &searchbar("","<option value=\"\" selected>$searchtitle\n"); &databar(); if ($totalct != 0){ $resultmessage = "$totalct件のリンクが登録されています。<br /><br />"; &linkbar("act=$act&line=$line&indi=$indi"); &siteindicate("",@site); }else{ $resultmessage = "登録が無いか、クッキーが有効になっていません。<br /><br />"; $linkbar = $siteindicate = ""; } &html_output; } #***************************************************************************** sub plink_add{ #パーソナルリンク追加 &error("現在、パーソ\ナルリンクは使用出来ません。") if !($personallink); &get_cookie; $plink_list.=$url."<>" if $plink_list !~ /\Q$url\E/; &set_cookie; &searchbar("","<option value=\"\" selected>$searchtitle\n"); $linkbar = $siteindicate = ""; $action = "パーソ\ナルリンク追加"; $resultmessage = "<b>".&sitename_get."</b> をパーソ\ナルリンクに追加しました。<br />"; &html_output; } #***************************************************************************** sub get_cookie{ #クッキー取得 my ($a1,$a2,$a3); for $a1(split(/; */,$ENV{'HTTP_COOKIE'})){ ($a2,$a3) = split(/=/,$a1); $a3 =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; if ($a2 eq 'plink_list'){ $plink_list = $a3; last; } } } #****************************************************************************** sub set_cookie{ #クッキー設定 $plist_link =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; print "Set-Cookie:plink_list=$plink_list; expires=Thu, 1-Jan-2030 00:00:00 GMT;\n"; } #**************************************************************************** 宜しくお願い致します。

  • PerlでIf-Modified-Since取得

    Perlで書いているCGIで、 HTTP リクエストヘッダのIf-Modified-Sinceを取得したいのですが、 %ENVには入ってこないようです。 取得する方法があれば、教えて下さい。 ・.htaccess にSetEnvなどで記述することでできそうですが、方法が分かりません。 ・HTTP Request Header 全体を取得する方法でも結構です。 よろしくお願い致します。 環境は、さくらインターネットのレンタルサーバーのApacheです。

    • ベストアンサー
    • Perl
  • 基礎的なif文プログラムが動きません

    お世話になります。 Javascript初心者です。 とても基礎的なif文が動かなくて困っています。 ある名前のクッキーが既に存在していたら、あるページへリダイレクトさせる、というプログラムです。 クッキーの有無を確認するには <script type="text/JavaScript"> function getCookie(クッキー名) { if (document.cookie.length>0) { 実行文 } return ""; } </script> で、いける事が分かりました。 また、一方、リダイレクトするには location.href='アドレス'; で、いける事がわかりました。 そこで、これを組み合わせて、 <script type="text/JavaScript"> function getCookie(クッキー名) { if (document.cookie.length>0) { location.href='アドレス'; } return ""; } </script> とやってみたのですが、これが思う様に動きません。 どうしたら動く様になるのか、教示いただけると幸いです。

専門家に質問してみよう