どなたか優しい人、構文チェックしてもらえまえんか?
エラーログは以下の通りです。
syntax error at ./accesslog.cgi 行番号 18, near "};"
Unmatched right curly bracket at ./accesslog.cgi 行番号 41, at end of 行番号
syntax error at ./accesslog.cgi 行番号 41, near "}"
Compilation failed in require at C:\check.cgi 行番号 54.
Perlへのリンクです。
ttp://www5e.biglobe.ne.jp/~kokotubo/upbbs/img/90.txt
>>397 メモ帳使うな。色付け・インデントできるまともなエディタを使え。このレス読んだ直後に変えなかったら殺す。
17行目#addr → $addr
36行目&error}('0'); → &error('0');
52行目\n\n; → \n\n";
もすかして殺人予告キタ━━━(゚∀゚)━━━ッ!!?
つうかこのスレ3年もってるのか…w
Eclipse+EPICがいいよな、Perlの開発環境。
あるサーバにPerlのパッケージファイルを設置しておいて、他のサーバの
Perlで書かれたプログラムがその他のサーバのパッケージを読み込むことは
できるのでしょうか?
どなたかご存知の方教えていただけますでしょうか
できてもレスポンスが悪そうだなぁ・・・。
404 :
そやな~:2005/09/24(土) 13:44:02
402:これはできん。なぜなら、ぱけじ呼んでもその中で使われてるバイナリのライブラリ
xx.soなんか読めんやろ。
みなさんの助けが欲しく、やってきました。
今仕事でperl言語をやっています。
アンケートのページの改造をやりたいのです。
質問なんですけど、ボタンをクリックすると、
アンケートのデータが入っているテキストファイルを読み込み、
その読み込んだデータでCSVファイルを作成して、
そのCSVファイルをダウンロードさせたいのです。
どうすればいいでしょうか?
【流れ】
・データファイルの読み込み
↓
・CSVファイル作成して、データを書き込む
↓
・CSVファイルをダウンロードさせる
よろしくお願いします。
>>405 仕事でしたらコンサルタントにご相談を。
>>405 問題になりそうな部分
・自動でダウンロード開始させるか?リンククリックさせるか?
・一意なファイル名をどう生成するか?
ヒント:
・リダイレクト
・MD5
これで出来なきゃ転職先探した方が良い。
Perlだけで、ユーザーサイドのoutlook expressの登録アドレスを参照して、メールすることができますか?
>>409 Perl for Win32が稼動しているサーバーだけですよね。
Perl使用可のレンタルサーバーは、どこでもfor Win32なんですかね?? わかる人、教えて。ちょっとスレ違いの質問でスマソ。
>>410 いいえ。むしろUnix系が主流でしょう。
あんまりWin32で
Perl動かしてる人っていないんじゃないの?
俺もWin32上で開発してるけど、なんかやりにくい。
winで書いて、サーバに上げて試していますが...
それが一般的じゃないんですか?
皆さんLinuxなんですか
hotmailのアドレス帳に自動でアクセスして、そのアドレスにメールを一斉送付することできますか?
MAILの内容は、あるURL.で、入力するのは、hotomailのIDとpassword。実行ボタンをクリックで、MAILの送信は、hotmailのサーバーでなく、CGIが置いてあるサーバーのものを使用します。
どのくらいの工数かかりますか? 1日で、できますか?
415 :
デフォルトの名無しさん:2005/10/13(木) 13:46:24
>>414 hotmailよくしらんがやりゃできるんじゃない?
工数はやる人の能力で100倍ぐらい違うのはザラなんで全く意味なし。
1日でできる奴はいるだろうけど、普通に開発会社にたのんだら1人日じゃ
やってくれないだろうね。
416 :
デフォルトの名無しさん:2005/10/13(木) 18:49:00
sedのスレってどこに有るのですか?
@_ = $a->b();
my $result = shift;
をまとめて記述することは出来ないでしょうか?
ハッシュの場合は警告が出るけど %{ $a->b() }->{hoge} で良いみたいなんですが。
本スレじゃないようなので移動します。
420 :
デフォルトの名無しさん:2005/11/17(木) 15:45:15
cronでperlスクリプトを定期的に起動して、あるサーバが正常に機能しているかチェックしたいのですが、
HTTPサーバに接続して、ページを取得した際に、正常に取得されたかどうかはどのようにしたら分かるのでしょうか?
MD5でも取って比較すれば?
422 :
デフォルトの名無しさん:2005/12/12(月) 00:02:36
わかる方、力を貸して欲しいです。ほんと困ってます。
google web apiをperlで使って、検索語を含むWebページのヒット数、URL
を表示するようなプログラムを作りたくて、あるサイトのプログラムを参
考にして作ったのですが、実行したら英語のサイトのURLが表示されて、
明らかに検索語を含んでいません。
もしこうした方がいいという案がありましたら、教えていただきたいです。
自分はPerlをあまり使ったことがなく記述の仕方もいまいちわかっていない
状況です。自分なり本を読んで少しプログラムも書いてみたのですが
まだまだのようです。どうかよろしくお願いします。
use SOAP::Lite;
use Jcode;
my $googleSearch = SOAP::Lite -> service("file:GoogleSearch.wsdl");
my $key='LkML035QFHLEaaFEoFDfPd2VZFDzWGCE';
my $query="とんかつ";
my $result = $googleSearch -> doGoogleSearch($key,jcode($query)->utf8, 0, 10, "false", "", "false", "", "UTF-8", "UTF-8");
#print "About ".$result->{"estimatedTotalResultsCount"}."results.\n";
printf("query=%s %d results\n",$query,$result->{estimatedTotalResultsCount});
for $i(@{$result->{resultElements}}){
printf("%s,%s\n",jcode($i->{title})->euc,jcode($i->{URL})->euc);
}
423 :
デフォルトの名無しさん:2005/12/12(月) 03:32:40
>>422 Net::Googleじゃだめなの?それとここにgoogleアカウントは書かないほうがいい
424 :
デフォルトの名無しさん:2005/12/12(月) 09:42:56
>>423 最初のuseの部分をuse Net::Googleに書き換えるということですか?
ご指摘ありがとうございます。
アカウントは実験的に取得したやつなので、問題ないかと思われます。
心配してくださって、ありがとうございます。
ワラタ
2002年かよ。
428 :
デフォルトの名無しさん:2006/02/11(土) 11:07:17
直リンクが不可能なアップローダー cgi あったら便利だと思う
直リンクされたことによって消滅するアップローダは多いからな
perl で書かれたものキボン
かなり遅レスだけどhtaccessかその類の物でよくね?
すみません。教えてください。
@commentというところに
xxxxxxxxxxxxxxx(4/26)
xxxxxxxxxxxxxxx(4/27)
xxxxxxxxxxxxxxx(4/28)
xxxxxxxxxxxxxxx(4/28)
のようなデータがあって、
それの中で日付が当日の行に対して
xxxxxxxxxxxxxxx(4/26)
xxxxxxxxxxxxxxx(4/27)
xxxxxxxxxxxxxxx(4/28) New!
xxxxxxxxxxxxxxx(4/28) New!
というように行末に「New!」を加えたいんですが
どうやったらいいんでしょうか?
431 :
デフォルトの名無しさん:2006/04/28(金) 17:30:45
入門書みながらやってるんですけど、全然わかりません。
$find = index ($comment, $date);
if ($find >= 0) {
$comment=s/\n/New!\n
}
そりゃ酷い入門書だなw
my $mon = "4", my $day = "28";
grep {s/\(?<=\Q$mon\E\/\Q$day\E\)/ New!/} @comment;
やべ、間違てたw
grep {s/(?>=\($mon\/$day\))/ New!/} @comment;
ありがとうございます。試してみたけど動きませんでした。
日付のところは例に挙げていたのは正しくなくて正しくは
xxxxxxxxxxxxxx(4/26 xx:xx)
xxxxxxxxxxxxxxx(4/27 xx:xx)
xxxxxxxxxxxxxxx(4/28 xx:xx)
xxxxxxxxxxxxxxx(4/28 xx:xx)
という感じで時間も入ってました。
とりあえず時間の部分を削ってやってみましたがうまくいかず・・・
じゃあこれで。
grep s/(?>=$date)/ New!/, @comment;
すまん今起きたばっかりで寝ぼけていたようだ。すまん.
これで秒が入ってても大丈夫だと思うよ。
grep {/$date/ and s/$/ New!/s} @comment;
おお、出来たっぽいです!!
マジでありがとうございます。
マジで泣けてきます
438 :
じょー:2006/05/27(土) 16:04:39
サーバーのシェルスクリプトをsystemコールして動かないんですが、どうしたらよいんでしょうか?
初期設定が出来てないとかエラーが出てます・・・
初期設定してみなされ
正規表現で、目でみると実際は空行に見えるが、tabが入っていて
実は空行ではない。のを検索するにはどうしたらいいですか?
その他の空行ではない行でtabが入っていても無視する。
というものです。
^\t+$
こっちでも怒られたら悪いがもう答えない。
1行に同じ単語が3度以上表れる行をperl正規表現で書くとどうなりますか?
わかる人お願いします。
正規表現1本じゃ書けない。コーディングが必要。
word.*?word.*?word
じゃだめかなw
/^.*?(word.*?){3,}$/
これではどうか?
(\Qword\E).*?$1.*?$1
javaのXMLEncoderで書き出したファイルをXMLDecoderライクに
扱えるperlってありませんか?
449 :
デフォルトの名無しさん:2006/07/02(日) 19:03:01
$hoge = 'A B';
$hoge =~ s/ /\\E\\s\+\\Q/g;
if( 'A B C' !~ m/\Q$hoge\E/ig ){ print $hoge; }
if( 'A B C' !~ m/\QA\E\s+\QB\E/ig ){ print 'aaa'; }
上三行みたいな事がしたいのですが
うまくいきません
お知恵を拝借できませんか?
もっとスマートなやり方もあるとは思うが、
my @data = map { '\Q' . $_ . '\E' } qw( A B ) ;
my $str = 'if ( \'A B C\' !~ m/' ;
$str .= join '\s+', @data ;
$str .= '/ig ){ print \'hogehoge\' . "\n" }' ;
eval $str ;
それだとAの部分に'$a'とかが混じっていたときに期待しない動作をします
まあ、そうだろうねw
そこらは map 中でエスケープしちゃえばいい。
Text::CSV_XSについて教えてください。
man Text::CSV_XS.3pmを読んでも解決しませんでした。
$csv->parse($_);
@columns=$csv->fields();
としてCSVファイルの中身を@columnsに格納できるのですが、@columnsは普通の配列じゃない
みたいで、添え字指定で任意の位置(行と列を指定した位置)のデータを取り出すことができません。
foreach $factor (@columns){
print $factor,"\n";
}
や
foreach $factor (@columns[0]){
print $factor,"\n";
}
はできても、$columns[0][0]などではアクセスできません。このfieldsメソッドで作成された配列は
どのような構造になっているのでしょう。ご教示いただければ幸いです。
>>453 Text::CSV_XSはCSV1行を扱うためのもので、CSV複数行で構成される2次元の表を
扱うようなものではない。
>>453 ありがとうございます。自分の勘違いに気がつき突破口が開きました。
while($line=<IN>){
}
の中で処理していたのを忘れて悩んでいました。感謝です。
456 :
デフォルトの名無しさん:2006/08/16(水) 19:20:08
あるフォルダの中にある全てのファイル名を拾いたいのですが、やり方がわかりません。
やり方のわかる方はお教え願います。
456
すいません解決しました。
大文字小文字変換に関する質問です。
例えば、CURR OPIN NEUROL NEUROSURGという文字列をCurr Opin Neurol Neurosurgと変換したい
と考えています。
$line="CURR OPIN NEUROL NEUROSURG";
foreach $i (split(/ /,$line)) {
push(@w, ucfirst(lc($i))." ");
}
print @w;
とするのは冗長である気がするのですが、もっと賢く簡潔にやる方法ないでしょうか。
>>458 1バイトごとのビット演算なんてどうかしら?
0x4F で and して 0x60 で or するとか。
・・・でもucfirstしなきゃか。orz...
$line =~ s/(\w+)/ucfirst lc $1/ge;
>>460 おぉぉぉぉ素晴らしい!ありがとうございました。
なるほど、なるほど。(\w+)とgを組み合わせたらよかったんだ。
462 :
デフォルトの名無しさん:2006/09/08(金) 18:47:31
データの中に含まれる$を\$とエスケープしたいのですが、
$hoge =~ s/\$/\\$/g;
とすると
Final $ should be \$ or $name at fuga.pl line 53, within string
とエラーになります。$を\$に置換するにはどうすればよいのでしょうか。
463 :
462:2006/09/08(金) 18:58:57
すみません。解決しました。
=~ s/\$/\\\$/g;
ちょっと疑問に思ったんだが、MovableTypeとかPerlで書かれてるソフトウェアってたくさんあるけど、あれってソース公開しなくていいのかな?
絶対GPLのライブラリとか使ってると思うんだが…
>>464 Perlについての質問箱スレに回答しておいたよー
466 :
デフォルトの名無しさん:2006/11/18(土) 02:19:05
ハッシュの配列をソートしたいんだが、どうしたらエレガントにできますか?
my @hogename = { 'apple', 'orange', 'peach' };
my @hogeval = { 200, 100, 400 };
#
# ここで、@list_of_hash の配列を作る
#
my @list_of_hash = ();
for($i=0; $i<@hoge; $i++) {
my $hash = {
name =>@hogename[$i]; #要素名
val =>@hogeval[$i]; #要素の値
};
push(@list_of_hash,$hash);
}
# @list_of_hash を要素の値の昇順にソートするエレガントな方法は?
# いまさっき、いわゆる「馬鹿ソート」をコーディングしたんだけど
# エレガントな方法がきっとあると思う。
#
map { $_->[0] }
sort { $a->[1] <=> $b->[1] }
map { [$_, $_->{val} ] } @list_of_hash;
468 :
デフォルトの名無しさん:2006/11/25(土) 14:01:05
sub decode {
my($val) = @_;
$a=int($val/(2**40));
$b=(int($val/1048576))%1048576;
$c=(($val-($a*1048576+$b)*1048576))%1048576;
return ($a,$b,$c);
}
32ビット以上の整数$val下位から20ビット、20ビット、10ビットを別な変数$c,$b,$aに取り出す
できるだけ高速なdecode関数を作るとして、もっとよい書き方はあるんでしょうか?
>>468 その関数自体バグってないかい?
$aには41ビット目から上が全部入ってるけど。
>>468 先に下の20ビットを抜き出した後で残り30ビットを普通に & や >> 使って求めればいいんじゃないだろうか。
つまり、こう。
# 下 10 ビットを $c へ入れる。
$c = $val % (2**10);
# 元の値を10ビット右シフト
$val = int($val / (2**10));
# 下 20 ビットを $b へ入れる。
$b = $val & ((1 << 20) - 1);
# 残り 20 ビットを $b へ入れる。
$a = ($val >> 20) & ((1 << 20) - 1);
但しこのままだと元の値が 52 ビット以上あった場合は 32 ビット用に
コンパイルされた Perl だと正常動作しないと思います(というのは
最初の20ビット右シフトをした段階で32ビット以上存在することに
なるためです。値の保持はできてもシフト演算でまともな結果を返さない
かも知れません)。
元の値が52ビット以上だったとしても正常動作させるためには最初の
20ビット右シフトをやった直後に残り30ビットだけを残して上の桁を
なくすなどの処理が必要です。
>>468 sub decode {
my ( $val ) = @_;
# 40bit右シフトした値の下位10bit
my $a = ( $val >> 40 ) & 0x3FF;
# 20bit右シフトした値の下位20bit
my $b = ( $val >> 20 ) & 0xFFFFF;
# 下位20bit
my $c = $val & 0xFFFFF;
return ( $a, $b, $c );
}
これでどうさね?
もちろん処理系は64bitなんだろね?
>>471 IEEE754の64ビット倍精度(よく32bitマシンのC言語のdoubleで使われているやつ)
だと仮数部が52ビットある。
http://ja.wikipedia.org/wiki/IEEE754 で、Perl は普通の 32 bit CPU の PC で普通にコンパイルすると数値はこれ
使ってると思うので、64ビット環境でなくても50ビットの整数は変数に入れ
られる。ただ問題は32bitを超える値の場合にそのままシフト演算ができない
ことにある。これは多分シフト演算をする時に32bit整数に変換してから行って
いるからだ。
観客としてはもとのより速くなったかどうかが知りたいわけですが
ベントとったひといない?
手元のperlは64bit整数使えないので自分でとるのはちょっと大変
なのです。
474 :
デフォルトの名無しさん:2006/11/29(水) 19:48:56
my ($c,$b,$a)=unpack("B20B20B10", $val);
32bit環境だとこれもうまく動作しないみたいです。
475 :
デフォルトの名無しさん:2006/11/29(水) 19:58:08
perlの64ビット倍精度数値の仮数部のビットを一部でも抜き出すのって無理なのだろうか?
>>473-475 >>470読んでないのか?
32ビット以下にしてしまえばビット計算できるんだから最初だけ
普通に計算して残りをビット計算すれば良いんだよ。
>>476 ベンチは別の方法で回避したのを測定してもそれはその方法のベンチで
あって本来測定したかったものではないからだめだろ。
数値を読んだらまず特定のバイナリ形式にpackして、
それから unpack B10 とかで取ればいい。
479 :
デフォルトの名無しさん:2006/12/01(金) 22:04:23
簡単には書けないから468のようなコードになっている。
>>479
演算回数が同じならビット演算のほうが浮動小数演算よりはやい。
ベンチとるかどうかはコードを見てからだな。
>>473 環境に依存するコードでよければ高速になるようだが、32bit環境でも
動作するコードで高速なコードがかけるかどうかは、50ビットの値から
32ビット以下の複数の値を取り出すエレガントな書き方があるかどうかだ。
シフト、論理演算、モジュラ、pack全部使えないのだから、だめなんでは。
入力データの形式が文字列なのかPerlのよくわからん数値なのかはっきりしてほしい。
環境依存でいいならいくらでも解決方法あるよな。
たとえばWin32ならCのDLL一個書いてWin32::APIですぐだ。さすがにコード貼る気はないが。
>>481 unpackは"d"とかも駄目なのか?まだ使えないという結論はでてない。
468,471のコード見る限り64ビット倍精度で50ビットの数値が入力されるのでは。
>>482 環境依存の場合は64ビット環境で471のコードでOK。
>>483
#!/usr/bin/perl
use bigint;
$hexstr="100000000";
print hex($hexstr),"\n";
というスクリプトを実行すると、
Integer overflow in hexadecimal number at ./test1.pl line 5.
4294967296
と警告が出ます。結果は正しいのですが。
本来どうするべきものなのですか。
use Math::BigInt;
$hexstr="100000000";
$b = new Math::BigInt("0x$hexstr");
print $b,"\n";
小文字のbigintは気づかぬところでバグが出るから俺は好きじゃないな。
最近見たソースの中に@{$hoge[$num]}というような表記をしている箇所が
数カ所ありました。
@{}って何を表しているのでしょうか?^^;
それっぽいキーワードなどGoogleに入れてみたんですが、
適切なサイトを見つけることができず、どなた教えて頂けると助かります。
変数名とかを変数にしたいときの書き方
@LIST =(1,2,3);
$hoge = 'LIST';
print @{$hoge};
>>488 おぉ、なるほど。
そんな書き方があったんですね(^^;
ありがとうございます。
>>487 配列へのリファレンスをデリファレンスしているのでは。
$hoge[$num] = [1,2,3];
print join(",", @{$hoge[$num]});
>>488 いまどきシンボリックリファレンスを教えないように。
>>487 てか、その程度のことはPerlの入門書に書いてあると思うのだが。
492 :
デフォルトの名無しさん:2006/12/26(火) 16:00:54
CGI.pmを使って、下と同じような処理をするにはどのようにすれば良いのでしょうか。
read(STDIN, $temp, $ENV{'CONTENT_LENGTH'});
@query = split(/&/, $temp);
foreach (@query) {
($name,$value) = split(/=/);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$query{$name} = $value;
}
ググれば一発だと思うんだけど・・・
494 :
デフォルトの名無しさん:2006/12/26(火) 16:35:28 BE:474948465-2BP(1)
$q=new CGI;
@query = $q->param;
とか
@query = param;
とか試したけどうまくいかない。
(CGI.pmバージョン3.25)
欲しいのはこれか?
%params = $q->Vars;
あなたは神だ
PCの解像度を取得できませんか?
>497
とりあえず環境依存だと思う。
>>497 解像度というのは、デスクトップの大きさのこと?
Windows なら、GetWindowRectというAPIで取れる。
Perl での使い方は適当にググって調べてちょ。
やっぱそのキャラのファンか・・・
青ラクダ本書いてたときはSamurai Xだっけ?
>>497 $| = 1;
print "PCの解像度を入力してください >> ";
my $kaizoudo = <STDIN>;
Win XPで”デフォルト”のプリンター名取得できませんか?
Win32::Printer::Enum
で全てのプリンタ名のリストはできるのですが。。。
Win32::APIがあるから、あとはそっち系のスレで聞け
つーかマルチしてね?その質問
いろんなところで見るな。
WinAPIスレで親切な人が教えあげたみたいだが
>>504 print "デフォルトのプリンター名を入力してください。\n";
my $default_printer_name = <STDIN>;
パールが出してくれるメッセージの解説はどこかにありますか?
perldoc perldiag
>>511 さっそくすみません。
man perldiagでもいいんですね。助かりました。
513 :
デフォルトの名無しさん:2007/04/23(月) 18:12:33
514 :
デフォルトの名無しさん:2007/05/28(月) 23:35:26
IP(ドメイン名)からアクセスポイントを取得するにはどうすればよいですか?
アクセスポイント・・・アクセスポイント?
IP(ドメイン名)・・・IP(ドメイン名)?
オブジェクト指向で、objectAのメソッドfooからobjectBのメソッドvarを呼ぶ場合って、
下記みたいな書き方でいいのかな?一般的にはどう書くの?
----main.pl
-略-
package main
Use classA;
Use classB;
objectA = new classA;
objectB = new classB;
-略-
----
----classA.pm
-略-
package classA;
sub foo
{
my $self = shift;
$self->{val} = $main::objectB->var('param');
}
-略-
----
classA.pm から use classB; すりゃあいい。
$main:: なんかイラネ
520 :
518:2007/05/29(火) 18:14:23
>519 ㌧クス。
反省。質問を単純化しすぎだった。
オブジェクト複数を互いに呼び合えるように宣言するにはどうすれば良いか?って話なんだけど・・・。
>classA.pm から use classB; すりゃあいい。
した場合、objectAからobjectBのメソッドを呼べるけどobjectBからobjectAのメソッドを呼んだ場合どうなるんだろ?
他には、objectCやらobjectDが出てきた場合どうなるんだろ?
classA.pmで my objectB=new classB;したobjectBと、classC.pmでmy objectB=new classB;したobjectBは別物だよね?
漏れ、何か勘違いしてる?
漏れが思いつく範囲では、
・mainパッケージのobject保持変数を参照する(>518に書いた方法)
・各objectをお互いにセットする
ぐらいなんだが、一般的な書き方ってどうなのかと思って聞いてみました。
何がしたいのかよくわからんが、
それはメソッドを呼び出すのではなく、fooに引数として渡せばよいだけのことでは?
あるいは各クラスにクラスデータとして持たせるとか、、、
package SomeClass;
my $objectA = ClassA->new();
my $objectB = ClassB->new();
以下、メソッドの定義(メソッド内で$objectA,$objectBを使う)
522 :
518:2007/05/29(火) 19:56:38
実際にやりたい事:
DBオブジェクトやセッションオブジェクトと画面表示オブジェクト(画面の種類毎にいくつかある)の連携
セッションオブジェクト(sessionObj)に格納したデータを画面表示オブジェクト(AdispObj)に渡して表示するのにメインで、
$AdispObj->setdata('dataA',$sessionObj->getdata('dataA'));
$AdispObj->setdata('dataB',$sessionObj->getdata('dataB'));
$AdispObj->displayAll();
見たいな事をしていたが、
メインが本筋の流れの制御以外の事を大量に抱え込むのでソースが見づらくなってる。
で、画面表示オブジェクトのメソッドの中でセッションオブジェクトやDBオブジェクトから
データを直接取り込んだらどうかと思ったわけ。
オブジェクト指向ってオブジェクトとオブジェクトがメソッドでやり取りして処理を進めるものなんだろ?
C++チョットかじった程度で、それから7年以上経ってるんで実際どうやってたか忘れてるんだが、
その辺のコーディングスタイルの標準がわかれば良いかと思ったんだ。
SomeClassとか、mainとは別のパッケージを作るのが一般的なの?
オブジェクトを使う目的のひとつがカプセル化だから、結局セッターやゲッターを介してしか
クラス間でデータのやりとりはできんのよ。
mainでその操作を隠蔽したいのであれば、各クラスに静的な領域を作り、
完全修飾で直接アクセスまたはメソッドを介したアクセスをするしかないわな。
package Adisp;
sub displayAll
すまん、途中で送ってもうた
sub displayAll {
shiftキーうかつに押すとミスりやすいな
sub displayAll {
Session->new->getdata($param)でSessionクラスからデータをロード
以下処理
}
結局、最初に自分で書いたのが多少みにくくてもベストではないのかな
526 :
518:2007/05/29(火) 23:34:42
実装の参考にはならんかもしらんが、
perlboot, perltoot, perltooc, perlbot
読めば?perl の OOP が(変態的な部分を含めて)載ってるよ。<- 当たり前
実装でハデにがちゃがちゃやってんのは、俺の専門分野の奴なら知ってるけど
専門外の人にはとてもじゃないけどお勧めできんので。スマン。
オブジェクト同士が互いを呼び合うというのは、あんまりやるべきではない。
クラス設計をまずは見直すべき。
OOなら、そういうのはインターフェースを使うんだがな。
Perlでそこまでするのはどうなんだろうな。
>>522 みたいのは、デザインパターンだと、コマンドパターンの典型だな。
うむ
531 :
518:2007/05/31(木) 01:29:27
皆様の意見大変参考になりました。勉強しなおしてきます。m(_ _)m
>526 どっかで、perl OOPのお手本を見たければ、CPANに登録されてるMail関連を見ろって書いてあった。
PerlでOOPしたいなら、まずは
perldoc boot
perldoc toot
perldoc tooc
perldoc perlbot
あたりを読んどけ
PerlでOOPしたいなら、Rubyに乗り換えた方がいいだろ。
> PerlでOOPしたいなら、Rubyに乗り換えた方がいいだろ。
Ruby に乗り換えると、Perl で OOP をしたいとう願望を達成できるのか?
いまいちよく分からないので、このスレを全部使ってでもいいから説明してくれ。
536 :
デフォルトの名無しさん:2007/07/09(月) 11:27:14
HTML::Template使ってるんですけど、
<TMPL_INCLUDE NAME="ファイル名"> のファイル名を
動的に変更できませんか?
もろちんできますょ
538 :
デフォルトの名無しさん:2007/07/09(月) 18:08:39
そこをなんとか、ご教授を。
539 :
デフォルトの名無しさん:2007/08/11(土) 01:23:31
Windows XP で Active Perl を使用してるのですが、
漢字のとりあつかいについて、ちょっと行き詰まったので教えてください。
まず分かったこと:
・Perl で Shift JIS を扱うのは自殺行為に等しい。
・EUC は C言語や Perl 専用につくられたコードなので、
できればそっちを使うのが良いが Windows ではかえって混乱するだけ。
・今どきなら、UTF-8 を使うのが Cool。 Java も PHP も MySQL も、
UNIX 由来の言語はみな内部で UTF-8 処理しているから。
・ちなみに Windows は内部処理では UTF-16LE を使用しており
通常の API と UNICODE 版API の2種類を持っている。
ファイルシステムもUNICODE化されており、Shift JIS では無い文字がファイル名に使えたりする。
で、当然、use utf8 でバリバリ書こうと決心したのですが・・・
もうメチャクチャです。漢字ファイル名のファイルがぜんぜんオープンできないんです。
最初は画面表示も化けまくってたのですが、これは binmode STDOUT,":encode(cp932)" で解決しました。
でも print __FILE__ で化け化け、print $ARGV[1] も化け化け。readdir したファイル名も化け化け。
readdir で取ってきたファイル名でファイルをオープンすることもできず、もうどうにもなりません。
java、vbscript、jscript、php、c、c++、C#、j# もちろんBATファイルも、perl 以外の言語なら何も問題なくできる事が
perl に限って、漢字ファイル名が開けない、-f とか -d でもテストできないんです。
何か方法があるのでしょうか? open FILE, "<:encode(cp932)", "月間売上表.txt" じゃダメなんですかね・・・
>>539 あんたが「漢字ファイル名」と呼称しているものがPerlからどう見えているのか
調べればいいだろ。
542 :
デフォルトの名無しさん:2007/08/11(土) 15:01:57
やっぱダメっす。
問題を切り分けるために、たった2行だけの短いプログラムにしてみました。
use utf8;
open FILE, ">:encode(cp932)", "月間売上表.txt" or die;
それでも 「Died at test.pl line 2.」 って怒られます。
こんなに短いプログラムの、いったいどこにバグがあるのか見当がつきません。
バッチファイルで
ECHO 7月,300まんえん>月間売上表.txt
だと何も問題なくファイルが作られるんです。だからディスクのエラーでは無いと思います。
もうワケワカメです (T_T)
「表」が原因だな
use utf8;
use Encode qw(encode);
use open ":utf8";
open FILE, ">", encode("cp932","月間売上表.txt") or die;
print FILE "Perlなんて、つかっちゃらめぇ><";
545 :
デフォルトの名無しさん:2007/08/12(日) 00:37:08
>>544 おお、ネ申光臨!
バッチリです。そんな裏技があったとは知りませんでした。的確なご回答に感謝します。
ただ、そこまではウマクいったんですけど、処理を追加したらまた問題が発生しました。
12行目の rename で die してしまうんです。
(rename をコメントアウトすれば動くんですが、データのバックアップができなくなるんで・・・ちと不安)
use utf8;
use Encode qw(encode);
use open ":utf8";
open FILE, "<", encode("cp932","月間売上表.txt") or die;
@data = <FILE>;
close FILE;
foreach (@data) { $_ = "(済)" . $_ } # テキトーにデータ加工処理
if (-f "月間売上表.bak") { unlink "月間売上表.bak" or die }
rename "月間売上表.txt", "月間売上表.bak" or die; # <-- ここで死ぬ
open FILE, ">", encode("cp932","月間売上表.txt") or die;
print FILE @data;
close FILE;
……(絶句)
知的障害者が来ているようだな
547 :
デフォルトの名無しさん:2007/08/12(日) 02:19:17
svgをjpgなどに変換したいのですが、よく分からず困っています。
librsvgなどを使用するんでしょうか?
>>546 頭の弱い子によくありそうなことじゃない。
障害って程でもなかろう。
> ・EUC は C言語や Perl 専用につくられたコードなので、
> できればそっちを使うのが良いが Windows ではかえって混乱するだけ。
クマーーーー
そもそもマイクロソフトが作ったインターネットでPerlを使うのは
法律違反すれすれなんだが、今さらそんな事を言ってもしょうがない。
だけどEUCの使用は明白な犯罪。やめた方が良い。
>>550 ∩___∩ |
| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ j
彡、 |∪| | J
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
>539
無茶苦茶言ってるなw
PerlでもShift_JISはよく使うし、状況次第でiso-2022-jpでもeuc-jpでも使うよ。
utf8は扱いづらい。他のコード同様、それを使うのが自然な時にだけ使う。
> utf8は扱いづらい。
老人?
554 :
デフォルトの名無しさん:2007/08/13(月) 17:28:27
utf8 はたしかに使いづらいよ。現に
>>545 のようなバカが沸いてきてるし。
誰も
>>545 の謎が解けないようだから代わりにオレがバカの相手をしてやる。
いいか、正解は、こうだ。日本語にはすべて encode("cp932",○○) をつける。
use utf8;
use Encode qw(encode);
open FILE, "<:encoding(cp932)", encode("cp932","月間売上表.txt") or die;
@data = <FILE>;
close FILE;
foreach (@data) { $_ = "(済)" . $_ } # テキトーにデータ加工処理
if (-f encode("cp932","月間売上表.bak")) { unlink encode("cp932","月間売上表.bak") or die } # ここ
rename encode("cp932","月間売上表.txt"), encode("cp932","月間売上表.bak") or die; # ここ
open FILE, ">:encoding(cp932)", encode("cp932","月間売上表.txt") or die;
print FILE @data;
close FILE;
print encode("cp932","月間売上表.txt を更新しました。\n");
どうだ、cp932 だらけのすばらしいコードだろ?実にゲージュツ的だ。惚れ惚れするね。
これを業界では 「encode cp932 地獄」と言う。割と有名なハナシだ。良く覚えておけ。
> 545のなぞが解けない
マジレスするともうutf8ネタは繰り返し繰り返し出るネタで答えるのに飽きたネタだからスルーしてるだけよ…
>>554 どこの糞業界だよ、それ
そもそもutf8なファイル名リテラルで使ってる時点で間違いに気づけよ
557 :
デフォルトの名無しさん:2007/08/13(月) 23:45:19
>>556 それを言うなら、「そもそも perl 使ってる時点で間違いに気づけよ」 だな。
> それを言うなら、「そもそも perl 使ってる時点で間違いに気づけよ」 だな。
そうか。代替案があるなら提示してくれよ。
どうせ煽ってるだけの馬鹿なんだろうけど。w
559 :
デフォルトの名無しさん:2007/08/15(水) 07:12:37
>>558 それは
>>556に言えよ。代替案があるなら提示しろとな。
どうせ煽ってるだけの馬鹿なんだろうけど。w
560 :
デフォルトの名無しさん:2007/08/15(水) 22:05:57
utf8って書いたらスクリプトをUTF-8で保存しろよ。
それで全て解決だろ。
561 :
デフォルトの名無しさん:2007/08/15(水) 22:10:55
562 :
デフォルトの名無しさん:2007/08/16(木) 02:15:50
あららんらんらん~~~
>>554 は実際に utf8 で保存して、ちゃんと動作テストを済ませてありますよ。
これ以上弄りようの無い、カンペキなクソperlコードですがなにか?
>>560 バカですか?つうかバカですか?いやむしろバカですか?
>>561 以下同文
まぁいずれにせよ、質問に回答はしない、他人の回答はなじる罵倒する。
でも自分は代替案も何も出せない。
他の言語スレには見られない、Perl スレの決定的な特徴。
no utf8 も使えないバカが粘着してることは分かった
564 :
デフォルトの名無しさん:2007/08/20(月) 01:31:42
>>554 それでも良いんだけど、
ファイル名があっちこっちに散乱しているのは美しく無いですよ。
こんな風に手直ししてみてはいかがですか?
use utf8;
use Encode qw(encode);
binmode STDOUT,"encoding(cp932)";
$filename = "月間売上表.txt";
$backup = "月間売上表.bak";
open FILE, "<:encoding(cp932)", encode("cp932",$filename) or die;
@data = <FILE>;
close FILE;
foreach (@data) { $_ = "(済)" . $_ } # テキトーにデータ加工処理
if (-f encode("cp932",$backup)) { unlink encode("cp932",$backup) or die }
rename encode("cp932",$filename), encode("cp932",$backup) or die;
open FILE, ">:encoding(cp932)", encode("cp932",$filename) or die;
print FILE @data;
close FILE;
print $filename," を更新しました。\n";
565 :
デフォルトの名無しさん:2007/09/23(日) 01:29:05
素人質問で申し訳ありません~!!cpanシェルで
install XML::XBEL
を実行すると、途中で
Install Module::Build now from CPAN? [y]
と出るので、yをおしました
そしたら最後に
/usr/bin/make install -- OK
*** Cannot install without Module::Build. Exiting ...
Running make test
Make had some problems, maybe interrupted? Won't test
Running make install
Make had some problems, maybe interrupted? Won't install
と出て、インストールできませんー!
どうか解決のアドバイスをください・・・・。。。。
>565
Module::Build がインストールできていないようなので、ログのもっと前の方を調べるべき。
567 :
デフォルトの名無しさん:2007/09/23(日) 10:29:56
568 :
565:2007/09/23(日) 12:52:59
Module::Buildを手動でインストールすることにしまして、
make、make testは通ったんですが、その後のmake installで
ERROR: Can't create '/usr/local/lib/perl5/site_perl/5.8.8'
Do not have write permissions on '/usr/local/lib/perl5/site_perl/5.8.8'
とエラーが出ました。
レンタルサーバー上での作業のため、一般ユーザ権限しかないので
怒られるのは当然なのですが、インストール先(?)を変更するには
どうすればよいのでしょうか?
>>568 makefileくらい自分の環境に合わせて編集しろよw
570 :
565:2007/09/23(日) 13:42:15
低レベルの質問で申し訳ありません。
webで調べたのですが、どうしても書き方がわからなくて。
installdir=/home/(mydir)/lib/perl
といった感じに設定すればよいのでしょうか?
Perl初心者の質問です。
CSVにデータを書き込むにはどうすればいいでしょうか?
モジュールで読み込むことには成功しました。
他のモジュールをいくつか試したのですが上手くいきません・・・
ご教授お願いします。
573 :
デフォルトの名無しさん:2007/10/27(土) 03:07:13
「うまくいきません」じゃわからんよ。
とりあえず、いちばん簡単なのは、ファイルをオープンして print 文で。
あ、改造はWebProg板かorz
>>575 改造だからとかじゃない。webプログラミングはWebProg板。
577 :
デフォルトの名無しさん:2008/01/11(金) 00:10:36
ファイルとスカラーを引数に実行するプログラムを作りたいです。
以下のように書くと、ファイルは読み込んでくれるのですが、スカラーがないと言われます。
whileのところが悪いと思いますがどう書いたらいいでしょうか?お願いします。
&data_input($line, $num);
sub data_input{
($refline, $refnum) = @_;
while ($refline = <>) {
chomp $refline;
578 :
577:2008/01/11(金) 00:32:09
shift を使って解決しましたm(__)m
579 :
デフォルトの名無しさん:2008/01/11(金) 14:43:33
このスレでいいのかどうかわからんけど、質問させていただきます
・WindowsのActivePerlで、cpanを使ってHash::Mergeをインストールしたい
・Cloneが必要らしいから、先にこっちをインストールしよう
・cpan Cloneすると、make testの段階で「msvcr90.dllが見つからない」とエラーが出る
・msvcr90.dllまでのパスを通すと、今度はCランタイムエラー(R6034)が出る ←今ここ
もうさっぱりわからない
環境:
WindowsXP Pro SP2
ActivePerl 5.10.0
Visual C++ 2008 Express Edition
>>579 若干スレ違い気味だけど、自分の場合(XpSP2+VC2005)での対処法。
perl Makefile.pl
で出来上がった Makefile のなかの、実際にコンパイルが走ってる行で、
”-MD” となっているところを全て ”-MT” に変更する。
でさらに、リンクライブラリが列挙してあるところの
”mscvrt.lib” を ”libcmt.lib” に変更してから、nmake && nmake test を掛ける。
これは、詳しくはMSDNのリファレンスを見てもらいたいんだけど、
.Net がWindowsに入って以降、標準のCランタイムライブラリが、
”libcmt.lib”から”msvcrt.dll”に変更された。(VCでのデフォルトになった。)
この”msvcrt.dll”は、実体は”msvcr80.dll”(XP+Net2.0+VC2005の場合)へのダイナミックリンクのローダーなんだけど、
Windows上で有効なCランタイムライブラリが、以前(VC2003以前)は、”libcmt.lib”からのstatic_linkだったのが、
2005から、”msvcrt.dll”へのdynamic_linkへ変更された模様。
(だから、以前VC2003で書いてたCソースをそのままVC2005でコンパイルしなおしても、動かないことが頻発)
ウチで以前いろいろ試した時は、”*.manifest”があっても、ロードしてくれなかったり、
実際コンパイルしたマシン上では正常に動作しても、それをパッケージングした.ppmを、他のマシンに
インストールして実行したりすると、そちらと同じように「msvcr80.dllが見つかりません」みたなエラーが出て実行出来なかった。
(しかも、その他マシンに、.Netインストール済み且つVC2005もインストールして、コンパイルしたマシンと同じ 環境設定しても、同じエラーが出た。)
msvcrt90ってことは、.Netは3.0かな?OSはひょっとしてVistaかな?
VC2008はまだ触ったこと無いんで詳しくはわからないけど、まだこの方法でいけると思う。
でもMSDNによると、将来的には”libcmt.lib”のstaticlinkオプションを切って、全て”msvcrt.dll”での動的ロードに切り替えて行く方針らしい。
581 :
デフォルトの名無しさん:2008/01/11(金) 17:38:17
>>580 その通り置換したらいけたー
ありがとう。勉強になったよ
582 :
デフォルトの名無しさん:2008/01/29(火) 11:07:02
perl-baseパッケージというのは以下のように説明されていますが、
Debian -- sid の perl-base パッケージに関する詳細
http://packages.debian.org/ja/sid/perl-base 基本的な部分だけ入っているというのは具体的にどういう意味なんでしょうか。
1. perlパッケージが入っていればperl-baseパッケージを入れる必要がないのでしょうか。
2. perl-baseを入れればperlインタプリタが一緒にインストールされるのでしょうか。
(perlコマンドが使えなかったのでそういうわけでもなさそうですが。)
3. perl-baseを入れると何らかのモジュールがインストールされるのでしょうか。
4. perl-baseだと具体的にどういうものが不足するのでしょうか、可能性として。
以上お願いします。
質問箱に書き込めないので、
split で分割して foreach で処理しようとしましたが、順序が元の文字列と変わる場合があります。
これが仕様なのかわかりませんが、どう対処すればよいでしょうか?
コードさらせよ
>>584 なぜ順番が変わるのかを突き止めて、その原因を取り除く。
>>585 >>586 レス有難うございます。
コード自体はそれほど長くないのであげることはできますが、必要なデータファイルが
ここに挙げるには大きすぎるので要点だけを書き射抜いたところ、再現しません。
仕様ではなさそうなので、ちまちま検討してみます。
経験的に、そういう場合は同じところを最初からもう一回書き直せば直る。
split に使う正規表現が間違ってるから
期待とは違う分割をされちゃって
順序が違ってしまったように見えてる、とかね
684です。
お騒がせいたしました。
ちまちま検討した結果、なんともはやお粗末なバグであることが判明しました。
split 後の各ワード(日本語)は漢字、ひらかな、カタカナ、数字、アルファベット(全角・半角)
なのですがその語が辞書ファイルにあれば該当する語を返し、ない場合はカタカナ(全角)
である場合はひらかなにして返すと言うくだりで、件のひっくり返り事件がおきました。
この辞書ファイルというのがカタカナ・ひらかな変換ができていない時に構成されて
そのときどう言う訳か具体的には「ラッツ&スター」の「ラッツ」が「すたー」に、「スター」が
「らっつ」に登録されていたのです。
(continue)
584の間違いでした。
続き、
したがって、要点だけを抜き出したルーティンではこの現象が再現されなくて当然です。
(各ワードをプログラム中に設定し、それをsplitして単にひらかな変換しjoinし出力)
まことに申し訳ありません。
しかし、splitの仕様かとも思ってこちらに質問し、レスの感触からそうではなさそうだと
わかり遠回りせずに済みました。有難うございました。
誘導してくださいお願いします(´;ω;`)
下記のように代入した場合に、「aa」と「bb」の部分にあたる要素名一覧を取得する方法はありますか?
$hash{'a'}->[0]->{'aa'} = 100;
$hash{'a'}->[0]->{'bb'} = 500;
@key = keys($hash{'a'}->[0])でできる?
とか思ったばかな自分にご教授お願いしますm(_)m
keys %{$hash{'a'}[0]}
594 :
592:2008/02/04(月) 21:01:27
>>593 おおおお━━━━(T▽T)━━━━!!
できました!
%{ }で囲えばよかったんですね…
勉強になりました!
ご協力感謝いたします。
どうもありがとうございましたm(_)m
sedの上位バージョンと言う位置づけでperl5.10に取り組んでいます。
日本語のマッチングに関しては、「基本的にできない」という捉え方でよいでしょうか?
perlに精通するのが目的ではなく、実用上のツールとしてどうか、ということで
アドバイスをいただければ幸です。
>>595 Encodeとかencodingのドキュメントを読めばできるんじゃね?
>>594 > %{ }で囲えばよかった
Perl のリファレンスの部分を勉強したほうがいいと思う。
そうしたら $hash{'a'}、$hash{'a'}->[0] の正体と、それをどう扱ったらいいのか理解できる。
599 :
デフォルトの名無しさん:2008/02/05(火) 14:07:04
質問です。
JavaScriptからHTMLへ値を受け渡すときのように、
CGIからHTMLへ値を受け渡すことは可能なのでしょうか?
CGIの変数の中身をHTMLのテキストボックス内で表示する方法はあるのでしょうか?
アドバイスをいただけるとありがたいです。
>>600 Webプログラム板で聞け。
$value = "hogehoge";
print "<input type='text' value='$value'>";
>>601さん
ありがとうございます!!
解決しました!!!!!
603 :
デフォルトの名無しさん:2008/02/13(水) 22:52:49
大変、初歩的な質問で申し訳ないのですが、教えてください。
今まであるサーバで使っていたCGIを新しいサーバに移設したいのです。
そこで、新しいサーバの指示通りに設定してみましたが、下記のようなエラーがでます。
何が原因なのでしょうか?・・・
: In string, @jcom now must be written as \@jcom at >form.pl line 27, near "/usr/sbin/sendmail -t -f s-hirono@jcom"
: In string, @mfi now must be written as \@mfi at >form.pl line 437, near "@mfi"
: form.pl had compilation errors.
ちゃんと書いてあるじゃん
> In string, @jcom now must be written as \@jcom
って。
605 :
デフォルトの名無しさん:2008/02/13(水) 23:14:17
すんません、素人なんで意味がわからないんですよ・・・
606 :
デフォルトの名無しさん:2008/02/13(水) 23:15:14
¥をどこかに足すって意味ですか???
ご丁寧にも自然言語でエラーメッセージだしてくれてるんだから、素人も玄人も関係ないだろ。
でも素人の頃は、俺もこんな感じだったな。
「分からない」っていう先入観があるんだよな。
分かってしまえば、「あー、本当にそのまんまじゃん・・」って気付くんだけど。
609 :
デフォルトの名無しさん:2008/02/14(木) 00:17:22
今朝のみのさん:その三角形のやつなんだっけ?
汚点気お姉さん:はい雲がこういう形に見えます
今朝のみのさん:いやその三角形のやつなんだっけ?
汚点気お姉さん:はい矢印ですね。風がこっちから吹いてきます
今朝のみのさん:いやその三角形のやつなんだっけ?
汚点気お姉さん:ああっ! 女神様っ
今朝のみのさん:いやその三角形のやつなんだっけ?
汚点気お姉さん:ああっ! 寒冷前線ですね。毎朝やってんだから分かれよ。
610 :
603:2008/02/14(木) 01:23:04
すんません、\@jcom
って感じでやってみましたが、やはりだめでした。
確かにそのままの文章になってる気はしますが、根本的なところがわからないのでわかりません。
611 :
603:2008/02/14(木) 01:24:52
ちなみに、
>>603 で書いたのは、サーバに付いてるCGIチェッカーのエラーメッセージです。
実際にwebから送信してみると、下記のエラーがでます。
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, admin@oxy-club.net and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
612 :
デフォルトの名無しさん:2008/02/14(木) 01:34:46
>「分からない」っていう先入観があるんだよな。
まさにそのとおり。よく読めば中学生でもわかるやさしい英語でかいてある。
> In string, @jcom now must be written as \@jcom at >form.pl line 27, near "/usr/sbin/sendmail -t -f s-hirono@jcom"
翻訳:27行目の @jcom は \@jcom って書かなきゃダメだよ~ん
他の残りの行は宿題として取っておく。自分で解けるよね?
613 :
デフォルトの名無しさん:2008/02/14(木) 01:41:44
師曰く 「ルーク、フォースを使え」
コンピュータだから難しい。
perl なんて使ったことが無いからわからない。
そんな先入観を捨てて、中学1年生のあの頃の素直な気持ちに帰ってみろ。
お前らスレ違いなのに優しいな
それに対して
>>603の丸投げ感は一体…
大体ソースコードも張らずにどうして欲しいんだ?
615 :
603:2008/02/14(木) 22:33:34
返答ありがとうございます。
CGIチェッカーのエラーは解消されました。
ですが、本番のweb上ではやはり
>>611のエラーがでます。
>>614 スレ違いですか?それは失礼。
他に適当なスレが見つからなかったものですから。。。
他に良いスレがあるようなら教えてください。
web上のエラーはweb制作板に言え
617 :
デフォルトの名無しさん:2008/02/14(木) 23:05:01
スレ違い厨は気にせんでもいいよ。
でもな、
>>611 は、書いてることを読め、としか言いようが無い。
英語が読めないんだったら、読める人に頼んで訳してもらうとか、何か自分で考えろや。
この先一生つきまとう問題だぞ。
618 :
603:2008/02/15(金) 00:21:54
web制作に行っても適当なのがなさそうでした・・・
ソースはってもいいすか?
>>611を読んでも、結局わからないのですが・・・ 管理者に聞けみたいな話ですよね?
スレ違いの懸念濃厚ですが…
windows上で *.pl を実行する場合(一般的かどうかわかりませんが私の環境では)、
ウィンドウが開かず全画面で一瞬真っ黒になります。
これを避けるため、batに記述して起動しています。
しかし中には引数の受け渡しの関係からこれができない場合が生じました。
batを使わずにウィンドウ上で起動する方法があればご教示ください。
>>620 よくわからんけど、Perl.exeにPIFファイル設定すりゃなんとかなるんじゃね?
ファイル名のリストから数字の付いていないものをみつけ出し、それらのファイル名に数字の付いたものを出力しようとしました。
期待する出力は
aa
aa86.txt
ww
ww873.txt
q
q12.txt
なのですが実際は
aa
ww
q
となります。どこが悪いのかご教示ください。
ソース:
use utf8;
@f = ("aa.txt","aa86.txt","fff73.txt","ww.txt","ww873.txt","q.txt","q12.txt","mm55.txt",
"gg21.txt",);
@nn = grep(/^\D+$/, @f);
foreach $nn(@nn){
$nn =~ s/\.txt//;
print "$nn\n";
@n = grep(/^$nn\d+$/, @f);
print join("\n", @n);
}
>>623 @n = grep(/^$nn\d+\.txt$/, @f);
625 :
デフォルトの名無しさん:2008/02/17(日) 03:58:30
@n = grep(/^$nn\d+$/, @f);
↓
@n = grep(/^$nn\d+\.txt$/, @f);
じゃない?^ とか $ の意味がわかってて使ってるのかな?
626 :
623:2008/02/17(日) 14:35:25
>>624 >>625 レス有難うございます。そんなポカだったか…、と思って元ソースでやってみると
問題は違っていました。
ここに書き込むためにいろいろ端折っているうちに余計なところまで削ったようです。
その所為で同じような出力になりそれを書き込んでしまった次第です。
そこで元ソースをそのまま書き込もうとしましたが、長すぎてできません。
627 :
623:2008/02/17(日) 14:36:27
元ソースです。
use utf8;
use Encode;
$movepath = encode('sjis', "パソコン\\番号なし");
chdir "E:\\My Documents";
chdir $movepath;
@files = glob("*.txt");
@nonumfiles = grep(/^\D+$/, @files);
print join("\n",@nonumfiles),"\n-----------------------\n";
foreach $nonumfile(@nonumfiles){
$nonumfile =~ s/\.txt//;
print $nonumfile,
"\n=======================\n";
@numfiles = grep(/^$nonumfile\d+\.txt$/, @files);
foreach(@numfiles){
print $_, "\n";
}
print "\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
}
628 :
623:2008/02/17(日) 14:37:33
で、該当ディレクトリには
---------------------------------
"お助けパソコントラブル救急隊.txt",
"お助けパソコントラブル救急隊886.txt",
"お助けパソコントラブル救急隊887.txt",
"お助けパソコントラブル救急隊888.txt",
"なっとく!ワード773.txt",
"なっとく!ワード774.txt",
"なっとく!ワード775.txt",
"なっとく!ウインドウズXP.txt",
"なっとく!ウインドウズXP873.txt",
"なっとく!ウインドウズXP874.txt",
"なっとく!ウインドウズXP875.txt",
"なっとく!ウインドウズXP876.txt",
"なっとく!エクセル836.txt",
"なっとく!エクセル837.txt",
"なっとく!エクセル838.txt",
"なっとく!エクセル839.txt",
"なっとく!パソコン用語.txt",
"なっとく!パソコン用語1265.txt",
"なっとく!パソコン用語1266.txt",
"なっとく!パソコン用語1267.txt",
"なっとく!パソコン用語1268.txt",
"WindowsXPの便利技と裏技855.txt",
"WindowsXPの便利技と裏技856.txt",
"WindowsXPの便利技と裏技857.txt",
"WindowsXPの便利技と裏技858.txt",
"グーグルの便利技と裏技212.txt",
"グーグルの便利技と裏技213.txt",
"グーグルの便利技と裏技214.txt",
629 :
623:2008/02/17(日) 14:40:35
上のようなファイル群があり、
これをスクリプト内におけば問題は起きません。
ところが実際にディレクトリを読んで動かすと
お助けパソコントラブル救急隊.txt
なっとく!ウインドウズXP.txt
なっとく!パソコン用語.txt
-----------------------
お助けパソコントラブル救急隊
=======================
~~~~~~~~~~~~~~~~~~~~~~~~~~
なっとく!ウインドウズXP
=======================
なっとく!ウインドウズXP873.txt
なっとく!ウインドウズXP874.txt
なっとく!ウインドウズXP875.txt
なっとく!ウインドウズXP876.txt
~~~~~~~~~~~~~~~~~~~~~~~~~~
なっとく!パソコン用語
=======================
~~~~~~~~~~~~~~~~~~~~~~~~~~
となってしまいます。
630 :
623:2008/02/17(日) 14:43:38
以上、長々と御見苦しい限りですが何とかなりませんでしょうか。
よろしくお願いいたします。
>>627 (´-`).oO(「 use utf8; 」してるわりに、ファイル名の文字コードはsjisなのはなんでだろう・・・。)
(´-`).oO(とりあえず、Linuxでファイル名もUTF-8で動かしたら動いたっぽいが・・・。)
632 :
デフォルトの名無しさん:2008/02/17(日) 22:21:32
>これをスクリプト内におけば問題は起きません。
>ところが実際にディレクトリを読んで動かすと
ここがポイントだな。
perl スクリプトは utf8 で動いてる。
Windows は ShiftJIS で動いている。
文字コードを変換してやらないとダメね。
さぁ、perl の utf8 地獄でもがき苦しみましょう。
633 :
デフォルトの名無しさん:2008/02/23(土) 19:56:15
アクセスログの勉強しててわからないとこがあります。
配列の一要素にオートインクリメントがついてて
++$freq[$hour]; と書いてあるのですが、実際どこの部分に1がたされてるんですか
aとbの解釈どっちが正しい?
a、$hour に1足されてループする
→$freq[0]、$freq[1]、$freq[3]、$freq[4]、$freq[5] みたいのができる
b、$freq[$hour] という値自体に1足されてループする
一応、全体の書いとくとこんな感じです。
ちなみに$freq[ ]という配列はこのwhile文できゅうに出てきてます
while($ln = <FILE>)
{
($hour , $min , $host , $refer , $agent) = split( /\t/ , $ln);
++$freq[$hour];
}
634 :
633:2008/02/23(土) 20:06:07
すません
自己解決しました
636 :
635:2008/02/23(土) 20:09:48
おそかった
637 :
正志:2008/02/23(土) 21:54:58
CSVファイルで行列を入れ替えてファイルを作るプログラムない?
#!/usr/bin/perl
use strict;
use warnings;
use Text::CSV_XS;
use List::MoreUtils qw(each_arrayref);
my $csv = Text::CSV_XS->new({binary=>1});
my @list;
while (<>) {
next unless $csv->parse($_);
push @list, [$csv->fields];
}
my $ea = each_arrayref(@list);
while (my @l = $ea->()) {
$csv->combine(@l);
print $csv->string . "\n";
}
639 :
正志:2008/02/23(土) 23:20:56
>>638 なんかすごいものをありがとうございます。
Windowsの場合はどうしたらいいでしょう
OS関係ないだろ
Windows 環境は大変だ。普通の奴は C コンパイラも nmake も持ってるわけがないし
よしんば持っていても、perl Makefile.PL が吐き出す Makefile は不都合が多すぎる。
(MinGW 派はいつも疎外感にさいなまれ、泣いている)
その上 XP 以降だと、こんな状況らしい:
ttp://harapeko.asablo.jp/blog/2006/12/21/1041020 幾多の困難を乗り越えて、ようやく Windows でも新しいモジュールを試すことが出来るのだ! ( 完 )
# でも Text::CSV_XS は新しくはないだろって?
# いいや、少なくとも去年の 6 月以前の ActivePerl には入っていないのだ orz
642 :
正志:2008/02/24(日) 21:55:15
困ったなあ。 なあ640。
だったらText::CSV_PPとかでよくね?
644 :
デフォルトの名無しさん:2008/03/15(土) 01:10:04
@Dataという配列にハッシュを入れてキーはA、Bがあります、そのおのおのの値をFA1、FB1する
@Dataという配列は100個のハッシュを持ってるとします。
$Data[1]{"A"} = FA1
$Data[1]{"B"} = FB1
...
$Data[100]{"A"} = FA100
$Data[100]{"B"} = FB100
FB1~FB100でソートし標準出力に出力したいのですが、どうすればいいか教えて下さい
print sort {$a->{'A'} <=> $b->{'B'}} @Data;
646 :
デフォルトの名無しさん:2008/03/15(土) 17:34:40
inlineC使おうと思ってるんだけど
LinuxではinlineCが動作するんだけど
activeperlだとVCでコンパイルしてるとあったから
VCのコンパイラ持ってきてコンパイルしてるんだけど
inlineがmakeでエラー吐く・・・
コンパイラがactiveperlと非同期のせいだと思うんだけど
どうすればいいのかな???
647 :
デフォルトの名無しさん:2008/03/15(土) 17:37:29
ちなみにVCはexpressバージョンです。
648 :
デフォルトの名無しさん:2008/03/18(火) 02:41:07
Pod::Textで日本語(utf8)のテキストを出力しているんだけど、
width指定が真っ当に動いてくれないのな。
まぁ1文字の幅がASCII文字と違うから当然なんだけども。
なにか簡単な解決策とかある?
649 :
648:2008/03/18(火) 05:10:25
とりあえずやっつけてみた。
Pod/Text.pmをローカルに持ってきてuse lib。以下のように修正。
もっといい方法があれば教えてエロい人。
sub wrap {
my $self = shift;
local $_ = shift;
my $output = '';
my $spaces = ' ' x $$self{MARGIN};
my $width = $$self{width} - $$self{MARGIN};
my @chars = grep(/[^\n]/, split(//));
my $len = 0;
my $tmp = '';
while (@chars) {
my $c = shift(@chars);
$tmp .= $c;
if ($c gt chr(0xff)) { $len += 2; } else { $len++; }
if ($len+1 > $width) {
if ($chars[0] =~ /[。、]/) {
$tmp .= shift(@chars);
}
$output .= $spaces . $tmp . "\n";
$tmp = '';
$len = 0;
}
}
if ($tmp) {
$output .= $spaces . $tmp;
}
$output =~ s/\s+$/\n\n/;
$output;
}
ちゃんと検証してないので的外れかもしれないけど。
・ファイルを直接編集せずに、Pod::Text::wrap(でいいのか?未確認)を上書きしたほうが楽かと
・「0xffより上」は不正確(不正確でもいいならいいけど)
・Jcodeのjfold()を使うのも手かも(あれも正確じゃないけど)
そういや昔、ちゃんと禁則処理して桁折りするモジュール探したけどなかったんだよな……。
いまもないのかな?
651 :
648:2008/03/18(火) 22:56:30
>>650 「0xffより上」に関しては不正確でも構わないのでこのままでいきます。
いわゆる半角カナとか使わなければ問題にはならなさそうですし。
>・ファイルを直接編集せずに、Pod::Text::wrap(でいいのか?未確認)を上書きしたほうが楽かと
やってみました。
これは楽でいいですね。ありが㌧!!
sub _Pod_Text_wrap { ... }
undef *Pod::Text::wrap;
*Pod::Text::wrap = \&_Pod_Text_wrap;
関数のオーバーライドは初めてやったのですけど、
こんな感じでいいのかな? いちおう動いてますが。
それでいいんじゃない?
僕は
*Pod::Text::wrap = sub {
...
};
とかやっちゃいますが。
元のを残すなら上書きする前に
my $org_wrap = Pod::Text->can('wrap');
とかすれば良かった気がする。
653 :
デフォルトの名無しさん:2008/03/24(月) 00:29:20
こんにちは、そしてみなさんはじめまして。
macOS10.3にperlの5.10をいれて動かしたいんですが
インストールしたはいいもののその後どうしたらよひか
わかりません。どうか詳しい方おしえてください。
ターミナルを立ち上げる
655 :
653:2008/03/24(月) 14:35:27
ターミナルを立ち上げました!
ターミナルに、
perl -e 'print "Hello Worldn"'
と打ち込んでリターン。
これで君も今日からPerlプログラマー
657 :
653:2008/03/24(月) 16:16:39
ターミナルに
perl -e 'print "Hello Worldn"
と打ち込んでPerlプログラマーになりました!
しかし、perl -V と打ち込んでリターンしても
バージョンは5.8のままです…。
そうか…。
>>657 新しいperlがある場所をターミナルに教えるための設定変更が必要になる。
これはperlとは関係ないから、Mac板のプログラム関係のスレで聞いた方がいいと思う。
そのとき、どうやってperlをインストールしたかも書いた方がいいよ。
$ uname -a
Darwin **** 9.2.2 Darwin Kernel Version 9.2.2: Tue Mar 4 21:23:43 PST 2008; root:xnu-1228.4.31~1/RELEASE_PPC Power Macintosh
$ whereis perl
/usr/bin/perl
$ perl -v
This is perl, v5.8.8 built for darwin-thread-multi-2level
(with 1 registered patch, see perl -V for more detail)
Copyright 1987-2006, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at
http://www.perl.org/, the Perl Home Page.
何かの参考になれば。。。
661 :
653:2008/03/24(月) 21:28:04
なんとかできました。5.8から5.10になりました。
656さん、659さん。ありがとございます!
ちなみにperlのバージョンは5.8と5.10ってどう違うんですか?
あと5.10が使えるようになったら5.8は捨ててしまってもよいのですか。
>>660 スレ違いだって言われてんだから大人しく引っ込んでろっての。
あっちにゃ「macをUNIXとして使う」スレだの「terminal初心者」スレ
だのあんだろーーがよお。
bash デフォだから
echo 'PATH=/usr/local/bin/:$PATH' >> ~/.bashrc
source ~/.bashrc
perl -v
してみろっての。
お前さんが、/usr/local/bin/ 以外に perl 5.10 入れたんだったら知らん。
つーか何で5.10を入れたんだ?5.86で十分だろ?変なクセつけるだけだぜ?
っての。
あ、遅かった。遅れた煽りほどかっこわるいものはない。orz...
>>661 基本的に流儀として/usr/binの中とかからは捨てないよ。
/usr/binの中のものをupdateする時はupdate相手のbackupを取って置くものだし。
664 :
653:2008/03/24(月) 22:10:16
了解しました。とっときます。
$file='hoge';
・・・
foreach(sort(keys(%hoge))){
・・・
}
のように %hogeにあたる部分を $file を用いて参照する方法があればご教示ください。
eval
chdirで移動した後、元のディレクトリに戻る方法がわかりません。
ご教示ください。
ごめんなさい。668です。直前のevalの{ }のあとに ; がないために
できなかっただけのようです。
取り消します。
@zcap = qw(aa po);
$zra{'def'}='abc';
foreach( @zcap){
eval{
print "(%z$_){'def'}\n";
};
}
を修正して、 abc と出力させる方法を教えてください。
スイマセン
$zpo{'def'}='abc';
でした。
@zcap = qw(aa po);
$zpo{'def'}='abc';
foreach( @zcap){
eval('print "$z' . $_ . '{'def'}n"' );
}
>>671 イタタタタタタタタタタタタタタタタタタタタタタ
@cap = qw(aa po);
eval{
foreach(@cap){
push(@acap, '\@a$_');
}
};
foreach (@acap){
$$_[0] = 6;
}
print $aaa[0], $apo[0];
で 66 を出力したいのですが修正をお願いします。
またおまえか
677 :
デフォルトの名無しさん:2008/04/12(土) 01:01:39
cgiに送ったデーターはどこに格納されるんですか?
679 :
デフォルトの名無しさん:2008/04/12(土) 01:41:38
おちんちんにperlを埋め込みたいんですが、腕のいいクリニックをご存知ありませんか?
>>676 また、"おまえ"です。
よろしくお取り計らいください。
>>675 シンボリックリンク相当の処理をevalで無理矢理やりたいのですね。
しかも全部グローバル変数で。
そんなことをしなければならない理由がわからない…いまやリファレンスを使えば
同等のことができますよ。
@aaaと@apoを、
my %array = ( aaa => [], apo => []);
として、
my @acap;
foreach (keys %array){
push(@acap, $array{$_});
}
foreach (@acap){
$_->[0] = 6;
}
print $array{aaa}[0], $array{apo}[0];
ではだめなの?
もっともこのコード自体なにしたいかわからんけど。
>>681 ご指導有難うございます。
理解できない部分が大半なので、じっくり検討します。
なにせ古い解説書しか持たないもので…。
新しいのが欲しいが高いもので。
>>681 「シンボリックリンク」というのがまず分からなかったのですが、UNIXの
概念で、エイリアスかショートカットのようなものですね。
グローバルにしているのはローカルである必要がないことと、my の理解ができていない
ためかサブルーチンにいちいち argumentを渡すのが面倒なことが理由です。
aaa=> [] の記法は知らなくて、無名の配列のアドレスを aaa というポインタで参照できる
というふうに理解しました。
eval を使ったのは次の理由です。
@cap = qw(aa po); は実は aa とpo の間に50ほどの2文字があり、このセットをもう一組
必要とします。それらの2文字で参照できる配列群の配列を設定しようとしました。
静的な配列なので、あらかじめポインタの配列を準備すればよいのでわざわざ push で
押し込む必要はないのですが、2セットを楽に準備できればと思い eval を使いました。
その結果他の手段の知識がないために、あのような妙で馬鹿馬鹿しいコードとなった
わけです。
教えてくださいましたコードを必要な部分だけにしたところ、
%acap = ( aa => [], po => []);
foreach (keys %acap){
$acap{$_}[0] = 6;
}
$acap{po}[12]=777;
print $acap{aa}[0], $acap{po}[0], $acap{po}[12];
となりまして、期待通り動作しました。最後の2行は配列が確かにできていることの
検証のつもりです。
で、%acap = ( aa => [], po => []) という記法が使えると、
%tcap = ( aa => [], po => []) としてコピー&ペーストすれば簡単に当初の目的が
達成できることになり、ややこしい eval は必要なくなりました。
皆様にはお目ざわりだったようですが、今回はこれで恙無く解決しました。
有難うございました。
684 :
681:2008/04/13(日) 02:03:04
>>683 シンボリックリファレンスの間違いですorz
50個も要素があるなら、
%acap = ( aa => [], po => []);
は
%acap = map { $_=> [] } qw(aa po);
と書いた方が視認性が上がります。
# もっともこの初期化はなくても動きますが
>>684 またまた便利そうなものを有難うございます。
これから勉強してみます。
はじめまして。
昨日からPerlを勉強し始めました。
今変数を勉強しています。そこで、
$a=2;
$b=3;
$a=$b;
という、変数の代入を見て不思議に思ったのですが、
なぜ、せっかく変数aで2を指定してあげたのに、
後からわざわざ変数bに代入などするのでしょうか。
この記述は、主にどういちた場合に使用されるのですか?
どうかご回答よろしくお願いします。
ただの書き方の例だろ
まだ「へんすう」の説明段階なんだから、こんなこともできますよぐらいの
意図で書かれてるんでしょ。
$a=2;
$b=3;
# $a の初期値 2 を使いつつ $b に対して血で血を争うような壮絶な演算処理
$a=$b;
# 再び $b は地獄のような処理をくぐり抜けて
$a=$a+$b;
なんてことがあってもいいじゃない。
参考にしてる本が変数名に $a と $b 使ってるのなら、そっちが気になる。
691 :
688:2008/04/16(水) 19:41:12
>>689ー690
なるほど、わかりました!
どうもありがとうございます。
参考にしている本は「Perlの絵本」です。
初心者にもわかりやすいと聞いたので。
絵本は・・・
ダメなん?
694 :
690:2008/04/16(水) 22:45:31
スレ見たら「血で血を争う」とか書いてる人がいたので指摘しようかと思ったら
自分だったorz
絵本は初心者さんに人気みたいだけど、さて。
俺も絵本使ってる。
よくないなら他の書籍買うから、参考にダメな理由を教えてくれ。
$aと$bは特殊な変数なんで使わないほうがいいよ。
絵本は確認取れんので $a, $b の所だけ注意喚起させてくれ。
(絵本に例として $a, $b が使用されていた場合)
「$a, $b は共に定義済みの変数。」
sort { $a <=> $b } @hoge ;
なんかの時に使う。なので特に必要が無い限りは sort 以外で使わない方が良い。
熟練者が分った上で使う分には文句は言わないし、2ch で例として出して来ても
あまり気にしないが、これを初心者向けに安易に使用するのは疑問符が付く。
ただ、もっと大きな地雷を幾つも抱えてる初心者本はあるので、この一点のみで、
読んでもいない「絵本」を評価は出来ない。スマン。
参考
1. perl の定義済み変数
perldoc の perlvar ( 但し、5.8 以降。バージョンに注意。)
ググるかコマンドラインで perldoc perlvar
2. 熟練者の $a,$b 使用例
ttp://search.cpan.org/src/GBARR/Scalar-List-Utils-1.19/lib/List/Util.pm ふんだんに使われている。perl 標準添付モジュール。
3. 大きな地雷の例
「一週間でマスターするPerl for Macintosh」
OSX が一般化しようとしている時代(2002/07)に、classic 環境の
MacPerl にて perl を解説。もちろん、OSX へのインストール等、事細か。
OS9 の人も相手にしたかった事情があるのかもしらんが…。
っと長々と書いて投げようと思ったら、696氏が既に指摘してた。ま、いいか。
698 :
デフォルトの名無しさん:2008/04/20(日) 20:43:36
perlでクライアントの2chブラウザ作ったけど見たい人いますか?
4時間ほどで作りました
板違い
配列へのアクセス確認の目的で、
@acap = map { $_=> [] } qw(aa po);
foreach (@acap){
for($i=0;$i<7;$i++){
$$_[$i] = $i+11;
}
}
foreach $acap(@acap){
$j++;
foreach $cap($acap){
print '$j=', "$j\t$cap\n";
print join("\t",@$cap), "\n";
}
print "\n";
}
としました。
目論見では aa, po の2組だけが出力される筈でしたが
余計な(?)もう一組が出力され、この理由がわかりません。
ご教示いただければ幸です。
>>702 有難うございます、そういう手がありましたか。
>>700 > 余計な(?)もう一組が出力され、この理由がわかりません。
それは、あなたがそうなるようにコードを書いているからなのですが…。
普段からuse strictをしてコードを書くようにすると幸せになれます。
で、変なところは、1行目で@acapで受けているところ、それから、
2回目のforeachの内側のforeach $cap($acap){ の$acapです。
何をしているのか、1ステップずつ意味を確認して組んでみてください。
>>704 丁寧なご指導有難うございます。
1行目が致命的であったことがわかりました。
map の意味がわかっていないことに加えて、
ハッシュのレファレンス表現になじみがないことが
絡まりあって=>がmapに必要なものだと思ったことが
原因だと思います。
2番目のご指摘がまだ理解できません。もうすこし検討します。
sed からの亡命者である所為かuse strictを適用すると
コンパイルエラーの嵐で、使い物になりません。
折角のご助言ですが当分はこれなしでやってみようと思います。
修正分:
@acap = map { \@$_} qw(aa po);
foreach (@acap){
for($i=0;$i<7;$i++){
$$_[$i] = $i+11;
}
}
foreach $acap(@acap){
$j++;
foreach $cap($acap){
print '$j=', "$j\t$cap\n";
print join("\t",@$cap), "\n";
}
print "\n";
}
>>705 # 厳しいようですが、use strictを指定して使い物にならないコードは、
# すでに使い物になっていない気が…。そのようなコードはいざ動かない
# ときどこに問題があるのかを探すのが猛烈に大変ですよ。
@acap = map { \@$_} qw(aa po);
はなにをしたくてこのようなことをしているのですか? これは、結局
@acap = ([], []);
としているのと同じです。
それと、後半でfor文が2重になっていますが、内側の foreach $cap($acap){ は
ループにする意味がありません。要素が$acap一つだけなら、$cap = $acapと同じですから、
foreach $acap(@acap){
$j++;
print '$j=', "$j\t$acap\n";
print join("\t",@$acap), "\n";
print "\n";
}
で済みます。
まずは、何をしたいかを日本語で整理してみてはいかがですか。
日本語で書いて伝わらなければ、コードを書くことはできません。
707 :
デフォルトの名無しさん:2008/04/21(月) 16:51:51
ようするに、デバッグしてないって事だな。
708 :
サイタマン ◆mYN3wsz7vE :2008/04/21(月) 17:24:09
読みにくいコードがちょっとね。
何やってるか分からないコード各習慣付けるのは良くないですよ。
>>707 違う。この質問者は2chをデバッガと思ってる。
だから次には
「何故か出力が「$j=1 ARRAY(0x800ea0)」みたくなるのですが」
って質問が来る。
>>708 サイタマンもようやくプログラム板に常駐するようになったか。
自信がついたのかな?w
Fedoraを使っていると、モジュールインストールの方法には
cpam、cpanp、yumの3種が考えられますが、
これらを混在させて使った(同じシステムで複数の方法を使った)ときに
起こりうる弊害にはどんなものがあるでしょうか?
712 :
デフォルトの名無しさん:2008/04/25(金) 21:33:26
Sfido = new Camel "Amelia";
この構文&newという動詞を起動するらしいのですが、構文に&をつける
必要はないのでしょうか?
Sfido = &new Camel "Amelia";というふうに
>>712 PerlのOOP記法では&を付けなくてOK
714 :
デフォルトの名無しさん:2008/04/25(金) 21:43:20
>>713つけてもつけなくてもOKってことですか?
715 :
デフォルトの名無しさん:2008/04/25(金) 21:47:43
perl初心者でやる気あるんだけどラクダ本難しすぎて
3日かかって16ページしか進まない、俺むいてないのか・・w
>>714 付けちゃいけない。
というか今まで付けたことなんてなかったから試してみたらエラーになった。
書き方覚えたら実験してみるといいよ
>>715 ラクダ本は初心者には難しいからそれくらい普通
実際の例見ながら勉強した方がいいと思う
718 :
デフォルトの名無しさん:2008/04/25(金) 22:00:24
ありがとう、でもなんとか1年くらいでマスターしたい
と焦っておる
何か事情があるならともかく、そうでなければ焦らずに
ゆっくりじっくりやるほうがいいよ。
何を以って「マスターした」になるのかはわかんないけど
リャマ本を先に経由したほうがラクダ本が読みやすくなるんじゃないかな?
721 :
デフォルトの名無しさん:2008/04/25(金) 22:23:05
>>720無理して5000円もだして買ったのに、どっかにラクダ本
がいいって書いてあったから、明日りゃまかってくるぜ
>>718 1年もかかるのなら向いてないってことだ。
723 :
デフォルトの名無しさん:2008/04/25(金) 22:54:33
じゃあ半年
ラクダ本は、面白くて面白くて読むのが止まらない本だと思うのだが。
>>724はむいている人。
むいていない人もがんばって!
結構勉強して、Perlの本質が見えてくると
>>724みたいになれるんじゃないか?
俺はPerl初めてから4年くらい経ってラクダ本のおもしろさに気づいたクチなんだが。
727 :
デフォルトの名無しさん:2008/04/26(土) 19:07:59
先日むいてないのかなぁっていったもんだけど
別にラクダ本楽しくないとはいってない
専門用語がおおくてわかりにくいっていっただけ
ここはひねくれたプログラマーが少数だけどいるみたいだな
まぁプログラムはひねくれてたほうがいいのかな
解読しやすいしな、perl使える人らしいけど実際すごいのは
perl作った人だから勘違いすんなよwwwwwww
perlはひねくれたプログラマ向けの言語。
文法からしてひねくれてる。
729 :
デフォルトの名無しさん:2008/04/26(土) 19:25:43
昔さ、マンハッタンのエリートのデスクにはPerlのパッケージが必ずあった
っていう話があって、エリートになるにはオープンソースを使いこなさなくては
ならないって言われてた。
よくよく考えたら、本当にあったのはエクセルのパッケージなんだよね。
だからどうしたって言われればそれまでだけど、ちょっと考えさせられない?
perlをパッケージで買ってデスクに飾るってのも変な趣味だよね。
731 :
デフォルトの名無しさん:2008/04/26(土) 21:14:09
>>728おまえperlなんてなんもしらないのに、なんでこのスレにいんの?
>>729 > 昔さ、マンハッタンのエリートのデスクにはPerlのパッケージが必ずあった
> っていう話があって、
ね~よ
>>730 それらしいパッケージを作るところからはじめないと。
734 :
デフォルトの名無しさん:2008/04/27(日) 05:58:26
> 専門用語がおおくてわかりにくいっていっただけ
とか言っている不誠実な「向いていない人」がいますが、ラクダ本は専門用語は
決して多くないし、わかりにくくもありません。知的刺激に満ちた面白い本です。
初心者の人は、「向いていない人」の自己正当化のゴマカシに騙されて
敬遠しちゃったりしないで、ぜひ読んでみてくださいね。
735 :
デフォルトの名無しさん:2008/04/27(日) 06:56:18
>>734みたいな嘘書いて勧めちゃう子ってどこの国にもいるんだよね。
>>734 そういうこと書くと、頭悪すぎてラクダ本に挫折した連中が荒しに来る。
737 :
デフォルトの名無しさん:2008/04/27(日) 09:57:27
>>431 #!/usr/bin/perl
$camels='123';
print $camels+1,"\n";
これ1行目なんでシングルクォートなん?
2行目に続くから?要するに2行目が結果だから?
738 :
デフォルトの名無しさん:2008/04/27(日) 09:59:38
printのあとにダブルクォートがないのはcamelsが数値として
認識されているからだよね?
>>737 また入門書の例か?
文字列として定義した変数が、+演算子で使われると数値に置き換えられる、
って例じゃないの?
740 :
デフォルトの名無しさん:2008/04/27(日) 10:54:27
>>739なんで文字列として定義ってわかったん?おまえ天才じゃね?
これ別に$camels=123;でいいんでないの?なぜシングルで囲む?
日本語でお願い
742 :
デフォルトの名無しさん:2008/04/27(日) 11:05:50
>>740すいません、$camelsはデフォが文字列?
だから$camels=123;ここまでの構文ならこの表示でいいのだけど
2行目のprint $camels+1,"\n"; の最後の構文かんでるから
$camels='123';ってこと?シングルは変数展開なしですもんね?
743 :
739:2008/04/27(日) 11:13:19
>>740 > これ別に$camels=123;でいいんでないの?なぜシングルで囲む?
普通はそれでいいよ。
しかし、この質問のネタが何かの入門書じゃないの?と俺のエスパー能力が反応したんだよ。
入門書だから、そういう非現実だけどわかりやすい例を書いてあるんじゃないの?と。
744 :
デフォルトの名無しさん:2008/04/27(日) 11:17:28
そのケースは良いんだが、
$foo = 0123 ; と
$foo = '0123' ; とじゃ
print $foo +1;
した時に答えが変わる事くらいは覚えとこう。
その例を出す前に
print 0123;
ぐらい見ておいてもらわないと、いろいろ混乱するんじゃないかな。
まだ10進数しか出て来てないだろうし。
747 :
デフォルトの名無しさん:2008/04/28(月) 02:36:11
アート引越しセンター
って表示された。
楽をしようとすると新たなコストが発生するものだというお告げだな。
749 :
デフォルトの名無しさん:2008/04/29(火) 12:38:04
perl自動で変数設定してくれるのあって
使えるようになったんだが、これテキストエディタに書き込んで
perlのなかのbinにテキスト保存してdosで呼んで機能させるんだよね?
750 :
デフォルトの名無しさん:2008/04/29(火) 12:50:31
できたソーリー
751 :
デフォルトの名無しさん:2008/04/30(水) 00:23:05
@unko = split /<table[^>]*>/,$html;
ってやると、<tableタグが消えちゃいます。
消えない方法はありますか?
あとから join で元にもどせないと困るんです。
@unko = split /(?=<table[^>]*>)/,$html;
753 :
デフォルトの名無しさん:2008/04/30(水) 21:42:16
>>752 ありがとう。30分かかって、やっと理屈がわかりました。
windowsが問題なく処理しているsjisの扱いをperlも見習って欲しい。
基本的には問題ないと思うけど、どの辺に問題があると思ってるの?
#ファイル周りがダメなのは知ってるけど、他にもある?
PerlはUNIX産まれだからな
あんなダメOSを見習う必要は無い
EUC、及び今後はUTF8だけ使えれば充分
757 :
デフォルトの名無しさん:2008/05/13(火) 12:52:48
UNICODE対応してないOSは、いずれ廃れるな。
UTF8で誤魔化そうとしても、ほんのちょっとの時間稼ぎにしかならない。
>>757 UNICODE対応してるOSって、どんな状態のOSの事だ?
UTF-32ベースで動いてるOSの事か?
ってか藻前UTF-8、UTF-16、UTF-32の違い分かってないだろ?
759 :
デフォルトの名無しさん:2008/05/13(火) 19:40:54
>>758 あなた、もしかして
20世紀からタイムトラベルしてきたんですか?
Perl6::Say がなんか変です
package Klass;
sub new { bless {} }
sub foo { 1 }
package main;
# use feature qw/say/; # これだと大丈夫
use Perl6::Say; # こうしたときに
print Klass->new->foo, "¥n"; # うごく
say STDOUT Klass->new->foo; # うごく
$k = Klass->new;
say $k->foo; # うごく
# なんかこれだけ
# Can't locate object method "say" via package "Klass" at ...
# で死ぬ
say Klass->new->foo;
別にもう Perl6::Say なんて使わなくてもいいのは知ってるけどなんか気持ち悪いです
Perl6/Say.pm ものぞいてみましたがよくわかりません
なにこれー?
>>760 ・Klass->new->foo;
・new Klass->foo;
これが等価なように、
・say Klass->new->foo;
・(Klass->say)->new->foo;
これも等価。
>>761 ㌧
>・say Klass->new->foo;
>・(Klass->say)->new->foo;
>これも等価。
うはwwwww
Perl こえーwww
キーワードで検索しにくいので教えてください
以下の2つはどういった意味なのでしょうか
[@array]
@{$array[1]}
@array展開して無名配列リファレンスを作ってる?
$array[1]におそらく配列リファレンスがはいっていてデリファレンスしてる。
ありがとうございます!
「無名リファレンス」←このキーワード検索で理解できました
コンパクトかつ適切なアドバイスありがとう。
こういう文法、PERLってマルチパラダイムだよなーって感じます。
769 :
デフォルトの名無しさん:2008/06/15(日) 01:19:00
$ perldoc perlcheat
すると DON'T ってとこに
> DON’T
> "$foo"
> $$variable_name
> ‘$userinput‘
> /$userinput/
ってあるんですが、最後を除いて意味がよくわかりません(3番目はシェルコマンドで実行するなってこと?)
特に1番目と2番目は何で代替しろってことなんでしょう?
"$foo" # 変数展開されるから気をつけろ
$$variable_name # シンボリックリファレンス氏ね
`$userinput` # 汚い文字列をシェルに渡すな
/$userinput/ # 汚い文字列を正規表現に突っ込むな
>>771 use warning;
use strict;
773 :
Perl中級者になりたい:2008/07/23(水) 15:49:05
ロゴがかっこいいとおもいます(汁
x print "Content-type: text/html\n";
o print $cgi->header();
x my %http_code = ...;
o use
HTTP::Status qw/status_message/;
x 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'
o 'LinkHACKS (+
http://w7.oroti.com/~webhacks/)'
x $browser->get(...);
o $browser->head(...);
>>778 $resp->status_lineで取れるから
>my %http_code = ...;
これはいらないな
780 :
Perl中級者になりたい:2008/07/23(水) 18:22:40
>>775 ahoの嵐・・・orz
受け取ったデータのチェックが必要ですね。。頑張って修正します。
>>776 webprog板逝ってきます。
>>777-779 / \
/ ─ ─\
/ (●) (●) \
| (__人__) | )) なるほど
/ ∩ノ ⊃ /
( \ / _ノ | |
.\ “ /__| |
|\ /___ /|
| ノ
ヽ y /
\ / /
/ /
(___)_)
オトナの事情
>>781 現行だと$coderef->() だろ?
. の方がバイト数がかせげる & '->' と言う定義をせずに済む。
何しろ > は => だの <=> だの他にも大活躍だから、、、
>>781 名前空間とパーザの都合。……Rubyの場合は。
Perlは何故なんだろうねぇ。変数を示すプリフィクスが付いてるんだから問題なさそうな気がするんだが。括弧省略との相性が悪いのかな?
$foo.()と$foo()は同じ意味のはず。
例えば、&はP5と違って関数をオブジェクト化したものを返すけど、
これを呼ぶときも、&bar.()と&bar()の両方で書ける。
787 :
781:2008/08/12(火) 09:24:25
>>787 他にも++なんかの接尾演算子でも、$foo.++; と $foo++; の両方で書ける。
これは演算子がオブジェクトのメンバだっていうイメージなんだろうね。
789 :
デフォルトの名無しさん:2008/08/12(火) 20:44:56
Perl勉強中で
変数Aにオブジェクトが入ってて
オブジェクトに$Cの値を入れようとしてるんですが
下記の1,2の違いについて調べても分からなくて
教えてくださるかたいませんか?_?ヒントだけでもいいので;w;
1: $A->B($C);
2: $A->{B} = $C;
>>789 「オブジェクトに$Cの値を入れ」るが意味不明。
もう少しちゃんとした言葉を使って説明してくれ。
1は PackageOfA::B($A, $C) とおなじ、
2は ${$A}{"B"} = $C とおなじ。
1のBはメソッドでCは引数
2のBはハッシュのキーでCは値
792 :
デフォルトの名無しさん:2008/08/30(土) 01:16:38
あいかわらず、日本語マッチングは面倒ですか?
Emeditorの正規表現の方がよくね?
日本語マッチングって何?
794 :
デフォルトの名無しさん:2008/08/30(土) 01:30:05
まだつかえないんだ・・・
だから日本語マッチングって何だよ。
796 :
デフォルトの名無しさん:2008/08/30(土) 01:39:45
まだつかえないんだ・・・
^^;;;;;;
まぁどの言語でもそうだが、バカには使えないわな。
20世紀からタイムスリップしてきたひとか
800 :
デフォルトの名無しさん:2008/08/30(土) 08:28:11
>>799 もしかして、20世紀から生きてる人ですか?
この板も、とうとう小学生が跋扈するようになったか。
最初のプログラミング言語がPerlって、
スパゲッティー作りになることを義務づけられるぞ。
最近の小学生は制御構造なんて使いこなせないから
CASE文満載でなければおk
最初に入った言語がCOBOLだった俺からいわせれば、perlなんて可愛いもの。
>800 は8歳だったのか。
算数の勉強頑張れよ。
>>1の日付見て吹いた
2008/08/13の勢いは異常だな
808 :
デフォルトの名無しさん:2008/10/26(日) 12:34:29
あげ
809 :
デフォルトの名無しさん:2008/11/11(火) 02:41:57
810 :
デフォルトの名無しさん:2008/11/12(水) 02:48:46
>809
sjisがベタで使われてるとか、htmlのタグの記述に統一性が無いとかで
極力係わり合いになりたくないコードだなぁ
タイトル増やすのも面倒だ
こいつを書き直せって課題なら、嬉々としてやるところだw
webprog池よ
>>809 ガッコの課題で、そんな例題を出すのかぁ・・・・
そりゃ問題だ!
perlでメールの添付ファイルの処理をしようとして、
ttp://homepage3.nifty.com/hippo2000/perltips/rcvmail.htm を参考にプログラムを書こうと思っているのですが、
上記ページのWordDecoderを使ったサンプルプログラムを実行すると、
保存されたファイル名がURLエンコードされている状態になってしまいその原因が分かりません。
実はURLエンコードされている方が扱いやすくてうれしいのですが、
原因が分からないのが気持ち悪くて…。
どなたか教えていただけないでしょうか。
動作環境はFreeBSD6.0で、Jcode, MIME-Toolsはportsでインストールしました。
よろしくお願いいたします。
815 :
814:2008/12/19(金) 05:30:45
すみません、別のスレ(Perlについての質問箱)で聞いてこようと思います。
失礼しました。
perlで書かれたプログラムをダウンロードしたのですが、
使い方として、
・本体(exxeed.pl)は編集の必要がありません。
・cpiファイルにスクリプトを追記して、動作を指定します。
・起動方法
コンソールから
> perl exxeed.pl hogehoge.cpi
とだけ書かれているのですが、これって、
サーバー内のCronなどからコマンドで実行するって事ですか?
シェルから実行すればいいだけだろ
>コンソールから
>コンソールから
>コンソールから
>コンソールから
>コンソールから
>コンソールから
>コンソールから
>コンソールから
>コンソールから
>コンソールから
>コンソールから
コンソールから
シェルから
この意味がぐぐってもイマイチ理解できてないです。
要するに、サーバーにアップして使用するのではなく、
コマンドプロンプトとかから実行するものなのですか?
>>819 そのperlスクリプトが提供する機能がわからんのに答えられるわけがなかろう。
定期的に動かすものならcronに登録するし、
CGIならWebサーバのCGIディレクトリに設置するし、
コマンドラインで実行することになってるプログラムならコマンドプロンプトやターミナルエミュレータから実行するし、
GUIアプリならエクスプローラやファイラーからダブルクリックする。
>>819 サーバで動かしたいなら、サーバにアップロードしてから
リモートシェルの類で実行すればいい。
なんにしてもperlの使い方の質問じゃないから、
適当なスレを探してくれ。
・起動方法
コンソールから
> perl exxeed.pl hogehoge.cpi
これ読んでわからんのなら、パソコンの使い方を勉強しろ。
そうとしか言いようが無い。
駅前のアビバに通った方がいいぞ。
823 :
816:2009/01/13(火) 04:20:00
皆さん有難うございました。
まだよくわからないので、他スレで聞いて見ます。
824 :
A:2009/01/13(火) 16:19:41
それは、コマンドプロンプトから起動(実行)するもの。
UNIX/Linuxの場合、シェルから起動(実行)する、とも言う。
>>816 何がしたいのか書いてない。
<form method="POST" action="exxeed.pl"> ただこれは無理だと思う。
コンソールっつーとサーバセンターまで行ってキーボードぶっ挿して、ってイメージ
↑
Windows しか触ったこと無いひと。
828 :
デフォルトの名無しさん:2009/01/16(金) 23:18:15
ウェブプログラミングで引っかかってる問題だが、本質はEncode.pmなんで、こっちで聞こうと思いまつ。
utf-8の"~"を Encode::from_to で EUC-JPに変換すると、?に文字化けするようです。
-------------------------------------サンプル
#!/usr/bin/perl -w
use strict;
use Encode;
my $str ="~";
Encode::from_to($str, "utf-8", "euc-jp");
print "Content-type: text/html\n\n<html><head><meta http-equiv='Content-Type' content='text/html; charset=EUC-JP'></head><body>$str</body></html>";
-------------------------------------サンプル
これってEncode.pmのバグですか?対応方法は何かありますか?
>>828 関係無いけどウェブプログラミングなら
>#!/usr/bin/perl -w
>use strict;
>use Encode;
ここは
#!/usr/bin/perl -T
use strict;
use warnings;
use Encode;
のほうが良い。
832 :
デフォルトの名無しさん:2009/01/28(水) 12:51:50
829さんのスレッドが落ちていたのでこちらで質問失礼します。
Perlで、ハッシュデータにKEYとKEYに対応した値が多数格納されているとします。
そのKEYに対応した値から、KEY自体を取り出したいのですがそれは可能でしょうか。
可能でしたら簡単なプログラム例を教えて頂けると大変助かります。
while ( ($key, $value) = each(%hash) ) {
if ($value eq "うんこ") {
print $key;
}
}
>>832 reverse使えばできる。
my %new_hash = reverse %old_hash;
これで、元のハッシュの値をキーとして、
元のハッシュのキーを値とするハッシュができる。
ただし、元のハッシュで値が同じものが2つ以上あるときには、
うまくいかないです。
835 :
デフォルトの名無しさん:2009/01/28(水) 13:27:30
836 :
デフォルトの名無しさん:2009/01/31(土) 09:16:57
正規表現なのですが
<h2 class="title">を正規表現で表すと、(英数字の[0-9|a-zA-Z]は省略)
<h2.\s.class=\"title\">でよいのでしょうか
聞く前に自分で試した方がなんぼか速いんでないかい
>>837 試したのですが、出来なかったので間違っていると思うのですが
どこが間違っているのかわかりません
>>838 htmlのタグで一番簡単なマッチはこの2通り
/<.*>/
/<[^>]*>/
てか正規表現のスレで聞けばはやいのでは?
>>836 "."は文字一つ食べてごちそうさま。
"\s"はスペース一つ食べてごちそうさま。
もうひとつ"."も文字一つ食べてごちそうさま。
何文字用意してあげれば、おなかいっぱいになるの?
うん、三文字。
スペース一文字じゃ、おなかいっぱいにならないね。
食べるの控えたら、だいじょうぶ?
食べるの控えたら、だいじょうぶ?
842 :
デフォルトの名無しさん:2009/02/01(日) 02:47:31
Perlのコードのことで判らないことがあるため質問させていただきます。
現在読んでいるコードに、
return 0 if ($hoge < 1);
のような行があるのですが、これはどのような処理になるのでしょうか?
関数の途中にあり以下にも処理の記述があるため、私の想像では
return 0
の後ろに続く、ifが真のときにreturnが実行されるかと思うのですが、
なぜこのような書き方をするのでしょうか?
私が考えるのでは、
if ( $hoge < 1) {return 0;}
とすればいいかと思うのですが、何か理由があるのでしょうか?
質問をいくつもすみませんが、教えていただけるとありがたいです。
>>842 英語の表現で、
hogehoge if fugafuga
ってのがあるだろ? それをプログラミング言語の文法に組み込んだのが前者。
意味は後者と同じ。
>>843 ありがとうございます。
やはり、ただの書き方の違いだけでしたか。
>>844 >return 0 if ($hoge < 1);
>if ( $hoge < 1) {return 0;}
書き方の違いもあるけど直感でわかるかどうかも重要だから
そういう箇所は書き直していったら後から読む人は助かる箇所も出てくると思う。
それで動作しなくなったら問題なので十分に注意、検証は必要だけどね。
「orが嫌い」と言う理由で「||」に全置換かましたバカを思い出した。
処理が単文なのにいちいちブロック書くのが面倒というのもある。
さらに
return 0 if $hoge < 1;
とも書ける。前に書く場合は括弧が必須。
文修飾子(statement modifiers)(後ろに付ける if, unless, while, until, foreach)を使うなら
括弧を書かない場合が多いんじゃないかな。
>848
単語一致以前に or と || では優先順位が異なる。
>>850 ああ、そういう意味ですか。
operatorの「or」も置換して、operat||にしてしまうのかと思った。
普通に考えて優先順位の話ってわかるじゃん(´・ω・`)
質問なんですけど、@INCに入るパスって環境変数のPERL5LIB以外にどこからとってきてますか?
zshrcには書いてあるパスの集合がAだとすると、
local/lib/perl5/5.8.8
local/lib/perl5/i386-freebsd-64int
A
local/lib/perl5/5.8.8/BSDPA
local/lib/perl5/site_perl/5.8.8/mach
...
というような並びで並んでます。
Aの前と後にどこからパスを持ってきているのかわからず。perlのコンパイルの時にそんな指定するんでしたっけ?
PERLLIBも指定してなし、よくわからない
>>851 そんなこと言い出したら "or" が部分文字列として含まれる単語なんて
いくらでもあるじゃないか
このスレ見える範囲で検索しただけでも word, form, ports, livedoor とか出てきた
>>854 なるほど。ありがとうございます。
コンパイルした後に変えることは無理?
5.8.8をもう一回コンパイルし直すならいっそのこと5.10をコンパイルしようかなと思うのですけど。
use libできんのか?
>>857 use libとか@INCに入れれば解決なのだけど、
そもそもそのリストをどこからどういう順番で取ってきているかを知りたかったのです。
おれの@INC、パスがダブっちゃったりしてるから。
>>858 ソースのperl.cを参照。
ソースをそのままコンパイルして使うならまあいいんだけど、
一部のLinuxディストリによっては、これにpatchが当たってて、
読み込むパスや順番が異なってる。
>>856 > コンパイルした後に変えることは無理?
スクリプト単位なら use lib や BEGIN { @INC = ... } 。
ユーザ単位なら環境変数 PERL5LIB / PERLLIB。
システムワイドに設定したければ、sitecustomize.pl が
利用可能ならその中で好きに編集すればいい。
プログラム読んでてよくわからん構文出てきたから
最小のコードにしてみたらこうなった
sub a{return [(1)x5];}
@b = @{a()};
for(@b){print;print " ";}print "\n";
2行目の@{ }で囲っているところは何をやっているのか
誰か教えて
デリファレンス
把握した
@{[ $ref ]}
kore nani?
dereference
>>864 リファレンス作ってデリファレンスしてる。
無名配列を作りたい時に便利。
例えば文字 "," のカウントをしたい場合。
====
my $str = q{a,c,b,d,e} ;
#my $cnt = $str =~ /,/g ; #<= ダメ
#my $cnt = my @tmp = $str =~ /,/g ; #<= tmp 作るの?
my $cnt = @{[ $str =~ /,/g ]} ;
print $cnt . qq{\n} ;
====
最もこのケースだったら以下の方法のが遥にスマート
my $cnt = () = $str =~ /,/g ;
my $cnt = $str =~ tr/,// ;
ちなみに↓コレだと @{[]} する意味があんまり…
@{[ $ref ]} ;
これはいいもん読めた
ここまだ残ってるんだな・・・
(糞レスすまん
870 :
デフォルトの名無しさん:2009/03/25(水) 23:33:08
○○.cgiのプログラムで、
「exec △△.pl $param1」とexecを使用して呼び出しても、
呼び出し先の△△.plが実行されないです。
環境が原因と思うのですが、
初心者で何が原因かわからないです。
webprogいけ
初心者がCGIとかヤメレ
マルチ氏ね
874 :
デフォルトの名無しさん:2009/03/26(木) 06:22:15
【Yahoo!番付で亀井をMVPにしようぜwwwww】
ttp://takeshima.2ch.net/test/read.cgi/news4vip/1237983005/50 ベンチの支えあっての原JAPAN 亀井こそが真のMVP
↓
イチロー福留青木稲葉がいる外野においては常にベンチが決まっているような状態で、
でももう一人予備の外野を選ばなくてはいけなくなった。
そのような役は自軍から出さねばならないと考えた原監督は亀井に白羽の矢を立てた。
誰もが落選すると思われていた亀井だったが、最終メンバーに選ばれた。
亀井も一度は監督に辞退を伝えたが、原監督は亀井に説得を行う。
亀井は尊敬する監督にそこまで言われたら、ということで辞退を撤回。
叩かれる事が分かっていながらもベンチから声援を送り続ける。
そんな亀井はMVPに相応しい
マルチ氏ね
おまいらお願いです。
フルパス文字列から親ディレクトリ名を取り出す方法を検討中なのですが、
例) /hoge/fuga/var/foo を入れると /hoge/fuga/var が出てくる
$PATH = '/hoge/fuga/var/foo';
$PATH =~ m|.*/|;
$PATH = $&;
$PATH =~ m|\/$|;
$PATH = $`;
こんな風にして一応動いたんですが、カコワルくて人に見せれないコードです。
もっとすっきりキレイに仕上げる方法がある気がしてなりません。
もっとキレイな方法を教えてもらえませんか?
my $target = '/var/www/html/index.html';
my($per_dir) = $target =~ m|(.+)/[^/]+/?|;
print $per_dir,"\n";
”親directory”とゆうことなので。
それじゃイヤンってんなら、ググるなりして調べてくれ。
>876
File::Basename の dirname 使えば?
$path =~ s/[^\/]*$//;
>>879 >>880 ㌧。やりたかった事は、レン鯖のDOCUMENT_ROOTの1個上にDBやらパスワードの設定ファイル(xml)を置いて、それを読み込んで処理する作業だったのです。
use XML::Simple;
- 略 -
my $DOCUMENT_ROOT = $ENV{'DOCUMENT_ROOT'}; # httpサーバが表示する / ディレクトリ
my ($SETTING_PATH) = $DOCUMENT_ROOT =~ m|(.+)/[^/]+/?|; # 親ディレクトリ
my $DB_Info_XML = XMLin($SETTING_PATH. '/dbpassword.xml');
my $DB_NAME = $DB_Info_XML->{dbinfo}->{dbname};
- 略 -
という感じで実装しました。あとで
>>880のやり方に書き換えます。^^
882 :
デフォルトの名無しさん:2009/04/01(水) 20:54:35
教えてください。
CatalystでDBIx::Class使って pagerやろうとしたのです
my $rs = $c->model(..)->search({}, {page =>1, rows=>10});
$c->stash->{data} = $rs;
.tt にて
[% SET pager = data.pager %]
[% INCLUDE pager.tt %]
で、data.pagerを参照するところで
Can't create pager for non-paged
と言われて困ってます。
どなたか助けて頂けませんか?
883 :
882:2009/04/01(水) 21:36:58
申し訳ありません。自己解決しました。
pageに渡している値が空のケースがあるとあのエラーがでるようです。
失礼しました。
そうねぇ、、、perl って小回り効くから確かに便利だけど、
sed+awkとして使うまでに留めておくべきだな。
技術者の力量に依るような自由な言語は、プロジェクトとしてはなるべく使いたくない。
いまどき CGI は無いだろ
>884
PerlはLL界のCOBOLになったな。
>>884 こういうの見ると「終わった感」が増して逆効果だと思うんだが・・
団結して良さを説明ようとか、方法論からして前世紀かよって思う。
「モダンPerl入門」って糞?
WEBアプリ以外はソフトウエアに非ず
そんな風潮。
perl はWEBアプリ専用言語じゃないのに
PHPやらASPやらJSPやら出てきたら
perl はお払い箱?・・・それじゃ、かわいそうだよ。
誰か助けて下しア
環境がPERL5.8.* Jcode 2.6.5
PERL5.6.1 Jcode2.0から移したら
今までCGIで文字化けしなかったものが化けました。
$str = '㈱ホゲマン;
$hoge = Jcode->new($str, euc)->h2z->euc;
print "$hoge";
今までは ㈱ホゲマン
と表示されていたのに、 ?ホゲマン
となります。
原因を調べていたら、5.8移行は機種依存文字は無視しないで?に変換してしまうとのことで。。。
これを ㈱ホゲマン となるように
解決したいのですが、どなたかご教授ください。
すません、ちなみに~入れろ、とかは出来ない状況です。
UTF8でやれとかも無理な状態です
すません
他で聴くためこちらの回答は不要です
失礼しました
お前誰だよ
>>884-888 蛇足情報として書いておくと、米国は perl / python 使いが多い。
>>890 PerlはCみたいに残るでしょ・・・
awkは使ったこと無いw
Windows の時代になっても
バッチファイルは残った。
だから Unix が GUI になっても
Perl は残る。
その文脈だと、残るのは sh であって perl ではないような、、、
まあ、perl がなくなるようなことはないだろうけど。
ちょw
cshみたくpshとか出来るんじゃね?
901 :
デフォルトの名無しさん:2009/04/17(金) 00:26:46
pyshonでいいよ。
903 :
デフォルトの名無しさん:2009/04/18(土) 15:51:41
これからはパールの時代がくるのかもな
ルビーです
ルアだろ、常考
>>898 最近はMakefileでもPerlがインストールされているのを前提に
Perlスクリプトが走ったりするのがある。既にshの代替として
機能している部分があるのでなくなりはしないと思う。
逆にpythonやrubyでそんんあのみたことない。
>>885 安い人間しか雇わないなら学習コストを考えるとPerlはないな。そういう人はPHPでも使えばいい。
>>889 MooseとかモダンCatalystとかよくわからんのなら買うべき。ただし天然なのか内容が結構ピンボケしてるので、
ある程度理解したら他のソースで情報を補完する必要がある。他に代替となる本がないから「モダンPerl入門」一択なのが現状。
>>891 解決したなら解決方法書け。EUC-JPにはそんな文字ないから文字化けして当たり前。
jcode.pl使ったら解決しましたとかそういうオチじゃないだろうなw
>>895 昨日YAPCで会った米国人が、日本の本屋にPerlの本が異常に少ないのに驚いていたな。
ちなみになる早で1回作って終わりなプロジェクトならPHPでもいいが、保守を続けていくようなプロジェクトはPerl
でかっちり書くのがいい。mixiは置いといて、はてなをPHPで書いてたら今のはてなはなかった。
>>903 Perlのことならもう来てるから。ここんとこPerlの案件激増。PHPの仕事も多いがは糞なのが多く蹴ってる。
908 :
デフォルトの名無しさん:2009/09/15(火) 20:49:32
#!C:\Perl\bin\perl
use encoding "cp932";
binmode STDERR, ':encoding(cp932)';
$key = <STDIN>;
chomp $key;
if ($key ne 'quit') {
&print_randomnum;
} else {
print "owari\n";
exit;
}
sub print_randomnum{
$num = int(rand 1000000);
print "$num\n";
}
__END__
こんな簡単なプログラムなのに期待通りに動作しません。
quitと入力しても乱数が表示されてしまいます。どこがおかしいのか教えてください。
使用しているのはActivePerl 5.8.8 on XP Pro SP2です。
automakeがPerl依存か。
一応Pythonにはsconsがあるが、google以外では見ないな。
>>908 use encoding "cp932";
binmode STDERR, ":encoding(cp932)";
の二行消したらなったぞ
912 :
908:2009/09/17(木) 18:08:55
みなさまご親切にありがとうございます。911さまのご指摘をわたくしも確認しました
use encoding "cp932";
binmode STDERR, ":encoding(cp932)"; はウェブ上の入門講座を見て付加しました。
どうしてこの二行がこんなにおそろしい悪夢を招くのかよかったら教えてください。
講座ではシフトJISでコードを書くときに必要と説明していました。
>>912 use encoding(cp932);
とした場合、STDINからの入力値を律儀にCRLF(\r\n)にしてくれる。
でもデフォルトの場合、特殊変数$/(デフォルトの改行文字)はLF(\n)なので、
chompした際に、LF(\n)しか消してくれない。
例 入力:AAA(エンターキー)
use encoding(cp932)あり → 'AAA\r\n'
use encoding(cp932)なし → 'AAA\n'
となる。
ちなみに、(binmodeなしで)入出力時に\n←→\r\nになるのは、ActivePerl(Winのみ?)
のIOのデフォルト動作。
慣れたひとなら
\r が来ても \r\n が来ても、どっちでも正しく動作するよう
コーディングするもんだよ。
915 :
デフォルトの名無しさん:2009/09/18(金) 00:20:49
916 :
908:2009/09/18(金) 10:04:45
913さま、ありがとうございました。頭がすっきりしました。
>906
LinuxのGUIアプリならPython依存をそこそこ見るが、コマンドラインだと見ないな
>>620 pl の関連付けを perl.exe から wperl.exe へ変更
wperl.exe は perl.exe と同じ場所にあります
それか、コマンドプロンプトの初期設定がコンパネから出来たような気がする
Perl質問すれなくなった
920 :
デフォルトの名無しさん:2009/11/03(火) 12:52:07
そのくらい自分でたてろよ
勉強中の者ですが
例えば2で割り切れない番目の数値を倍にするって事を
やってみたのですが、$countをmap式の中に入れられる物なのでしょうか?
気持ち悪いので入れたいのですがどうすればいいんでしょう?
my @input_digbit = (1,2,4,8,16,32,64);
my $count;
my @result = map {
my $input = $_;
$count += 1;
if ($count % 2) {
$input = $input * 2;
} else {
$input;
}
} @input_digbit;
気持ち悪がらずに慣れてください
>>921 mapで書けることは大抵foreachでいけるよ
use feature 'state' ;
my @h = map { state $c = 0 ; $_ + $c++ } 0 .. 3 ;
>>921 mapを2回することになるけど、どうかな?
my @result =
map $_->[0] % 2 ? $_->[1]*2 : $_->[1],
map [ $_ + 1, $input_digbit[$_] ], 0..$#input_digbit;
>>921 reduceを使うとか?
ちょっとトリッキー?
use List::Util qw(reduce);
my @result = @{( reduce {
[ @$a, $input_digbit[$b] * ( $b % 2 ? 1 : 2 ) ]
} ([], 0..$#input_digbit) )};
よく考えたらこれでいいじゃん
はは
my @result = map $input_digbit[$_] * ($_ % 2 ? 1 : 2), 0..$#input_digbit;
なるほどいろいろ書き方あるんですね。
>>927 一粒($_)で二度美味しい。目からウロコでした。
やっぱfeature系が入ってくるときれいだよね
//とかstateとか欲しい機能満載
930 :
デフォルトの名無しさん:2009/11/13(金) 12:13:39
///
given($hoge){
say "hoge" when 1;
say "huga" when 2;
}
みたいなことがしたかったけどwhenは後置できないんだな
でもお前ら、偉そうなこと言ってfeatureで一番心待ちにしてるのはsayだろ?な?
すでにuse feature qw/say/;とかsub say {print shift . "\n"} とかしてるやつ手を挙げろ。
use 5.010; 派
export PERL5OPT=-M5.010
派
exe 'inoreabbrev <buffer> say '. 'print, "\n";'. "<C-O>F,"
派
935 :
デフォルトの名無しさん:2010/03/07(日) 23:52:03
( ´・ω・`)
936 :
デフォルトの名無しさん:2010/03/08(月) 00:18:35
(´・ω・`)
937 :
デフォルトの名無しさん:2010/03/08(月) 23:59:23
アクセスした人のポート番号80が空いてるかどうかを調べるにはどうすればいいでしょうか?
REMOTE_PORT関数で調べれると思ったのですがうまくいかなくて・・・
>>937 telnetででも80番叩いてみればいいじゃん。
(´・ω・`)
>>937 最近、phpしか触ってないのでperlの方を忘れたけど、phpならこんな感じ。
function is_online($server_ip)
{
$ip = gethostbyname("{$server_ip}");
if ($fp = @fsockopen($ip, 80,$un,$sinn,2)) {
fclose($fp);
return true;
} else {
return false;
}
}
要するに、ソケットをオープンして成功すれば、そのポートが開いてるってこと。
「perl ソケットオープン」
で検索汁
アクセスした人のIPアドレスが12.34.56.78 だった場合
お手元のブラウザで
ttp://12.34.56.78/ (頭にtをつけてね)
ってやってサーバーが見つかりませんってエラーがでたら80番空いてない。
何かしら出てきたら空いてる。
これでどうよ。
>>940 あぁ、ごめん、perlスレだったw
use LWP::Socket;
my($server, $port) = ('localhost', '80');
my $socket = LWP::Socket->new;
$socket->connect($server, $port);
ただ確かめるだけならこんなんでいいんじゃない?
一週間もまえの書き込みに今更・・・
open FILE, "<:encoding(cp932)", $hage;
read FILE, my $text, -s FILE;
close FILE;
みたいなスクリプトで cp932 *以外*のファイルを読んでしまうと
cp932 "\xEF" does not map to Unicode at C:\workspace\hoge\fuga.pl line **.
ってワーニングが出ますが、perlスクリプトはそのまま続行してしまいます。
ほんとうは停止してほしいんですけど、
read FILE, my $text, -s FILE or die; としても止まってくれません。
eval { ..... } die if $@; でも止まってくれません。
何か方法があれば教えてください。
>>945 local $SIG{__WARN__} = sub{ die @_ } ;
スクリプトの最初の方にでも突っ込んどけば?
use PerlIO::encoding;
use Encode qw[ :fallbacks ]; # 定数の import
$PerlIO::encoding::fallback = Encode::DIE_ON_ERR;
open ...
という風に $PerlIO::encoding::fallback に定数を入れてやると
PerlIO で Encode がまずったときの動作を指定することが出来たはず.
定数については Encode の check に書いてあったと思う.
>>946 encoding使わないでdecode_utf8すれば良いんじゃない?
出力でencodeし直せばおけー
perlccがうまく動きません><
だれかこの部分だけでいいから、Cにしてくれ~。
/^(.*) (.*) (.*) \[(.*)\] "(.*)" (.*) (.*) "(.*)" "(.*)"/;
951 :
950:2010/04/15(木) 11:15:49
すまん、やっぱいい
952 :
デフォルトの名無しさん:2010/05/24(月) 01:43:38
953 :
デフォルトの名無しさん:2010/05/24(月) 02:30:38
955 :
デフォルトの名無しさん:2010/06/11(金) 13:46:42
/ ̄ ̄\
/ ヽ、. _ノ \
| (●)(●) |
| (__人__) | ヨナも そうおもう
| ` ⌒´ |
| }
ヽ }
人_____ノ"⌒ヽ
/ \
/ へ \
( ヽγ⌒) | \ \
 ̄ ̄ ̄\__/
956 :
デフォルトの名無しさん:2010/07/21(水) 22:32:12
クライアントがサーバへファイル名を送り、サーバがそれを検索しそのファイルを送るサーバプログラムはどうかけばいいですか?
初歩的な質問で申し訳ないですが、よろしければご教授ください。
宿題は自分でやれ
>>956 > クライアントがサーバへファイル名を送り、
ieとかでwww.yahoo.co.jp/index.htmlと入れる。
> サーバがそれを検索しそのファイルを送る
apacheがindex.htmlの内容を返す。
つまり、apache のソースを提出すればよろし
959 :
デフォルトの名無しさん:2010/08/05(木) 06:17:40
hosyu age
960 :
デフォルトの名無しさん:2010/08/07(土) 12:37:44
use strict; をすり抜けて、use warnings; で引っかかる
事例って、どんなのがあるの?
あんいにしゃらいずどばりゅうとか?
>>960 暗黙の文字列→数値変換で、文字列が数値以外の文字が含まれてるとき。
> perl -Mstrict -Mwarnings -e 'print int("1a")'
Argument "1a" isn't numeric in int at -e line 1.
1
> perl -Mstrict -e 'print int("1a")'
1
>>962 なるほど・・・
じゃああえてそういう文字列食わせたいときとかは
一時無効にする必要があるわけか
初歩的な質問ですが…
use libでパスを複数指定するとエラーになったりしますか?
例えば、
hoge.pmが/home/***/perl5とかに入ってて
fuga.pmが/home/***/perl5/i386-freebsdに入ってる時
二つのパスをuse libすると500になります。
かといって片方しかパスを指定しない場合はCan't locateのエラーが出ます。
どうすれば両方のモジュールを使用することが出来るのでしょうか?宜しくお願いします。
>>964 それ多分違うところでエラーでてるかContent-Type吐いてないかパーミッションがおかしいかそんなとこだろ
どうにかしてエラー内容特定汁
#!/usr/bin/perl
use lib qw(/home/***/extlib/lib/perl5 /home/***/extlib/lib/perl5/i386-freebsd);
use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);
use AnyEvent::HTTP;
use Coro;
print "Content-type: text/html\n\n";
print "hoge";
↑500が出る
/home/***/extlib/lib/perl5/i386-freebsdを残して
/home/***/extlib/lib/perl5の部分だけ切り取り
↑Can't locate AnyEvent/HTTP.pm in @INC (...
/home/***/extlib/lib/perl5を残して
/home/***/extlib/lib/perl5/i386-freebsdの部分だけ切り取り
↑Can't locate loadable object for module Coro::State in @INC (...
/home/***/extlib/lib/perl5/i386-freebsd/auto/Coro/Stateを追加
use AnyEvent::HTTP;があると500になるので削除
/home/***/extlib/lib/perl5だとCoroで500が返るので /home/***/extlib/lib/perl5/i386-freebsdに
↑Can't locate loadable object for module Guard in @INC (...
/home/***/extlib/lib/perl5/i386-freebsd/auto/Guardを追加
↑Can't locate common/sense.pm in @INC (...
/home/***/extlib/lib/perl5/commonを追加
↑変わらずCan't locate common/sense.pm in @INC (...が出る
今この状態です。
もちろん
#!/usr/bin/perl
use strict;
use warnings;
print "Content-type: text/html\n\n";
print "hoge";
これはちゃんとhogeが出力されます。
どういった原因が考えられますでしょうか?
2レスに渡り長々とすみません。どうかよろしくお願いします。
968 :
デフォルトの名無しさん:2010/09/16(木) 01:31:37
969 :
デフォルトの名無しさん:2010/09/16(木) 02:31:40
>>966 extlib/ をつくった環境とちがう環境でうごかそうとしたりしてませんか?
/home/***/extlib/lib/perl5/i386-freebsd 以下のディレクトリは環境依存のものがはいっているので、環境がちがうところにコピーしてつかったりはできませんけども。
(ここでいう環境とは OS, アーキテクチャ, -Dusethreads の有無, perl5 のバージョンのことです)
970 :
デフォルトの名無しさん:2010/09/16(木) 02:41:08
>>969 レスありがとうございます!!!
でも俺のレベルだとちょっと理解しきれ無いので、教えてもらった内容に含まれてるキーワードで早速ググッてきます!
>>969 解決しました!
環境が違うってのがどういうことかわかりました!#!/usr/bin/perl環境じゃなくてモジュールをインストールしたperl環境じゃないとダメ…みたいなことですよね?
どうもありがとうございました!
PerlというかDBIで、fetchが最後まで行って終了した時に、
もう一度先頭行からループし直す時どうすればいいのでしょうか?
カーソルを先頭行に戻すやり方を教えて下さい。
973 :
perl入門者:2010/09/26(日) 10:59:18
すいません。
perlで、以下のような処理を実現したいのですが、
作成された方がいらっしゃいましたら、ご教授お願いします。
(1)「javaのプログラム内の全てのコメントを削除」して表示する
(2)「javaのプログラム内のコメントのみ」を表示する
よろしくお願いします。
正規表現使えばいいのでは?
Javaのコメントはネスト不可なのか
でも、もしJavaがコメント内の文字列リテラルとかも認識するなら
正規表現だけでは対応できないよ、多分
とりあえず正規表現を使わないなら
行コメントは簡単だろうけど、ブロックコメントは
コメントの中にいるかどうかっていう状態変数を作って
読みこみながら処理していけばいい
(コメントの中にいなくて/*にであったらコメントに入る)
(コメントの中にいて*/に出会ったとき、コメントの外に出る、みたいな感じで)
Javaがコメント内の文字列も認識するなら
コメントの中の文字列の中にいるっていう状態変数も作る
もっと複雑なことをする予定ならパーサを作るほうが楽
注意すべきは文字列リテラルの中にコメントと同等のシーケンスが入っていた場合。
System.out.println("/*うんこ野郎!*/"); /*どうだ参ったか!*/
Parse::RecDescent
で、文字列とコメントとそれ以外を定義
ふーん