【Perl】初心者コーナー Part17
■ このスレッドは過去ログ倉庫に格納されています
1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0604nobodyさん
02/11/06 14:33ID:???宛先が存在しないとfromに設定したアドレスに failure notice とかいう
メールが自動で来ますよね。
こういう風にアドレスが存在しない時cgi側で判断するにはどうしたらいいんですか?
0605nobodyさん
02/11/06 14:38ID:???行頭に持ってくるワザってないですかね。
0609nobodyさん
02/11/06 15:33ID:???0612莫迦
02/11/06 15:49ID:???してみました。&で繋がれて出てきました。
>>611
はい。同グループのチェックボックスの値はどうやって取り出すのかなーと思って・・・。
0613nobodyさん
02/11/06 15:58ID:???データは届いてるんだから考えれば出来ることだろ。
何でもかんでも人に頼ろうとするな!
0615莫迦
02/11/06 16:00ID:???ひとつ考えたのは、データの受け取り時にname(=$key)が前の$keyと同じだったらなんかやって取り出す、
みなさんどうしますか?
>>613
そんな怒らないでくださいよ。最良の方法はなにかなーと思ってるだけですよ。
0616nobodyさん
02/11/06 16:26ID:???($key,$value) = split(/=/,$pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/"/"/g;
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/\r\n|\r|\n//g;
$value =~ s/\,/,/g;
if($key eq "チェックボックスのname"){
push(@checkbox_name,$value);
}else{
$FORM{$key} = $value;
}
}
こうだったっけな、とにかくそれだけは取得する時にnameを見て別の配列に入れればよかったんだと思う。
0617nobodyさん
02/11/06 16:34ID:???同じグループ(複数回答可の選択式質問など)だとしてもnameをq1-1とか付ければ良いだろ。
Perlが録に出来ないのならHTMLで工夫しろよ。
0618nobodyさん
02/11/06 16:45ID:???やっと自分でもわかる質問が来たからここぞとばかりにしゃしゃりでましたって勢いだな
0619nobodyさん
02/11/06 16:59ID:???>>617は、Perl使ったこと無いのがばればれです。
0621nobodyさん
02/11/06 17:12ID:7IPFijFP0622621
02/11/06 17:14ID:7IPFijFP0623nobodyさん
02/11/06 17:15ID:???ローカル側では全データ読み込めるのにサーバー側では最後の行しか読み込めません。
何が原因なのでしょうか?
0626nobodyさん
02/11/06 17:26ID:???つけあがった態度しか取れない厨房はまず日本でのコミュニケーションの仕方を学んでおいで
>>621
CGIはperlに限らない
>>623
改行コードでしょうな
0628nobodyさん
02/11/06 17:33ID:???0629( ̄ー ̄)y-.。o○
02/11/06 17:36ID:???0630nobodyさん
02/11/06 17:38ID:???初心者のみなさんはこんな真似はしないようにね。
スクリプトをちょっとだけ省略できるかもしれないけど、
チェックボックスはnameが違うことが重要な意味を
持つので、これを同じにして後で困るのは非常に
おばかさんのすることですよ。
0631nobodyさん
02/11/06 17:38ID:???0634619
02/11/06 18:09ID:???http://www.w3.org/TR/html401/interact/forms.html#checkbox
を読んでください。
英語が読めないなら
1つのFORM内で多くのcheckboxが同じcontrol nameを共有してよいと書いてあります。
0635nobodyさん
02/11/06 18:09ID:???CGI::では名前がぶつかるとリストで格納していたと思ったが、今確認できる状況に無い。
0636619
02/11/06 18:17ID:???1つのnameに1つのvalueだったらradiobuttonがあります。
0637nobodyさん
02/11/06 18:27ID:???0638619
02/11/06 18:42ID:???本当に複数選択の場合に一個一個、別のnameつけてるんですか。
意味がないというか、よけい無駄な処理が増えるだけのような気がするんですけど。
同じnameにした方がすっきりするので私は好きです。
0639(´ー`)y━~~
02/11/06 18:54ID:???0640しつこくてスマソ
02/11/06 19:00ID:???> @turned_on = $query->param('group_name');
で、同じ name のチェックボックスの値を取れる
と書いてあります。
cgi-lib.pl だと、"\0" で区切られるんだっけ?
0641x
02/11/06 19:03ID:???と思うな。 値を2の巾乗にしてさ。
0642nobodyさん
02/11/06 19:15ID:???場合による。君みたいに一方的に決め付けるのは危険すぎる。
0643nobodyさん
02/11/06 19:17ID:???0644nobodyさん
02/11/06 19:24ID:???最初の質問者は受け取り方分からないんだからname別々にすりゃいいんでねぇの?
0646nobodyさん
02/11/06 20:25ID:???0648592
02/11/06 21:50ID:???埋もれてしまった
0649592
02/11/06 22:58ID:???うまくいきません。何処がいけないのでしょうか?
while (<>){
($name,$year)=split /:/;
chomp $year;
$years{$year}=[ $name ];
}
for $year (keys %years){
#push(@years,$year);
print "$year",@{$years{$year}},"\n";
}
0650592
02/11/06 23:02ID:???AA倶楽部:1995
BB軍:1995
CCを考える会:1995
DDの協力会:1998
EE観察の会:1999
FFに親しむ会:1999
GGを守る会:1999
HHを探る会:2000
IIネットワーク:2000
惜しいけど今ひとつ足りない
# ちなみにそれは配列のハッシュではなくハッシュの配列ね。
$years{$year} = [$name];
これは次のコードに相当するんだよ
@{$years{$year}} = ($name);
これじゃ配列に要素を追加しているとは言い難いでしょ。
0652623
02/11/06 23:34ID:???0653nobodyさん
02/11/07 01:11ID:???多重起動をさせないようにする常套手段って言ったらどうするんですかね?
個人的には自分自身($0)を読み取りで開いて排他ロック
open (LOCKMYSELF, "< $0");
flock(LOCKMYSELF, 6) or die;
とかやってたんですけど、SolarisだとOSの都合で読み取りオープン時は
排他ロックが掛けられない(共有ロックは可)らしいし、かといって
書き込みオープン("+< $0")とかは何となくコワイし…。
あと思いつく手といったら、別のどうでもいいファイルを用意して排他ロックを
試みるとか、system関数でpsとgrep使って調べるとかくらいしかないんですけど、
何かスマートな方法ってありませんか。
#そういう目的のモジュールでもあれば手っ取り早いんですけどね。
0654nobodyさん
02/11/07 01:28ID:???> とかやってたんですけど、SolarisだとOSの都合で読み取りオープン時は
> 排他ロックが掛けられない(共有ロックは可)らしいし、
やっぱりそうなんだ。漏れは知らなくて、flock() を
コメントアウトしたまま動作してるプログラムが一つ
あるよ(w
UNIX ドメインソケットを使ってプログラムの実行を
逐次化する話は、何かで見たような気がする。ブロッ
クしちゃうかな。
0655nobodyさん
02/11/07 01:30ID:???素人意見で申し訳ないんだけど、
漏れならダミーファイル作ってそいつがあったら強制終了、なかったら通常通り起動ってするな・・・。
素人だからそれくらいしか出来ないって突っ込みな無しで・・・。
0657nobodyさん
02/11/07 02:59ID:???1 while s///;
の1なんですが、
マッチしなくなるまでループを続けるらしいですが、
一体どこでマッチしないって見切りをつけてるんでしょうか?
質問の意味もよく分かりませんね・・。
0658nobodyさん
02/11/07 05:18ID:???見切りをつける場所がなければ延々とループし続けてやがてマシンが落ちる
0659592
02/11/07 10:22ID:???@{$years{$year}}を
,
とかスペースで分割して表示するにはどうすればいいでしょうか?
---------------------------
while (<>){
($name,$year)=split /:/;
chomp $year;
push @{ $years{$year} }, $name;
}
for $year (sort keys %years){
print "$year",@{$years{$year}},"\n";
}
おめでとう。特に無駄な処理はしていないし、いいと思うよ。
強いてあげれば
($name,$year)=split /:/; は my($name, $year)=split /:/; の方が
他の場所にある(グローバルな)$nameや$yearを破壊してしまわないので望ましいね
配列要素をカンマ区切りで出力するには、一般にjoin($sep, @list)を使えばいいよ。
単にスペースで区切ればいいならダブルクォートの中に入れるだけでいいけどね。
0661nobodyさん
02/11/07 11:26ID:???{ map { $_, 1 } @list }
は
どんな時に使いますか?
サンプルキボン
0662nobodyさん
02/11/07 13:09ID:???find . -name '*% find . -name '*.bak' -print0 | perl -n0e unlink
改行"\n"とは違って?
0663nobodyさん
02/11/07 13:24ID:r3gS0+P5どうやって調べればいいですか?
以下のように書いてもNGになっちゃって・・・
@array = ("taro", "jiro");
$name = "taro";
if (@array =~ /$name/) { print "OK\n"; }
else { print "NG\n"; }
0664nobodyさん
02/11/07 13:43ID:???0665nobodyさん
02/11/07 14:06ID:???$hogedir = 'C:\Documents and Settings\Administrator\デスクトップ\hoge\';
こうやって、最後に\を入れるとエラーになります。
$hogedir = 'C:\Documents and Settings\Administrator\デスクトップ\hoge';
最後の\を取ると正常になります。
最後の\は付けちゃいけないルールなんでしょうか。
0666nobodyさん
02/11/07 14:09ID:???$hoge = 'aaaaaaaaa\'aaaaaaaaaaaaa';
print $hoge;
の結果を見てみれ。何故エラーになったか分かるから。
0668666
02/11/07 14:11ID:???$hogedir = 'C:\Documents and Settings\Administrator\デスクトップ\hoge\\';
とやればお望みの結果になるかと。
0669nobodyさん
02/11/07 14:42ID:???null文字( ´∀`)つ\0
>>663
foreach (@array) {
if (/$name/) { OK }
else { NG }
}
0670nobodyさん
02/11/07 14:53ID:???にある
「引数の全角数字を半角数字に変換する」
って方法はかなり厨ですかぁ?
もっとスマートな方法キボン
0671nobodyさん
02/11/07 15:17ID:???0672nobodyさん
02/11/07 15:32ID:???my @a = ("あ","い","う");
my $b = "B";
&tugi("@a","$b");
}
sub tugi{
my (@hairetu,$hensu) = @_;
}
こうすると@hairetuに渡された引数が全部入ってしまいます。
仕方なく、
my @hairetu = $_[0];
my $hensu = $_[1];
とやっていますが、引数が多くなった時は大変です。
どうすればうまく引数を受け取れますか。
0673672
02/11/07 15:35ID:???my @hairetu = $_[0];
my $hensu = $_[1];
もダメでした(汗
@hairetuに "あ い う" こういう感じで配列が一個になってしまいました。
0674nobodyさん
02/11/07 15:49ID:???my @a = ("あ","い","う");
my $b = "B";
&tugi($b, @a);
}
sub tugi {
my ($hensu, @hairetu) = @_;
}
or
sub start{
my @a = ("あ","い","う");
my $b = "B";
&tugi(\@a, $b);
}
sub tugi {
my ($tmp, $hensu) = @_;
my @hairetu = @{$tmp};
}
0675nobodyさん
02/11/07 17:47ID:???が
$foo->{bar}
と書ける理由は何でしょうか?
0676nobodyさん
02/11/07 17:54ID:???%foo と %{$foo} は同じ。
よって $foo{bar} と ${$foo}{bar} は同じ。
$foo{bar} と $foo->{bar} は同じ。
だから ${$foo}{bar} と $foo->{bar} は同じ。
0677nobodyさん
02/11/07 18:01ID:???本文
----------------
のような形式の二フログからタイトル行だけ取り出したいのですが,
grep(/^[0-9]{5}\/[0-9]{5}\ /, @file);
だとエラーになったり(ならなかったり)します。
どう書くべきですか?
0678677
02/11/07 18:07ID:???if ($str =~ /^[0-9]{5}\/[0-9]{5}\ /)
だとエラーにならず,
grep(/^[0-9]{5}\/[0-9]{5}\ /, @file);
だとエラーになります。
0682677
02/11/07 18:44ID:???ソースをUTF-8で保存すると,
エディタが?を0xC2A5(円マーク)として
エンコードしやがるのが原因でした。申し訳ない。
0683rubyist@カラアゲうまうま
02/11/07 21:20ID:???0684nobodyさん
02/11/07 21:41ID:???0685rubyist@カラアゲうまうま
02/11/07 21:45ID:???0686611
02/11/08 00:20ID:???0687nobodyさん
02/11/08 00:32ID:???0689デフォルトの名無しさん
02/11/08 01:18ID:???rubyistって・・・中学校もでてないと思うよ。
0690nobodyさん
02/11/08 09:48ID:???ttp://www.amazon.co.jp/exec/obidos/ASIN/4899770413/qid=1036634229/sr=1-7/ref=sr_1_2_7/249-3840325-5917917
「やさしいPerl 表計算的処理編」
ExcelVBAが大嫌いな人のために、
「perlで表計算」というスレ立ててもいいですか?
そういうネタは育つかな?
0691690
02/11/08 09:49ID:???昔そういうスレありましたか?
0692nobodyさん
02/11/08 13:13ID:???1..6と(最初の6行)
364..370(最後の7行)
がゴミ情報です。
perlの
for $i (7..363){}
とか使って、
ファイルの必要な部分だけを抜き出したいんですが、
どうすればいいでしょうか?
tail -364 hoge.txt|head -357
は計算するのが面倒です。
0693nobodyさん
02/11/08 13:14ID:???「ExcelVBAが大嫌いな人」ですが、xlsをCSVで保存、
後は、Perlでさくさくやってます、または、Perl
でさくさく、CSVにしてExcelに読ましてますが、
それ以上の高度なことができるってことでしょうか。
0694nobodyさん
02/11/08 13:18ID:???普通は、CSV2TeXできれいに出力。
0696nobodyさん
02/11/08 14:13ID:???CSV2TeX
は何処にあるCSV2TeXでしょうか?
すごく興味あります。ハァハァ。
0698nobodyさん
02/11/08 21:55ID:???>>692はちょっとわかりにくいけど、
> tail -364 hoge.txt|head -357
> は計算するのが面倒です。
っていうからにはいろんなファイルに対してそういう処理をするから
そのたびに計算するが面倒だってんじゃないの?
perl -i.bak -ne 'unshift@a,$_;print$a[7]if$.>13' でどう?
0699デフォルトの名無しさん
02/11/08 22:20ID:???へー、最後のところ読み飛ばしてレスしちゃった。
それにしても、あんたの案は頭いいね。もしかして、
あんた天才?
0701nobodyさん
02/11/08 23:15ID:???配列を1個の変数にするにはどうすればいいんでしたっけか?
0703デフォルトの名無しさん
02/11/08 23:20ID:???$scalar="@array";
$scalar=join("", @array);
とかさ。
■ このスレッドは過去ログ倉庫に格納されています