トップページ⇒php
1001コメント324KB

【Perl】初心者コーナー Part17

■ このスレッドは過去ログ倉庫に格納されています
0001 ◆Go4ZKngPGE 02/10/14 17:24ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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あたりを見よう。
0655nobodyさん02/11/07 01:30ID:???
>>653
素人意見で申し訳ないんだけど、
漏れならダミーファイル作ってそいつがあったら強制終了、なかったら通常通り起動ってするな・・・。
素人だからそれくらいしか出来ないって突っ込みな無しで・・・。
0656nobodyさん02/11/07 01:44ID:???
>>655
ダミーファイルつかまんまPIDファイルじゃないのか? それは。
/var/run/hoge.pid って。
0657nobodyさん02/11/07 02:59ID:???
ループ処理
1 while s///;
の1なんですが、
マッチしなくなるまでループを続けるらしいですが、
一体どこでマッチしないって見切りをつけてるんでしょうか?

質問の意味もよく分かりませんね・・。
0658nobodyさん02/11/07 05:18ID:???
条件式が偽になればそこが見切り
見切りをつける場所がなければ延々とループし続けてやがてマシンが落ちる
065959202/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";
}
0660 ◆hMJAPH9PWA 02/11/07 10:53ID:???
>>659
おめでとう。特に無駄な処理はしていないし、いいと思うよ。
強いてあげれば
($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:???
if (grep(/\Q$name\E/, @array)){
0665nobodyさん02/11/07 14:06ID:???
perlの中でローカルの任意のディレクトリを指定したい時は、(例えばデスクトップのhogeフォルダ)
$hogedir = 'C:\Documents and Settings\Administrator\デスクトップ\hoge\';
こうやって、最後に\を入れるとエラーになります。

$hogedir = 'C:\Documents and Settings\Administrator\デスクトップ\hoge';
最後の\を取ると正常になります。
最後の\は付けちゃいけないルールなんでしょうか。
0666nobodyさん02/11/07 14:09ID:???
>>665
$hoge = 'aaaaaaaaa\'aaaaaaaaaaaaa';
print $hoge;

の結果を見てみれ。何故エラーになったか分かるから。
0667nobodyさん02/11/07 14:09ID:???
>>665
そのスクリプトを見ないことにはなんとも言えない
066866602/11/07 14:11ID:???
あと

$hogedir = 'C:\Documents and Settings\Administrator\デスクトップ\hoge\\';

とやればお望みの結果になるかと。
0669nobodyさん02/11/07 14:42ID:???
>>662
null文字( ´∀`)つ\0

>>663
foreach (@array) {
  if (/$name/) { OK }
  else { NG }
}
0670nobodyさん02/11/07 14:53ID:???
ttp://ha1.seikyou.ne.jp/home/ikkyu/works/perl/sample.html#TransferHANKAKU

にある
「引数の全角数字を半角数字に変換する」

って方法はかなり厨ですかぁ?

もっとスマートな方法キボン

0671nobodyさん02/11/07 15:17ID:???
素直にjcode.plかJcode.pm使えば?
0672nobodyさん02/11/07 15:32ID:???
sub start{
my @a = ("あ","い","う");
my $b = "B";
&tugi("@a","$b");
}

sub tugi{
my (@hairetu,$hensu) = @_;
}

こうすると@hairetuに渡された引数が全部入ってしまいます。
仕方なく、
my @hairetu = $_[0];
my $hensu = $_[1];
とやっていますが、引数が多くなった時は大変です。
どうすればうまく引数を受け取れますか。
067367202/11/07 15:35ID:???
すいません、
my @hairetu = $_[0];
my $hensu = $_[1];
もダメでした(汗
@hairetuに "あ い う" こういう感じで配列が一個になってしまいました。
0674nobodyさん02/11/07 15:49ID:???
sub start{
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}
が
$foo->{bar}
と書ける理由は何でしょうか?
0676nobodyさん02/11/07 17:54ID:???
$foo = \%foo; の場合
%foo と %{$foo} は同じ。
よって $foo{bar} と ${$foo}{bar} は同じ。

$foo{bar} と $foo->{bar} は同じ。

だから ${$foo}{bar} と $foo->{bar} は同じ。
0677nobodyさん02/11/07 18:01ID:???
01234/05678 ABC01234 ハンドル RE:タイトル

本文
----------------
のような形式の二フログからタイトル行だけ取り出したいのですが,
grep(/^[0-9]{5}\/[0-9]{5}\ /, @file);
だとエラーになったり(ならなかったり)します。
どう書くべきですか?
067867702/11/07 18:07ID:???
すみません。正確には,
if ($str =~ /^[0-9]{5}\/[0-9]{5}\ /)
だとエラーにならず,
grep(/^[0-9]{5}\/[0-9]{5}\ /, @file);
だとエラーになります。
0679nobodyさん02/11/07 18:19ID:???
>>676
質問者じゃないけど勉強になった。
0680nobodyさん02/11/07 18:32ID:???
>>678
grepでは正規表現が使えないからかな
0681nobodyさん02/11/07 18:35ID:???
>>677
エラーって何のエラー?
068267702/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:???
ヴォッケ
068661102/11/08 00:20ID:???
……
0687nobodyさん02/11/08 00:32ID:???
rubyistって・・・高校でてないの?
0688nobodyさん02/11/08 00:56ID:???
>>686うそついちゃいかん。消し忘れかね
0689デフォルトの名無しさん02/11/08 01:18ID:???
>>687
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で表計算」というスレ立ててもいいですか?

そういうネタは育つかな?

069169002/11/08 09:49ID:???
そうそう、
昔そういうスレありましたか?
0692nobodyさん02/11/08 13:13ID:???
370行のファイル、hoge.txt があります。
1..6と(最初の6行)
364..370(最後の7行)
がゴミ情報です。
perlの
for $i (7..363){}
とか使って、
ファイルの必要な部分だけを抜き出したいんですが、
どうすればいいでしょうか?

tail -364 hoge.txt|head -357
は計算するのが面倒です。
0693nobodyさん02/11/08 13:14ID:???
>>690
「ExcelVBAが大嫌いな人」ですが、xlsをCSVで保存、
後は、Perlでさくさくやってます、または、Perl
でさくさく、CSVにしてExcelに読ましてますが、
それ以上の高度なことができるってことでしょうか。
0694nobodyさん02/11/08 13:18ID:???
もち、Excelファイルでデータ交換しなきゃならない場合だけどね。
普通は、CSV2TeXできれいに出力。
0695nobodyさん02/11/08 13:20ID:???
>>692
if (6 < $. && $. < 364) {
print;
}
でどうよ。
0696nobodyさん02/11/08 14:13ID:???
693さんが使ってらっしゃる
CSV2TeX
は何処にあるCSV2TeXでしょうか?

すごく興味あります。ハァハァ。

0697nobodyさん02/11/08 16:10ID:???
>>696
あなたなら5〜6分でできるであろうような、自作Perl
スクリプトです。期待に添えずスマソ

0698nobodyさん02/11/08 21:55ID:???
>>695

>>692はちょっとわかりにくいけど、
> tail -364 hoge.txt|head -357
> は計算するのが面倒です。
っていうからにはいろんなファイルに対してそういう処理をするから
そのたびに計算するが面倒だってんじゃないの?

perl -i.bak -ne 'unshift@a,$_;print$a[7]if$.>13' でどう?
0699デフォルトの名無しさん02/11/08 22:20ID:???
>>698
へー、最後のところ読み飛ばしてレスしちゃった。
それにしても、あんたの案は頭いいね。もしかして、
あんた天才?

070069802/11/08 22:38ID:???
>>699
あはっ、そうだったら良かったんだけどね。
こういうの考えるのって楽しいよね。
0701nobodyさん02/11/08 23:15ID:???
ちと失敬。
配列を1個の変数にするにはどうすればいいんでしたっけか?
0702nobodyさん02/11/08 23:19ID:???
>>701
意味不明
0703デフォルトの名無しさん02/11/08 23:20ID:???
>>701
$scalar="@array";
$scalar=join("", @array);
とかさ。

070470102/11/08 23:22ID:???
>>702
他に説明のしようがござらん。
>>703
なるほど。ありがとうござる。
0705rubyist@カラアゲうまうま02/11/08 23:28ID:???
頭の不自由な人ですか?
0706nobodyさん02/11/08 23:34ID:???
おっ! 今夜も寂しんぼうがやってきた。

したーのほうにあったスレをご丁寧にあちこち探しまわってやっと見つけた

このスレにカキコですか・・・
0707rubyist@カラアゲうまうま02/11/08 23:38ID:???
20番前後で「したーのほう」とは随分目が悪いんだな(w
厨房質問ばかりなのがいかにもPerlスレらしい
0708rubyist@カラアゲうまうま02/11/08 23:41ID:???
何でk身うj食う入れjyr!
こて手見せる!
0709nobodyさん02/11/08 23:44ID:???
rubyは興味あるけど
こんな人間になっちゃうんなら触らない方がいいかな
0710nobodyさん02/11/08 23:50ID:???
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0711rubyist@カラアゲうまうま02/11/08 23:51ID:???
>>710
1:Perlコミュニティの壊滅
2:取りあえず2chで煽ってみた
3:あんまりまともに相手にされない
0712nobodyさん02/11/08 23:56ID:???
上下フレーム式の2ショットチャットCGI作ってるんですが、
相手が入室した時に、上フレーム内に相手の名前を表示させるために
1回だけリロードさせたいんですが、
下のフレームだけがリロードされて上のフレームはリロードできないんです。
Location: 以外で、上のフレームだけをリロードさせる方法無いでしょうか?
0713nobodyさん02/11/08 23:59ID:???
>>712
もうちょい詳しくね。
ソースの関係あるとこ見せてみ。
0714nobodyさん02/11/09 00:04ID:???
>>712targetの問題でわ
071571202/11/09 00:07ID:???
説明しにくくてすみません・・

上のフレーム: 発言窓と参加者リスト
下のフレーム: 発言ログ

で、
相手が参加した時の動き

上のフレーム: 参加者リストに相手の名前追加
下のフレーム: 相手の入室サイン

となるようにしたいのですが、
下のフレームはMETAタグが仕込まれているのでRefresh時間を0にするだけで
リロードは即時に出来るんです。
しかし上のフレームは発言窓で固定のため、METAタグを仕込めず、
リロード出来ないのです。
この「相手が参加した時の動き」のサブルーチンは、
下フレーム内のリロードの処理だけ入ってるんです。
0716nobodyさん02/11/09 00:08ID:ohpSmuMz
/home/foo/bar/hoge/fuga.txt
/home/foo/bar/hoho.txt
というリストから、*.txtを削除する方法はありませんか?
071771202/11/09 00:08ID:???
>>714
METAタグにはtarget効きませんでした。
0718nobodyさん02/11/09 00:12ID:???
>717
JavaScript使え。
0719nobodyさん02/11/09 00:13ID:???
>>712=715
言ってることがよくわからん。混乱してない?

そもそも、
>相手が参加したときの動き
って、リロードする前に相手が参加したかどうかはわからないよね。
で、なんでまたMETAでリロードする必要があるの?
0720nobodyさん02/11/09 00:14ID:???
>>716
s/[^\/]+\.txt$//;
072171902/11/09 00:16ID:???
あ、上フレームをリロードするため?そりゃ無理だ。
それなら、やっぱり>>718の言うとおりJavaScriptだね。
ただ、入力欄のあるフレームを勝手にリロードすると大変
使いにくいチャットになると思われるので、その辺注意して。
つーか、なんでリストを下のフレームに表示しちゃいけないの?
0722nobodyさん02/11/09 00:17ID:2uRXoRQG
現在、メール送信のプログラムを書いているのですが、
sendmailじゃなくて、smtpで送りたいんです。
ただ、サーバがモジュールが使えないので、
モジュールなしでのsmtpサーバ経由のメールの
送り方をご存じの方ご教授願います
072371202/11/09 00:18ID:???
>>721
Javascriptで1回きりリロードって出来ます?Perlスレなのにすみません・・。

下のフレームにリスト表示したくないんです。
0724nobodyさん02/11/09 00:19ID:???
参加者リストは下フレームに置くのが一般的。
上に1回だけ表示させてもいなくなった人は消えないし後から来た人が追加されることもない。
0725nobodyさん02/11/09 00:20ID:ohpSmuMz
>>720
ありがとうございます。感謝です。
0726nobodyさん02/11/09 00:24ID:???
御願いします。

cat -n で複数ファイルを番号つきで見ています。
下のようにするとファイルの境界がなくなって見ずらいです。

-------------------
とか入れることできないでしょうか?

$ for i in `seq 1 2`;do cat -n vba.$i;done
1 With ActiveSheet.UsedRange
2 Set r = .Rows(.Rows.Count).Offset(1, 0)
3 For Each c In r.Cells
4 c.FormulaR1C1 = "=SUM(R[-" & c.Row - 1 & "]C:R[-1]C)"
5 Next
6 End With
7 End Sub
1 With ActiveSheet.UsedRange
2 Set r = .Rows(.Rows.Count).Offset(1, 0)
3 For Each c In r.Cells
4 If c.Column <> 1 Then
5 c.FormulaR1C1 = "=SUM(R[-" & c.Row - 1 & "]C:R[-2]C)"
6 End If
7 Next
8 End With
9 End Sub
0727nobodyさん02/11/09 00:28ID:???
---------------------- の内容のファイルを用意し(仮に line.txt)

% cat -n xxx line.txt
0728nobodyさん02/11/09 00:44ID:s/UCnmus
奮戦記
http://www.geocities.co.jp/SiliconValley-Oakland/9753/fusigi1.htm

072971902/11/09 00:46ID:???
>>723
> Javascriptで1回きりリロード
参加者が変わったときだけ上フレームをリロードするJavaScriptを
下フレームのHTMLに挿入すればいい。
でもさっき言った入力欄の問題があるから、さらに上フレームは
分割したほうがいいかもね。

リロードしないで直接JavaScriptで上フレームに書いてやってもいいと
思うけど。
0730nobodyさん02/11/09 00:52ID:???
>>727
その方法は、例えば、僕は連番ファイルを
$ for i in `seq 1 2`;do cat -n vba.$i;done
のようにして読んでるので、ひとつのファイルを読むたびに
line.txtを読みこむ必要がありませんか?







0731nobodyさん02/11/09 00:55ID:???
>>709
そのセリフを言わせるのが奴の目的だから相手するな。
0732nobodyさん02/11/09 00:58ID:???
>>730
$ for i in `seq 1 2`;do cat -n vba.$i line.txt;done
0733ペール02/11/09 01:03ID:su5V8ups
はじめまして。

index.html等から、cgiを呼び出して、その結果を出力したいのですが、
htmlに<img src="〜.cgi">という風に書くと、
画像がないときの表示になりました。
どうすれば解決できますか。
教えてください。
0734nobodyさん02/11/09 01:07ID:???
>>733
ヘッダ書いてる?
0735ペール02/11/09 01:10ID:su5V8ups
>>734
レスありがとうございます。
ヘッダには、
"Content-type: text/plain"
と書いてあります。
0736nobodyさん02/11/09 01:13ID:???
GIFファイルなら Content-type: image/gif\n\n

JPEGファイルなら Content-type: image/jpeg\n\n

とかじゃない?
0737ペール02/11/09 01:15ID:???
書き忘れてました。
テキストを表示させたいと思ってます。
たとえば、掲示板で、最後に書かれた記事とかを
表示させるにはどうすればいいんでしょうか?
0738nobodyさん02/11/09 01:16ID:???
>>737

>>733で<img src="〜.cgi">って書いてるよ?
0739ペール02/11/09 01:18ID:???
<img src="〜.cgi">でcgiを呼び出そうと思ったのですが、
テキストを表示させたい場合にはそこがまずいんでしょうか?
自分でもいろいろ調べてみたのですが、見つからなくて・・・
0740nobodyさん02/11/09 01:25ID:???
>>739
frameかiframe使う。
0741ペール02/11/09 01:33ID:???
フレームで分割して、その部分だけcgiで書けばいいってことですかね?
0742マリモーマ02/11/09 05:33ID:zHgBIOSq
あと SSIかな?
0743nobodyさん02/11/09 06:40ID:???
>>724
自分が発言した時には更新されるんじゃない?
0744nobodyさん02/11/09 09:35ID:QCjNu4vr
SSIが一番いいと思うが。
text/plainで出力するわけだし。
0745nobodyさん02/11/09 10:37ID:???
つかCGIで出力したテキストをHTMLに表示できると思ってるのが間違いであると素直に教えてあげた方が。
だから一般的なアクセスカウンタはテキストじゃないわけだし
0746nobodyさん02/11/09 10:51ID:???
XMLで出力、これ最強。
0747nobodyさん02/11/09 11:24ID:???
GD.pmでイメージに変換するというのはどうだ。(w
0748nobodyさん02/11/09 11:47ID:???
JavaScript
0749nobodyさん02/11/09 12:46ID:???
投稿内容チェックしたいんですけど、
半角英数字以外と数字以外の規制はどうやればいいですか?
0750nobodyさん02/11/09 12:50ID:???
die if /\W/;
0751nobodyさん02/11/09 16:50ID:???
ここはPerlの質問用スレッドだということを分かっているのかな。
0752nobodyさん02/11/09 18:22ID:???
>749
ttp://pc.2ch.net/test/read.cgi/php/1032704121/567n
0753Ruby!!!!!!!!!!!02/11/09 19:20ID:???
ここは糞言語の質問用スレッドだということを分かっているのかな。


0754nobodyさん02/11/09 20:17ID:???
>>750
dieはまずいでしょう。
0755nobodyさん02/11/09 22:08ID:???
>>754
チョトワラタ
言われてみればそうだ
■ このスレッドは過去ログ倉庫に格納されています