Perl コーディング初心者質問コーナー Part37
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
04/08/22 01:41ID:???誰もが最初は初心者。
だからって、初心者に甘んじた質問の仕方は意味がないよ。
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこう言う事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0281nobodyさん
04/09/07 22:54ID:???PHP:
$str = "3SHRUNYAXA";
print strtr(\$str,"AIUEO", "aiueo"), " ", $str;
Perl:
$str = "3SHRUNYAXA";
print $str =~ tr/AIUEO/aiueo/ . " " . $str;
どちらも3 3SHRuNYaXaと表示。
0282259
04/09/08 00:54ID:mcKNZ5q4有難うございます。
って、全部英語なんですね・・・ 読めません(w;
0283nobodyさん
04/09/08 01:43ID:???0285nobodyさん
04/09/08 08:57ID:???0286nobodyさん
04/09/08 09:00ID:???0289nobodyさん
04/09/08 21:38ID:bxg/BX6l[email protected]
[email protected]
・・・
などのメールアドレスを読み込ませて、
一致しなければ、”未登録です”と表示させたいのですが、
ファイルに登録してあるメールアドレスも未登録だと表示されてしまいます。
もう半日以上いろんなサイトを見ながら試行錯誤していますが、
一向に解りませんでした。
どなたかご教授ください。
#メールアドレスの登録チェック
$a=0;
open(IN,"$mailfile") || &error("Open Error: $mailfile");
while (<IN>) {
($eml) = split(/\n/);
if ($in{'eml1'} ne $eml) { $a++; last; }
}
close(IN);
if ($a) {
&error("$in{'eml1'}は未登録です。");
0291289
04/09/08 21:53ID:bxg/BX6l素早いレスありがとうございます!
長時間悩んでいた自分が馬鹿でした・・・orz
0292nobodyさん
04/09/09 00:28ID:???0293nobodyさん
04/09/09 00:29ID:???0294nobodyさん
04/09/09 00:37ID:???引数が空なのにわざわざ()を付ける意味はあるんですか?
()は書いても書かなくても同じですか?
ということです。
0295nobodyさん
04/09/09 00:51ID:???0296nobodyさん
04/09/09 00:53ID:???納得しました。
0297nobodyさん
04/09/09 02:56ID:???挙動も違うがな。
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsub.html
0298nobodyさん
04/09/09 08:53ID:???&foo; # &foo(@_) と同じ
よって、&foo ≠ &foo()
0299nobodyさん
04/09/09 17:36ID:wkS7yjyl$tim = time;
で$timに「1094716247」といった10桁の数字が入りますが
この数字の内訳(? というかしくみを教えて欲しい・・・
やりたいことは
$dat = date('Y.m.d H:i', time());
で$datに入る「2002.09.09 15:00」といった文字列を
上の10桁の数字に変換することなのですが。
おねがいします。
0302nobodyさん
04/09/09 21:24ID:???sub timelocal {
my ($sec,$min,$hour,$day,$mon,$year) = @_;
my @month = (31,28,31,30,31,30,31,31,30,31,30,31);
$year += int($mon/12); $mon = $mon%12; $hour -= (localtime(0))[2];
my $days = -719162;
$year += 1899; $days += $year*365 + int($year/4) - int($year/100) + int($year/400);
++$year; if ($mon > 1 && (!($year%400) || (!($year%4) && ($year%100)))) {++$days}
while (--$mon >= 0) {$days += $month[$mon]}
$days += $day-1;
return((($days*24+$hour)*60+$min)*60+$sec);
}
0305nobodyさん
04/09/09 22:16ID:???0308弱杉
04/09/10 03:32ID:+ZeQb9+rperl (ver.5.00503)で、特定デレクトリを丸ごと圧縮(zipかlzhが希望)する必要が在り調べたのですが、
Archive::zipというモジュールが必要らしいと分りました。
しかし、このスクリプトの置き場所はレンタルサーバ(ア_ル)で、モジュールの追加インストールが出来ません。
zipもしくはlzh圧縮が可能なライブラリって無いでしょうか?
ご存知の方がいらっしゃったら教えていただけると大変、大変助かります。
どうぞよろしくお願いします。
(この質問はモジュール板の方が適切なのでしょうか? それさえも分らんのデス...)
0309nobodyさん
04/09/10 04:27ID:???0310弱杉
04/09/10 04:49ID:+ZeQb9+rア_ルから、ちょっと前にもらったモジュール一覧にも入ってなかったでんす。
私の勘違いでしょうか。。。
0311nobodyさん
04/09/10 05:24ID:???ActivePerl Build 810 (5.8.4 相当) なら入っているが、Build 522
(5.005_03 相当) には入っていないし、(素の) Perl ではどのヴァージョン
でも入っていない。ActivePerl 系でも lib/ の方ではなく site/lib/ の
方に入っているから標準モジュールでないと分かる。
http://perl.infoware.ne.jp/documents.html
>>310
Archive::Zip 自体は Pure Perl なモジュールだからコピーすればいいが、
中で非標準モジュール且つ要コンパイルの Compress::Zlib を使っている。
サーバに用意されていなければこれを Compress::Zlib::Perl に置き換え、
必要なモジュール一式を任意のディレクトリに置いて使えばいい。
もしくは、サーバに zip や lha がインストールされているなら system() で
呼ぶ方が楽だろう。
http://perldoc.com/perl5.8.4/pod/func/system.html
0315nobodyさん
04/09/10 13:50ID:???Time::ParseDate使えば一発だよ。
use Time::ParseDate;
print parsedate("2002.09.09 15:00");
0316弱杉
04/09/10 19:31:54ID:+ZeQb9+rお返事ありがとうございます&カメレスですんませんです。
Archive::Zipで必要とされているモジュールで、やはりCompress::Zlibのみありませんでした。
そこで、Compress::Zlib::perl ver.0.02 (不安なバージョンですが..)をCPANからDLしました。
でも、解凍するとMakefile.PLとかPerl.pmとかが入っていてそこでお手上げです...(レンタル鯖しかいじった事無い厨なので、Makeとか分らんのです)
Zip.pmとcompress_zip.pm(?) を置いて、Zip.pmからuseの代わりにrequireするだけとか勘違いしてました。
Compress::Zlib::perlはMake(?)しないとライブラリファイルにはならないのでしょうか?
また、鯖内のコマンド検索をしたら、gzipというのがは使えるみたいですが(pathは /usr/bin/gzip)、これは通信時の圧縮専用のものでアーカイブを作るのには使えないのでしょうか?
引き続きご指南いただければ幸いです。宜しくお願いします。
0317nobodyさん
04/09/10 20:20:41ID:???http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlmod.html
http://www.linux.or.jp/JM/html/GNU_gzip/man1/gzip.1.html
ちなみに gzip は Windows や Mac で良く使われる ZIP (PKZIP)
とは別形式。圧縮のみを担当し、複数ファイルをまとめる
(アーカイヴ) 機能は無いので、tar と連携させる事が多い。
Perl と関係ないので詳しくは余所で尋ねて。
0318弱杉
04/09/10 20:46:34ID:+ZeQb9+rお返事ありがとうございます。gzipに関しては参考URLで理解出来ました。
もう一点の『perlでのzipアーカイブの作成方法』についても
余所で訪ねた方がよろしいでしょうか?(モジュール関連スレとかに行けばよろしいですか?)
いちいちつまらん質問ですみません。。。
0319nobodyさん
04/09/11 02:24:58ID:???http://pc5.2ch.net/test/read.cgi/php/997829243/
CGIに依存しないPerlの話題一般/Part2
http://pc5.2ch.net/test/read.cgi/php/1030548610/
0320弱杉
04/09/11 02:38:55ID:cyd1fAb1ご指南ありがとうございました。そちらの板にいってきます。
スレ汚し、大変失礼しました。
0321nobodyさん
04/09/11 05:03:25ID:???しかし、以下のソースだと何故かクッキーには書き込まれるのにフォームに既入力の状態になりません。
何がおかしいのか見ていただけないでしょうか?一つ目のソースはこれです。
$cookie_id = 'regist';
&get_cookie();
$name = $cookie{ 'name' };
print "<meta http-equiv='Content-Type' content='text/html; charset=Shift_JIS'>\n\n";
print <<"HTML_TAG";
<html><head></head><body>
<Form action="registration.cgi" method="POST">
<table width="600">
<tr><td><input type="text" name="name" size="20" value="$name"><input type="submit" name="regist" value="確認画面"></td></tr>
</table>
</FORM>
</body>
</html>
0322nobodyさん
04/09/11 05:03:54ID:???sub get_cookie {
my( $cookie_name, $value );
foreach ( split( /; /, $ENV{ 'HTTP_COOKIE' } ) ) {
( $cookie_name, $value ) = split( /=/ );
$cookies{ $cookie_name } = $value;
}
foreach ( split( /&/, $cookies{ $cookie_id } ) ) {
( $cookie_name, $value ) = split( /:/ );
$cookie{ &unescape( $cookie_name ) } = &unescape( $value );
}
}
sub unescape {
my( $data ) = @_;
$data =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge;
return $data;
}
exit;
0323nobodyさん
04/09/11 05:04:18ID:???sub get_cookie {
my( $cookie_name, $value );
foreach ( split( /; /, $ENV{ 'HTTP_COOKIE' } ) ) {
( $cookie_name, $value ) = split( /=/ );
$cookies{ $cookie_name } = $value;
}
foreach ( split( /&/, $cookies{ $cookie_id } ) ) {
( $cookie_name, $value ) = split( /:/ );
$cookie{ &unescape( $cookie_name ) } = &unescape( $value );
}
}
sub unescape {
my( $data ) = @_;
$data =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1) )/ge;
return $data;
}
exit;
0324nobodyさん
04/09/11 05:05:28ID:???クッキーには確かに情報が入っているにもかかわらず、テキストボックスには何も表示されません…。
require "./sub_getparam.pl";# データ取得用サブルーチン
require 'jcode.pl';
$cookie_id = 'regist';
read( STDIN, $query, $ENV{ 'CONTENT_LENGTH' } );
&getparam( $query );
$name = $param{ 'name' };
$cookie{ 'name' } = $name;
&set_cookie();
print "<meta http-equiv='Content-Type' content='text/html; charset=Shift_JIS'>\n\n";
print <<"END";
<html><head></head><body>
<p><B><font color="red">内容を確認してください。</font></B></p>
<Form action="registration_complete.cgi" method="POST">
<table><tr><td>名前</td><td>$name</td></tr></table>
<input type="hidden" name="name" value="$name">
</form></BODY></HTML>
END
0325nobodyさん
04/09/11 05:06:02ID:???my( $new_cookie, $date );
@pairs = ();
foreach( sort keys %cookie ) {
push( @pairs, &escape( $_ ).":".&escape( $cookie{ $_ } ) );
}
$new_cookie = join( '&', @pairs );
$date = &gmt_date( time + 86400 * 120 );
if ( $new_cookie ne $cookies{ $cookie_id } ) {
print "Set-Cookie: $cookie_id=$new_cookie; expires=$date\n";
}
}
sub escape {
my( $data ) = @_;
$data =~ s/(\W)/sprintf( "%%%02X", unpack('C', $1 ) )/ge;
return $data;
}
sub gmt_date {
my( $data ) = @_;
( $sec, $min, $hour, $day, $mon, $year, $wday ) = gmtime( $data );
return sprintf( "%s, %02d %s %04d %02d:%02d:%02d GMT",
( Sun, Mon, Tue, Wed, Thu, Fri, Sat )[ $wday ], $day,
( Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec )[ $mon ],
$year + 1900, $hour, $min, $sec );
}
exit;
0326nobodyさん
04/09/11 05:07:00ID:???my( $new_cookie, $date );
@pairs = ();
foreach( sort keys %cookie ) {
push( @pairs, &escape( $_ ).":".&escape( $cookie{ $_ } ) );
}
$new_cookie = join( '&', @pairs );
$date = &gmt_date( time + 86400 * 120 );
if ( $new_cookie ne $cookies{ $cookie_id } ) {
print "Set-Cookie: $cookie_id=$new_cookie; expires=$date\n";
}
}
sub escape {
my( $data ) = @_;
$data =~ s/(\W)/sprintf( "%%%02X", unpack('C', $1 ) )/ge;
return $data;
}
sub gmt_date {
my( $data ) = @_;
( $sec, $min, $hour, $day, $mon, $year, $wday ) = gmtime( $data );
return sprintf( "%s, %02d %s %04d %02d:%02d:%02d GMT",
( Sun, Mon, Tue, Wed, Thu, Fri, Sat )[ $wday ], $day,
( Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec )[ $mon ],
$year + 1900, $hour, $min, $sec );
}
exit;
0328nobodyさん
04/09/11 05:24:21ID:???0329nobodyさん
04/09/11 05:45:52ID:???ソースを見ずにレス。
(´-`).。oO(見る気がおきねーよ)
「一つ前に戻ると」と書いてある。
つまりキャッシュされたページを見てると…
0330nobodyさん
04/09/11 09:03:38ID:???0331nobodyさん
04/09/11 09:30:58ID:???ソースみてないから推測だが
0332nobodyさん
04/09/11 10:37:18ID:???0333nobodyさん
04/09/11 11:28:31ID:???値を取り出して表示させるとか切り分けしてみ。
読む気にならんからこんなとこだな。
0334nobodyさん
04/09/11 19:54:24ID:3nx87n19以下の様なsprintfを含んだスクリプトが使用できずエラーと
なってしまいます。どなたか、Perlの環境は変えずに、代わり
となるスクリプトがあれば教えて頂けませんか?
&SUB(sprintf "%02", $a - 1);
sub SUB{
my $value = shift @_;
system "$SHELL_COMMAND $value";
}
0335nobodyさん
04/09/11 19:58:22ID:3nx87n19すいません。スクリプトが間違えていました。
&SUB(sprintf "%02d", $a - 1);
sub SUB{
my $value = shift @_;
system "$SHELL_COMMAND $value";
}
0336nobodyさん
04/09/11 20:06:17ID:???0337nobodyさん
04/09/11 20:41:24ID:3nx87n19何度もすいません。335のコメントが紛らわしかったので
再度書き込みました。
335で書いたスクリプトが正しいのですが、それでもエラーと
なっていますので、どなたか、代替のスクリプトがありましたら
教えて下さい。宜しくお願いします。
0338nobodyさん
04/09/11 20:45:06ID:???0340nobodyさん
04/09/11 22:07:01ID:???0342334
04/09/11 23:32:18ID:3nx87n19レスありがとうございました。
本日確認出来ない為、後日試してみます。
0347nobodyさん
04/09/12 16:17:53ID:???0350nobodyさん
04/09/12 18:47:25ID:???0351nobodyさん
04/09/12 18:51:08ID:???0352nobodyさん
04/09/12 22:28:31ID:???誤ればなんでもどうにかなると思ってるのか?
0354nobodyさん
04/09/13 01:06:09ID:???新しいものを上に書くには、書き込み時に、まずファイルの内容を変数にいれ、その書き込みの内容をファイルに上書きした後追加でそれ以前のを書くしか方法はないですか?
あと、こちらはブラウザから直読みじゃないのですが、ファイルの上から何行を読む、正規表現でマッチしたところだけを読むにはどうすればよいのでしょうか?
よろしくお願いしますm(_ _)m
0355nobodyさん
04/09/13 06:06:04ID:???↑のハイフンってハッシュのキーに使えますか?頭文字にはできないのは知ってますが、
2文字目以降にも使えないんですか?
0356nobodyさん
04/09/13 06:17:06ID:???考え方は一緒だが
open LOCK, '>' . $lock_file or die $!;
flock LOCK, 2;
open LOG, '<' . $log_file or die $!;
open TEMP, '>' . $tmp_file or die $!;
print TEMP $new_article;
print TEMP <LOG>;
close TEMP;
close LOG;
rename $tmp_file => $log_file or die $!;
close LOCK;
>>355
my %hash = ('-' => 'foo', -a => 'bar', '-a-' => 'baz');
print @hash{'-', '-a', '-a-'};
0357355
04/09/13 07:34:16ID:???あれ?使えた・・・・;
-が初めか最後の時にはクォートしなきゃいけなかったのか;
それが面倒であまり使われてないんですかね?それとも他にも何かの処理中に面倒なことが
起こる可能性があったりするんですか?
0358355
04/09/13 07:36:22ID:???0359nobodyさん
04/09/13 07:52:35ID:???0360nobodyさん
04/09/13 08:09:58ID:???文字列をクォートするのはどんな言語でも当たり前のことだろうに。
0361355
04/09/13 09:29:42ID:????
%form = ( a-a => 1 );
エラーになる。use strict環境下だからかもしれないけど。
>>360
通販サイトのCGIだから商品名、商品価格とか色々商品番号をキーとしたハッシュを作る時に
いちいちクォートを入れてると見づらいし、書きづらいorz
ハイフンなしでもいいがCSV形式に変換して落とす時にいちいちハイフンを追加するのもちょっと億劫orz
Perlって結構自由?ゆるい?からマルチバイトかメタ文字以外でクォートすることはないんだorz
だって面倒でしょ。JAVA畑の人は慣れてるかもしれないけどさ。
0362355
04/09/13 09:30:13ID:???の間違いね。
0363nobodyさん
04/09/13 09:33:33ID:aK+3swHZ「あなたのメアドは?」って聞かれたのですが、
これって何に使うのでしょうか?
0365nobodyさん
04/09/13 09:42:28ID:???>>364が言うように請求書が来るが、先払いも可能だよ。クレジット決済でやるのがまあ普通だね。
昔俺はメアドだけなら払わずに無視してもどこの誰だかわからないだろうと思っていたが、
IP+メアドで実は十分個人を特定できるようだ。(もちろん裁判所に申請して住所などの情報を調べる許可を得るみたいだが。)
0368nobodyさん
04/09/13 10:01:53ID:???バグレポートを送ったりそのバイナリをビルドしたPerl管理者に連絡を取りたかったりした時とか。
Perlが勝手にそのアドレスを使うことはない。(アプリが勝手に使うことはあるかもしれないが)
気になるなら[email protected]にでもしておけ。
>>364-366 悪質な冗談はやめとけ
0369nobodyさん
04/09/13 11:45:33ID:???if ($key eq 'log'){
$val =~ s/\,//;
if ($val =~ m/[0-9,]{1,10}/){
$number = $val;
}
}
ではうまくいきません。どの辺がおかしいかご教授願います。
0371nobodyさん
04/09/13 12:28:08ID:???0372nobodyさん
04/09/13 13:00:27ID:???そこから123245と6789と4567を別々に取り出したいの?
それとも12324567894567て続けて?
0373nobodyさん
04/09/13 13:01:37ID:???my $val = "datadata1,234,567datadata....,456,789";
my @tmp = $val =~ /(\d{1,3}(?:,\d{3})*)/g;
foreach (@tmp){
$_ =~ s/,//g;
print "$_\n";
}
0374nobodyさん
04/09/13 13:02:42ID:???12345677 てカンマだけを抜かした形で取得したいす
0375nobodyさん
04/09/13 13:06:15ID:???>>370の言うとおり。
if ($key eq 'log'){
$val =~ s/,//g;
$number = $val;
}
0378nobodyさん
04/09/13 13:53:22ID:???0379nobodyさん
04/09/13 14:45:23ID:Dm3Qguqcが数値かどうかを判定するいい方法Plz。
0380nobodyさん
04/09/13 14:48:19ID:???0381379
04/09/13 14:56:19ID:Dm3Qguqcその意味を理解するのに手間取ってしまいました。
if($a =~ /^\d+$/){
#数値
}
ですね、ありがとうございました。
■ このスレッドは過去ログ倉庫に格納されています