トップページphp
981コメント337KB

くだすれPerl(超初心者用)3

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/03/31(火) 22:20:27ID:???
このスレッドは、他のスレッドでは書き込めない超低レベル、
もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。

前スレ
くだすれPerl(超初心者用)2
http://pc11.2ch.net/test/read.cgi/php/1204488452/

関連スレ
Perlについての質問箱 39箱目
http://pc12.2ch.net/test/read.cgi/tech/1234181856/
Perlコーディング初心者質問スレ Part 59
http://pc11.2ch.net/test/read.cgi/php/1234752149/
【Perl上級者コーナーPart01】
http://pc11.2ch.net/test/read.cgi/php/1024741312/
0622nobodyさん2010/01/26(火) 23:24:53ID:???
意味がわからんから答えようがないだろwwwwwwwww

で、「Perlスクリプト文字コードはEUC-JP」とあるけどbar.shtmlにEUC-JPで書いた文字を
Perl/foo.cgiを#includeさせてUTF-8として表示されればいいのか?

#/path/to/perl

use Encode qw/from_to/;
from_to($ENV{pgtitl}, 'shiftjis', 'utf8');
print "<h1>$ENV{pgtitl}</h1>";

こうか?
0623nobodyさん2010/01/26(火) 23:25:54ID:???
違うか
from_to($ENV{pgtitl}, 'euc-jp', 'utf8');
0624nobodyさん2010/01/26(火) 23:52:22ID:???
>>614のどこにも質問文がないからなぁ
06256142010/01/27(水) 05:00:54ID:???
すみません、質問書き直します。
呼び出し時に、SSI変数か、CGIの引数で文字列を入力して、
UTF-8で出力するCGIを作ろうとしているわけですが、
print "<h1>$ENV{pgtitl}</h1>";
だと、SSI変数が読めません。

フローチャート
________________
|入力             |
|UTF-8(SSI呼び出し)引数付き  |
|<!--#exec cgi="foo.cgi    |
| サーバー環境" -->      |
|_______________|

________________
|処理             |
|引数が存在するか?      |
|はい>>引数をエンorデコード  |
|いいえ>>プリントしない    |
|_______________|

________________
|出力             |
|UTF--8で           |
|引数を<h1>に入れて出力    |
|_______________|
06266142010/01/27(水) 05:30:17ID:???
#!/usr/bin/perl
use Encode qw/from_to/;
print "Content-type: text/html\n\n";
print "<h1>$ENV{pgtitl}</h1>";
$niti = "FONOの日常";
from_to($niti, 'euc-jp', 'utf8');
print "$niti";
exit;

入力がUTF-8だったので、そのままスルーで良かったんですね。
CGIに書かれている文字がeuc-jpなので、変換しないとだめなようですが。
把握しました。
0627nobodyさん2010/01/27(水) 07:28:37ID:???
>>616に対してなんかリアクションしてくれないか?
全然なにがやりたいかわからんから>>621と同じ解釈してパーサーっぽいの探してきたんだけど
あと前提条件として何があって、結果何がしたいのか言ってもらわんと誰も疑問に答えることはできんと思うが
0628nobodyさん2010/01/27(水) 08:30:00ID:???
>>625-626
SSI もどきの動作を CGI に置き換えたいのかと思いきや, 違うようだねぇ.
というか, 余計, やりたいことが見えなくなったですぜぃ.
どこでも回答を得られなかったそうだけど, 合点が行きますぜ.
固定観念を捨てて すなおにやりたいことを書くようにしないと...

漂流の旅は 延々と...
06296142010/01/27(水) 18:18:11ID:???
>>616-628
質問文に基礎的な欠陥がありました。すみません。

>>616>>627
パーサーではなくて、完全にPerlに書き換えるということです。
まさか、PerlにSSIのパーサーがあるとは。今後またパーサーにもお世話になると思います。

>>621
各ページの、ヘッダー・フッター・メニューの書き出しをSSIにさせていましたが、Apacheをアップデートしたら、文字化けするようになったので、Perlに文字化けする部分を置換しようかという話になりました。

質問を落ち着いてから要約すると、UTF-8のSHTMLから引数かなんらかの形で文字列を与えて、その文字列を、HTMLにはめ込んで、出力するものです。
たとえば、ああああという文字列を与えられたら
<title>FONOの日常 - ああああ</title></head><body><h1>ああああ</h1>
というふうに同じ文字を沢山のところに挿入して出力します。手軽さや、時間の関係でSSIを使っていて、アップデートしたら、mod_includeのバグで文字化けになって慌てました。

>>622-623
まさにそれです。そのコードを少し編集し>>626になり、それをにはめ込み、文字化けが解決しました。mod_includeのアップデートが来るまで待ちたいと思います。

たくさんの回答ありがとうございました。

今度質問するときはしっかり分かるよう、慌てずに、要所を押さえてから質問します。
0630nobodyさん2010/02/07(日) 16:21:07ID:???
質問です。

以下の配列
@hoge1 = (
'01,aa,bb',
'02,aa,bb',
'03,cc,dd',
'02,cc,dd'
)
これを
@hoge2 = (
'01,aa,bb',
'02,aa,bb,cc,dd',
'03,cc,dd',
)
というように、最初の数字が一緒なら数字以降のデータを連結したいです。
よろしくお願いします。
0631nobodyさん2010/02/07(日) 17:07:49ID:???
my %foo;
for (@hoge1) {
  /\A(\d+)(.*)\z/s;
  $foo{$1} = exists $foo{$1} ? "$foo{$1}$2" : "$1$2";
};
my @hoge2 = values %foo;
0632nobodyさん2010/02/07(日) 17:15:19ID:???
順番が違う
0633nobodyさん2010/02/07(日) 17:27:28ID:???
んじゃこれで

my %foo;
my @sort;
for (@hoge1) {
  /\A(\d+)(.*)\z/s;
  if (exists $foo{$1}) {
    $foo{$1} = "$foo{$1}$2";
  } else {
    $foo{$1} = "$1$2";
    push @sort, "$1";
  }
};
my @hoge2 = @foo{@sort};
0634nobodyさん2010/02/07(日) 17:33:29ID:???
うむ、大分よくなった。
次は同じ数値のやつで値が重複してれば取り除くことかな
更に値を昇順に並べる
できればだけど、初心者にできるだけわかり易いコードで書くか、難しいコードにはコメント付けることかな
06356302010/02/07(日) 18:32:40ID:???
>>633
書式の意味はさっぱり分かりませんが、思い通りに出来ました。
ありがとうございました。

>>634
これは、とあるデータファイルなのですが、現在の仕様では書き込み時に
行頭のデータを見つけて同じなら追加できるようになっています。
また重複しないようにもなっています。
今回、過去のデータが1データ1行という仕様だったものを現在の仕様に
合わせて効率化(読み込み回数の減少)を図りたかったので知恵を
拝借させていただきました。

では、これから数十万ファイルを変換します。。。
ありがとうございました。
0636nobodyさん2010/02/10(水) 04:24:28ID:SN+dhl64
iPhoneをつかっているのですが、ケータイ相手だとメールのヘッダに差出人の名前が含まれておらず後で見返すときに不便です。
ですので、受信メールをemlで書き出して編集をしようと思っています。
今はシェルスクリプトを使って以下のように行っております。

for file in *.eml;
do

sed -e 's/From: yamada@softbank.ne.jp/From: =?ISO-2022-JP?B?GyRCOzNFRBsoQg==?= <yamada@softbank.ne.jp>/' $file > tmp.eml;
mv tmp.eml $file;
以下人数分繰り返し。。

done

ですが、これだと、置換が終わったファイルに関してもアクションが行われたりと非効率的なので、
置換が終わったらループを抜けてつぎのファイルに移動するなどすることは可能でしょうか。
0637nobodyさん2010/02/10(水) 06:33:49ID:???
スレ違い
06386362010/02/11(木) 20:43:34ID:???
失礼いたしました。
06396142010/02/12(金) 07:09:14ID:0arSSMW8
614を書いてから15日ぐらいたって、サイトテンプレートに全てPerlを採用する流れになり、急激にPerlの必要性が上がりました。

質問はこうです。

print "<td id=\"menu\" colspan=\"2\"><a href=\"/tsubuyaki.shtml\">呟き</a>$menu[0]\n";
print "<a href=\"/music.shtml\">演奏活動$menu[1]</a>\n";
print "<a href=\"/NNB\">NicoNicoBrowser$menu[2]</a>\n";
print "<a href=\"/live.shtml\">ネットワーク機器監視カメラ$menu[3]</a>\n";
print "<a href=\"/uploader\">アップローダー$menu[4]</a>\n";
print "<a href=\"/ntp.shtml\">公開NTP$menu[5]</a>\n";
print "<a href=\"/manage.shtml\">管理・障害情報$menu[6]</a>\n";
print "<a href=\"/info.shtml\">サーバー情報$menu[7]</a>\n";
print "<a href=\"/contact.shtml\">管理人へ連絡$menu[8]</a></td>\n";

リンク先のshtmlファイルのLastModifiedを取得して、1日以上新しい場合、リンクにNewラベルを追加したい
(つまりmenu[n]の部分に<img src="/main.files/new.png">をprintしたい)
のですが、どのようにすればいいでしょうか?

なおかつ、ここのメニュー生成はパターン化してしまっているので、
リンク先,リンクテキスト,更新フラグ(立ってたら<img src="/main.files/new.png">[newラベル]をプリント)
のように配列にまとめてfor文で一気にprintしまいたいところです。

多分、データ配列化でfor文によるプリントと、更新フラグでリンク画像追加を一気にやってしまえば一番すっきりしていいのですが、
サンプルを2、3件回って、打ち込んでみないと理解できない質なので、急にfor文を使うのは技術力が追いつかず無理です。

賢者の皆さん回答お願いします。
0640nobodyさん2010/02/12(金) 08:34:28ID:???
相変わらず要点のわかり辛い文章だな。「急にfor文を使うのは無理です」とか意味わからんし。
まずfor文で書いてみろよ。添削はしてやるから。そうじゃないと身に付かない。
0641nobodyさん2010/02/12(金) 09:42:53ID:/dEp/DAw
自作掲示板改良, 苦労に苦労を重ねた末, 致命的欠陥を発見. (ありがちなことです)
気晴らしに >>639 の翻訳に挑戦:

サパ〜リわからん!!!

判らない点:
1. "メニュー生成はパターン化してしまっているので"
 ・ その "パターン化メニュー生成" とは ?
2. "のように配列にまとめて"
 ・ "のような配列"とは ?
 ・ 仮に "$menu[n]" が 指し示すものだとしても その中身は "new.png" なのでは ?
3. "データ配列化で"
 ・ では "配列化" したデータのサンプルを...
 (データ構造がきちんと決まっていないのでは ?)
 (loop で ぶん回すこと以前の問題にしか思えない)
0642nobodyさん2010/02/12(金) 10:16:43ID:???
HTML::Template使えよ
0643nobodyさん2010/02/12(金) 10:48:22ID:???
あー・・・とりあえず雛形
use strict;
use warnings;
use Perl6::Say;
my @entries = (
  { url=> '/tsubuyaki.shtml',  title=>'呟き', },
  { url=> '/music.shtml',  title=>'演奏活動', },
  { url=> '/NNB',  title=>'NicoNicoBrowser', },
  { url=> '/live.shtml',  title=>'ネットワーク機器監視カメラ', },
  { url=> '/uploader',  title=>'アップローダー', },
  { url=> '/ntp.shtml',  title=>'公開NTP', },
  { url=> '/manage.shtml',  title=>'管理・障害情報', },
  { url=> '/info.shtml',  title=>'サーバー情報', },
  { url=> '/contact.shtml',  title=>'管理人へ連絡', },
);
for my $entry (@entries) {
  my $mtime = (stat($entry->{title}))[9];
  say $entry->{title}, ' (', $mtime, ') : ', $entry->{url};
}
0644nobodyさん2010/02/12(金) 10:49:19ID:???
うお、一箇所間違えた
まぁいいか
06456142010/02/12(金) 17:12:40ID:0arSSMW8
サーセン。全く文才がない。少しは文章を練ったつもりでいた。

>>640
ですね。やってみたんですがエラーx20over
根気がなくてなおかつ焦っているのが見え見え。
もうちょうっと根気良くやってみます

>>641
配列に入れるのは
リンク先相対URL,リンクテキスト,更新フラグ
を一列にして入れていきます。
更新フラグが立つ(1になる)条件は、LastModifiedが1日以内であることです。
それでできたデータをfor文で1行ずつ書いていくということです。

>>642
もしかしたらページのテンプレート化は全部これで解決かと思い、別ディレクトリ作って仮導入してみたところ
アップローダーのCGIがHTML書き出し型で謎の二重呼び出し、エラーを返すかと思いきやApacheが落ちてしまいました。

>>643
がんばって雛形に従って書いてみます。
0646nobodyさん2010/02/12(金) 17:27:10ID:???
>>645
apacheが落ちるってw
そりゃ間違いなくお前のコードの書き方が悪いわ
0647nobodyさん2010/02/12(金) 17:30:03ID:???
643は動かしてはみたのか?

リアル中学生だっけ。親御さんは気の毒になぁ。
0648nobodyさん2010/02/12(金) 17:40:13ID:???
丸投げスレに投げるのが一番平和な気がする
http://pc11.2ch.net/test/read.cgi/php/1222645553/
06496142010/02/12(金) 18:00:22ID:0arSSMW8
>>646
なぜ落ちるのか原因が解析できないのが技術力の足りなさでしょうかorz

>>643 >>647
動かしてみましたところ。
Error message:
Premature end of script headers: test.cgi
改行コードとパーミッションを確認すること5回。何故だあああああ!?
print "Content-type: text/html\n\n";
を加えてヘッダーを出すようにしてみたり、
モジュールの存在を確認したけれど動かず。
これもまた原因不明o....rz

>>648
丸投げですか。選択肢としては有r(ry……甘えだと思うんだ。

また0から自分で打ってきますので添削お願いします。
0650nobodyさん2010/02/12(金) 18:15:07ID:???
ここで延々と添削してもらうのは甘えではないのか
基準がようわからん
0651nobodyさん2010/02/12(金) 18:20:51ID:???
> 更新フラグが立つ(1になる)条件は、LastModifiedが1日以内であることです。

こんな感じで要求仕様だけ細かいけど何も考えてくれないから添削にもなってないよ。
CLIで叩くもんをCGIで動かして

> 改行コードとパーミッションを確認すること5回。何故だあああああ!?

ってやかましいわ。
0652nobodyさん2010/02/12(金) 18:39:41ID:???
>>650
スレタイ的にはそこはどうでもいいと思うが、添削の元になるコードすら書かないからなコイツ。
0653nobodyさん2010/02/12(金) 18:48:15ID:???
いきなりCGIに投入するんじゃなくて
コマンドラインからperl test.plで試せ

つーか>>643に2,3行足して軽く変更するだけで要求されてるものはバッチリ完成するんだが
まぁそこまでやる義理も無いしな

おまけでヒント
http://www.ksknet.net/cat41/stat_1.html
0654nobodyさん2010/02/12(金) 18:53:13ID:???
>>649
環境に Perl6::Say 入れてる?

俺らはデバッガかっての
さっさと元コード晒せ
06556142010/02/12(金) 19:00:45ID:0arSSMW8
>>650
とりあえず手前なんとかなっても
自分で構造を読めないスクリプトだと
仕様変更した時にサーバー障害の原因になってしまっていても気づかないので
自分で構造を読めないスクリプトの導入は控えています。

>>650 >>651
#!/usr/bin/perl
@menu=( "/music.shtml<>演奏活動",
"/NNB<>NicoNicoBrowser",
"/live.shtml<>ネットワーク機器監視カメラ",
"/uploader<>アップローダー",
"/ntp.shtml<>公開NTP",
"/manage.shtml<>管理・障害情報",
"/info.shtml<>サーバー情報",
"/contact.shtml<>管理人へ連絡",
);
print "Content-type: text/html\n\n";
foreach $i (@menu){
@ancker = split(/<>/, $i);
print "<a href=\"$ancker[0]\">$ancker[1]</a>\n";
}
exit;

書いてきました。
CLIだったんですか。ActivePerlを使って叩くんですか……o....rz
それじゃあ動くわけがなかった。
サーセン。いつも自宅鯖管しててCGIで動かすのが基本になってました。

LastModifiedを使った日時計算をどうすればいいのでしょうか。
ヒントがあればorz
0656nobodyさん2010/02/12(金) 19:13:04ID:???
ヒントはもう出てる
0657nobodyさん2010/02/12(金) 19:13:44ID:???
$f =1 if(time <= ($mtime+86400));
0658nobodyさん2010/02/12(金) 19:16:54ID:???
>>655
>とりあえず手前なんとかなっても
>自分で構造を読めないスクリプトだと
>仕様変更した時にサーバー障害の原因になってしまっていても気づかないので
>自分で構造を読めないスクリプトの導入は控えています。

んじゃ、導入自体あきらめろ。
この程度のスクリプトを自力で書けない奴が偉そうな口を叩くな。
0659nobodyさん2010/02/12(金) 19:18:52ID:???
まぁまぁ、中学生相手なんだから落ち着いて
ちょっとガキをからかってやるかくらいの心持ちでいいんですよ
0660nobodyさん2010/02/12(金) 19:24:31ID:???
分からないから使わない、でも構わないが
スクリプトの先頭には↓を絶対入れるべき
use strict;
use warnings;
0661nobodyさん2010/02/12(金) 19:28:24ID:???
>>660
これを入れないで済むのはPerl4までだよねー
06626142010/02/12(金) 19:55:57ID:0arSSMW8
>>658
SSIばっかりやっていてPerl移行になったので。
SSI時代にまだ自分で適度に構造が分かるスクリプトを持ってきていた程度です。
Perl打ち込みを始めてからまだ15日しかたってません。勘弁してください。

>>660 >>651
挿入しました。指摘ありがとうございます。

>>654
入ってました。

>>653 >>656 >>657
先ほどCGIをローカルにもってきてActivePerl入れました。ご指摘ありがとうございます。
ActivePerlでは最終更新時間取得までいったので今度はサーバーに置いて練りこんでいけばできそうな
兆しが見えてきました。

本当に回答ありがとうございます。
最近アップローダーが閑散としていて帯域制限忘れたのが祟ったorz
アップローダーが混み合ってきてまともにファイル変更もできなくなったのでまた明日。
0663nobodyさん2010/02/12(金) 20:12:29ID:???
>>662
>>657の意味は・・・分かるヨナ
06646142010/02/12(金) 20:33:45ID:0arSSMW8
>>663
はい。すぐ把握できました。1日の秒数です。
06656142010/02/12(金) 23:25:55ID:0arSSMW8
アクセスの嵐が去ってくれたようなので作業再開します。
0666nobodyさん2010/02/12(金) 23:35:23ID:???
ここは君の日記帳じゃないんだから
そんなことまでいちいち書かなくていいんだよ
06676142010/02/13(土) 00:01:25ID:fcRfq/Wt
>>666
サーセン。深夜ボケして妙にハイテンションになって、注意欠陥状態です。

最後にサーバーにCIFSで送って、
相対パスを展開しないstatの実装に七転八倒するかと思いきやchdirであっさり・すっきりでした。
chdir("/var/www");
@menu=( "/music.shtml<>演奏活動",
"/NNB<>NicoNicoBrowser",
"/live.shtml<>ネットワーク機器監視カメラ",
"/uploader<>アップローダー",
"/ntp.shtml<>公開NTP",
"/manage.shtml<>管理・障害情報",
"/info.shtml<>サーバー情報",
"/contact.shtml<>管理人へ連絡",
);
foreach $i (@menu){
@ancker = split(/<>/, $i);
$mtime = (stat".$ancker[0]")[9];
$new =1 if(time <= ($mtime+86400));
print "<a href=\"$ancker[0]\">$ancker[1]";
if($new==1){
print "<img src=\"/main.files/new.png\">";
}
print "</a>\n";
}

また質問段階からgdgdでしたが、
レスを頂き、Perl打ち初め〜15日の初心者が助かりました。
本当にありがとうございました。
06686142010/02/13(土) 00:12:40ID:fcRfq/Wt
訂正。重大な欠陥がありました。1回new=1になるとそのままになるorz
#/usr/bin/perl
use strict;
use warings;
chdir("/var/www");
@menu=( "/tsubuyaki.shtml<>呟き",
"/music.shtml<>演奏活動",
"/NNB<>NicoNicoBrowser",
"/live.shtml<>ネットワーク機器監視カメラ",
"/uploader<>アップローダー",
"/ntp.shtml<>公開NTP",
"/manage.shtml<>管理・障害情報",
"/info.shtml<>サーバー情報",
"/contact.shtml<>管理人へ連絡",
);
foreach $i (@menu){
@ancker = split(/<>/, $i);
$mtime = (stat".$ancker[0]")[9];
if(time <= ($mtime+86400)){
$new = 1;
}else{
$new = 0;
}
print "<a href=\"$ancker[0]\">$ancker[1]";
if($new==1){
print "<img src=\"/main.files/new.png\">";
}
print "</a>\n";
}
exit;

無事動きました。
0669nobodyさん2010/02/13(土) 00:17:16ID:???
>>668
このコードがエラーを吐くのは間違いない
0670nobodyさん2010/02/13(土) 09:57:02ID:???
長井秀和生存確認!
0671nobodyさん2010/02/14(日) 17:46:27ID:???
自作掲示板, やっとこさ全ページ編集可能に. (でも bug bug...)
それにしても ここの話題が 易しくないと感じる あっしって,
ミジンコ ? ゾウリムシ ? (はぁ)
0672nobodyさん2010/02/14(日) 18:03:55ID:???
nifty で
 opendir(DIR,$logs);
 @u=readdir(DIR);
 closedir(DIR);
とやると
$u[0]='.', $u[1]='..', $u[2]='log0.tsv', ...

"." で始まるファイルは不可視ファイルなのだとか...
他のサーバーでも同様なのかしらん ?
0673nobodyさん2010/02/15(月) 01:23:48ID:???
$u[0]='.' カレントディレクトリ
$u[1]='..' 一つ上

ファイルだけの一覧が返って来るわけじゃないよ。ドットファイルの話はまた別。
0674nobodyさん2010/02/15(月) 07:33:04ID:???
>>673
お返事ありがとうございます.

つまり, 返って来るリストに {'.', '..'} は必ず含まれると解釈して良いのでしょうか ?
言い換えるとサーバーが異なるなどの条件の変化には左右されないと...
(これらが含まれることを前提することが bug の発生源になりうるか どうかが気掛かりなのです)
0675nobodyさん2010/02/15(月) 09:36:38ID:???
UNIXやWindowsなどのファイルシステムなら必ず含まれると思っていいよ
「.」はカレント(今いる)ディレクトリへのリンクファイルで
「..」はその親ディレクトリへのリンクファイル

含まれていようがなかろうがif文使えば条件の変化に左右されない書き方ができる
0676nobodyさん2010/02/15(月) 17:55:20ID:???
>>675
回答ありがとうございます.

>if文使えば
log0.tsv, ... , logN.tsv は 10 record (10行) ごとのデータファイル.
末尾のファイルが 10 rec 埋まるまでは追加記録の対象となります.
さらに この directory には他のファイルを追加することはありません.
したがって $n=@u とやって logN.tsv の個数だけ求まれば良いのです.

ところが予想と反した結果となったので調べて見ると "未知のファイル" がぁ〜.
UNIX では必ず存在するのなら 一安心です.
0677nobodyさん2010/02/15(月) 18:09:17ID:???
だったらgrep使って手っ取り早く
$n= grep(/^log\d+\.tsv$/, readdir(DIR));
0678nobodyさん2010/02/15(月) 18:46:35ID:???
>>677
なるほど, 勉強になります !
(そう言えば以前 grep() で迷ったことが...)
(/ / が " " と同様に展開解釈することを知ったのは最近のことです)
(思い違いかもしれませんが js では ' ' と同等かと...)

お蔭様で基本的な機能は ほぼ装備できたかと...
あとは bug-fix... (password check が おかしい w )
0679nobodyさん2010/02/15(月) 19:57:40ID:???
横の上に遅レス
この場合 // は正規表現であって、 "" の展開解釈とは全く別物。
677 氏のを丁寧に書くと、
grep( $_ =~ /^log\d+\.tsv$/, readdir(DIR));

ついでに grep { ! /^\./ } readdir DIR ; は、ほぼお約束。
0680nobodyさん2010/02/15(月) 21:12:43ID:???
>>679
>"" の展開解釈とは全く別物
たとえば
 $str='RegExps'; $re='RegExp';
と言う条件で
 1. $x=~s/$re//;
 2. $x=~s/RegExp//;
の両者は
 perl では等価とみなされるけれど,
 js では /$re/ 内の $re は単なる文字列と見なされる (思い違いかも ?)
と言いたかっただけで...

" " と / / とが同等な意味を持つとは思ってません.
それはさて置き, わざわざありがとうございます.
0681nobodyさん2010/02/15(月) 21:14:44ID:???
訂正: $x -> $str
0682nobodyさん2010/02/18(木) 07:19:57ID:???
Perlからプログラミングを初めてみようと思って初めてのPerlを借りてきた。
けど、いきなり専門用語ばかりで結構厳しい。
もう少し優しいところから解説してくれるPerlの参考書って無いですかね。
0683nobodyさん2010/02/18(木) 11:11:39ID:???
そりゃperl以前の勉強をしなきゃならんという事ではないか?
0684nobodyさん2010/02/18(木) 18:34:01ID:???
>>682
>いきなり専門用語ばかりで
取り合えず例を上げて見て.

他の言語の経験が全くないのなら
js などの client side script から始めた方がの方がお手軽.
(server side script に いきなり飛び付くのは無謀だと思う)
0685nobodyさん2010/02/18(木) 18:43:20ID:???
Perlはじめの一歩
読み終えたらこの本に感謝しつつすぐに初めてのPerlを読み直せばよい
06866142010/02/19(金) 20:19:59ID:h5oXbvl5
>>669
完全コピペではなく手打ちで部分を写していたので変数宣言を忘れていました。
本体スクリプトではしっかり宣言されています。
0687nobodyさん2010/02/19(金) 23:15:33ID:???
初めまして、初心者です、教えてください。
Windowsで、ActivePerl使っています。バージョンは、5.10.1です。
モジュールをダウンロードしようとしているのですが、
PPM(?)がうまくいきません。
該当箇所をクリックしても、直接コマンドを叩いても、再インストールしても無理でした。
どうか助けてください。
0688nobodyさん2010/02/19(金) 23:24:24ID:???
どううまく行かないのか教えてもらえないことには。
06896872010/02/19(金) 23:26:32ID:???
まz
06906872010/02/19(金) 23:28:21ID:???
まず、該当箇所をクリックした場合、そもそも立ちあがらないです。
直接コマンドを叩いた場合は、
ppm gui failed: DBI connect(' ……みたいなエラー表示が出ます。
0691nobodyさん2010/02/19(金) 23:44:05ID:???
5.8.9インストールしてるのに5.10.1インストールしたとかそんなことじゃないの?
06926872010/02/19(金) 23:45:46ID:???
どういうことですか?
どうしたら改善しますか?
0693nobodyさん2010/02/19(金) 23:53:01ID:???
OSから再インストール
0694nobodyさん2010/02/20(土) 03:43:43ID:???
ユーザー名にマルチバイト文字を使ってるんじゃね
名前を変えれば
0695nobodyさん2010/02/21(日) 02:09:28ID:JUU8in1a
Windows XP(Perl 5.8.8 build822)にImageMagickをインストールしたのですが、
実行あるいはバージョン確認しようとすると以下のようなエラーが出ます。
原因が分かる方いらっしゃいますでしょうか?

ちなみにインストールしたImageMagickは、ImageMagick-6.3.8-0-Q16-windows-dll.exe
インストールしたPerlMagickは、上記に付属しているPPD経由です。

[エラー内容]
C:\>perl -MImage::Magick -e 'print $Image::Magick::VERSION'
Can't load 'C:/usr/site/lib/auto/Image/Magick/Magick.dll' for module Image::Magick: load_file:再帰が深すぎます。スタックがオーバーフローしました。 at C:/usr/lib/DynaLoader.pm line 229. at -e line 0 Compilation failed in require.
BEGIN failed--compilation aborted.
0696nobodyさん2010/02/21(日) 11:20:54ID:???
C:\>perl -MImage::Magick -e "print $Image::Magick::VERSION"

こうじゃない?
0697nobodyさん2010/02/22(月) 04:19:02ID:???
build822 と ImageMagick-6.3.8-0 の対応は合ってるし何だろうね。

前スレで build822 の挙動はどうもあやしくないかという話があったし
別の build に変えてみたらどうだろ。
0698nobodyさん2010/02/22(月) 07:37:17ID:cIJ/BQEI
すいません。初心者です。
今、cgiファイルの何行目を読んでいるかというのを表示させたいのですが、
そういう関数とか方法があれば教えてもらえないでしょうか。
よろしくお願いします。
0699nobodyさん2010/02/22(月) 10:05:05ID:dMBZdRpE
sendmailで質問
ttp://search.cpan.org/dist/Mail-Sendmail/Sendmail.pmここの右にあるDownloadからとってきて
test.plを試してみたんですが、
Result: 250 OK id=******-******-AS
ok 2
と表示されるにもかかわらず。メールが届きません。

$mail{From} = 'Sendmail Test <********@provider.ne.jp>';
$mail{To} = 'Sendmail Test<********@hotmail.com>';
$server = 'localhost';

中身は↑のような感じで書き換えてます。
ちなみにmailtoのアドレスを全然存在しないものにしても同じResult:250 OKが表示されます。。
どこがおかしいんでしょうか。。。
0700nobodyさん2010/02/22(月) 10:34:57ID:???
Sendmail.pmって指定したSMTPサーバ直接叩く仕様だから
素のlocalhostじゃ届かないと思う。
0701nobodyさん2010/02/22(月) 10:36:42ID:???
maillog見れ
07026992010/02/22(月) 10:59:18ID:???

>>700
sendmailのインストールはperl -MCPAN -e shellからinstall Mail::Sendmaiでいれてます。

ていうか、SMTPサーバなしでもいけるのかと思ってました。。
プロバイダのsmtpサーバ設定したら認証エラーが帰ってきました。
たぶん、これで認証情報セットしてやればいけますよね。


>>701
/var/log/ mail.err、mail.info、mail.log、mail.warnにはびっくりしするぐらい一切なにもでてませんでした。
もしかしてperlのsendmailから出るログって他のとこだったりするんですか?
0703nobodyさん2010/02/22(月) 11:20:59ID:???
>>702
>>699 さんが書いてるように、SMTP を直接叩くって書いてるんだから、localhost のメール関連のログには一切残らないよ。

ローカルにメールのログを残したいなら、ローカルにメールサーバー立てて
そこから転送させるしか無いかと。
0704nobodyさん2010/02/22(月) 11:25:40ID:???
ん? sendmailとSendmail.pmって根本的に違うものだよ?
何の関連性もない。
0705nobodyさん2010/02/22(月) 11:29:38ID:???
たぶん何か勘違いしてるんじゃないかな?
Net::SMTP使うのが幸せの近道な気がする。
0706nobodyさん2010/02/22(月) 11:37:04ID:???
>>703
あのログファイルはsendmailが残してるわけじゃなくてSMTPサーバが吐くってことですか?
>>704
よくわからないですが、.cpan/buildのなかにあるtest.plで試してみてます。
ですが認証?でつまづいてるっぽくて
RCPT TO: error (554 5.7.1 <************@hotmail.com>: Recipient address rejected: Access denied)が消えません。

$server = 'smtpauth.eonet.ne.jp:587';
$mail{auth} = {user=>"アカウントID", password=>"パスワード", method=>"CRAM-MD5" };
をいれてやってみましたが、ずっと554です。
methodはPLAIN LOGIN CRAM-MD5も試してみましたがおなじでした。。
アカウントIDとパスワードに関しては別のメーラに設定してるものと同じ何で間違ってはいないと思います。

smtpサーバのEHLO localhostの結果は↓です。
250-ae0000-mailauth13.eo.k-opti.ad.jp
250-PIPELINING
250-SIZE 20000000
250-ETRN
250-AUTH PLAIN LOGIN CRAM-MD5
250-AUTH=PLAIN LOGIN CRAM-MD5
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
0707nobodyさん2010/02/22(月) 11:39:08ID:???
>>705
自分ではさっぱりです。。ブログツール(MT)からメールとばそうして今にいたります。
Net::SMTP一度調べてみます。
0708nobodyさん2010/02/22(月) 11:43:44ID:???
Mail::Sendmailじゃなく、sendmail使えるならそっち使え
0709nobodyさん2010/02/22(月) 12:30:01ID:???
cpanの起動の仕方が懐かし過ぎて泣いた
0710nobodyさん2010/02/22(月) 13:03:27ID:???
パール -蒸しパン -e シェル
0711nobodyさん2010/02/22(月) 20:01:01ID:???
>>683-685
遅くなって申し訳ないです。
参考になりました。とりあえずもうちょっとコンピュータの初歩的な知識を入れるところから始めます。
0712nobodyさん2010/02/26(金) 13:28:32ID:???
下記サイトの「添付ファイル付きメールを送信する」をコピペして
とりあえず動かしてみようとしたのですが、Undefined subroutineが返ってきました
ttp://www.stackasterisk.jp/tech/program/perl03_03.jsp

エラーメッセージは以下です
> Undefined subroutine &main::myCreateTextFunction called at test4.pl line 9.

おそらく「$attach_data = &myCreateTextFunction;」でサブルーチンが見つからないという事だと思いますが
ソースを追っても何が原因なのかよく分かりませんでした

こちらの環境は以下の通りです
WindowsXP Home
ActivePerl v5.10.1
sendmailの代わりに以下を導入しています

ttp://homepage1.nifty.com/yito/anhttpd/faq/sendmane.html

このプログラムの設定自体は正常です(コマンドラインからのテスト実行でメールは正しく受信出来ました)
ソース内のsendmailの記述(42行目あたり)も上記プログラムのパスに置き換えています
mimew.plとjcode.plはどちらもスクリプトと同じディレクトリに格納しています

何かヒントだけでも結構ですのでお願いします
0713nobodyさん2010/02/26(金) 16:35:26ID:???
>>712
sub myCreateTextFunction {} が本当にないからそのエラーが出るのは仕方ないね。
$attach_data に入れる値の用意ぐらい自分でしろということなんでしょう。

そこのサンプルは古風すぎるし Net::SMTP を使ってるサンプルで覚えるほうがいいよ。
0714nobodyさん2010/02/26(金) 18:46:59ID:???
そのリンク先の奴が、プロトタイプを全く理解して無い事だけは解ったw

後、2004年にその書き方をしてるってーのはどーよ…
http://www.stackasterisk.jp/tech/program/index.jsp;jsessionid=aPeJyFylGm44
07157122010/02/26(金) 19:28:45ID:???
>>713.714
回答感謝です
とりあえず自分の学習用にいじくるつもりだったのですが、
Net::SMTPにも注目したいと思います
0716nobodyさん2010/03/06(土) 17:25:20ID:???
任意のフォルダがあり、そこには常時ファイルが新規作成され続けるのですが
そのファイルを、作成されるのとほぼ同時に任意のメールアドレスへ送りたいです
メールへの送信はON/OFFを任意に切り替えられるようにしたいです

ちなみに、作成される日時などは完全にランダムで、全く作られない日が数日続く事もあれば
数分おきに作られ続ける事もあります
また、作成されたファイルが上書きされたりすることはありません
一度作られたらずっとそのままです
しかし、一度作られたファイルは後から削除されたりすることもあります

そういう事はPerlでは可能でしょうか?

ご意見をお願いします
0717nobodyさん2010/03/06(土) 17:27:58ID:???
ほぼ同時は無理だろ
ファイルを作るプログラムから呼び出せば別だが
0718nobodyさん2010/03/06(土) 20:58:00ID:???
1分間隔でよければcronと併用で。
もっと短い間隔だったらTime::HiResでミリ秒単位のウェイトをかけてループで監視。

くらいかな。
同時にしたけりゃファイルシステムにフックかける必要があるね。やりかたは知らん。
07197162010/03/07(日) 00:17:02ID:???
失礼しました
「ほぼ同時」は、「数分以内」と読み替えてください

あと、あれから検索してみたのですが、
File::Monitorというモジュールが目的に近そうだという事まで分かりました

ttp://search.cpan.org/~andya/File-Monitor-0.10/lib/File/Monitor.pm

どうやら、新規作成、削除、変更されたファイルやフォルダを検知できるようです
とりあえずこれをしばらくいじってみようと思います
0720nobodyさん2010/03/07(日) 14:03:50ID:???
そもそもどんなきっかけで作成されるんだ?
それが発火するタイミングにひっかければいいんじゃないか?
0721nobodyさん2010/03/07(日) 14:17:12ID:???
ループで回してりゃいいじゃない
■ このスレッドは過去ログ倉庫に格納されています