Perlについての質問箱 35箱目at TECH
Perlについての質問箱 35箱目 - 暇つぶし2ch237:デフォルトの名無しさん
08/05/26 22:17:11
>>234
if( -f /home/test/test.txt)
{
   $test = `cat /home/test/test.txt`;
}

238:デフォルトの名無しさん
08/05/26 22:57:43
普通

my $test = `cat /home/test/test.txt` if(-f /home/test/test.txt);

だろ

239:デフォルトの名無しさん
08/05/27 01:22:49
>>238
>>230


240:デフォルトの名無しさん
08/05/27 22:41:24
C言語のプラグラミングできたお。

void main(int argc, char**argv)
{
 system("cat /home/test/test.txt");
}

241:デフォルトの名無しさん
08/05/27 22:48:04
URLリンク(www.amazon.co.jp)

これが書かれた頃は perl など無かったが
まさに、system() 関数使いまくろう!的な内容。

242:デフォルトの名無しさん
08/05/28 00:33:29
cでやるとすごく損した気になるんだよなあ


243:デフォルトの名無しさん
08/05/28 18:50:42
perlでやっても損でしょ。
perlでできる処理はperlでできるだけやるべき。

catとか。

244:デフォルトの名無しさん
08/05/28 19:08:58
>>243
確かにそうなんだけど、catについてはそうかな~。

perl だったら、open,while,colose (またはread)とかで三段処理踏まないといけないから、
cat なんかは $test = `cat file.txt` なんかはよく使う。
実際どっちが早いとかBenchとったことはないけど・・・。

245:デフォルトの名無しさん
08/05/28 19:09:46
失敬、close間違い

246:デフォルトの名無しさん
08/05/28 19:12:39
かなり遅いよ、perlで外部コマンド実行したら。

相当な差がある。
コード的には段階踏んでるが。

247:デフォルトの名無しさん
08/05/28 19:20:10
一つ関数を書くか、CPANから探してきて使うだけでしょ

248:デフォルトの名無しさん
08/05/28 19:36:06
qxはforkしてshell起動して実行して・・・って感じなので
perlだけで終わらせたほうが圧倒的に早い

File::Slurp使うか、入れるのめんどくさかったら
sub slurp {open my $fh , $_[0] || die("$_[0]:$!");local $/;<$fh>}
って書いとけばOK


249:244
08/05/28 20:06:16
いやいや、そりゃあ自分も本格的な(?)スクリプト書く時や、
複数のファイルにループ処理する時はサブルーチンで書いたりするよ。

そうでなくて、ちょっとした確認とかで数行のスクリプトとか、
コマンドラインからのワンライナーみたいな感じで書く時には便利かな ってゆうぐらい。

そんな時にまで、いちいち、useやrequireやsub{}なんて書きたくないじゃん。

250:デフォルトの名無しさん
08/05/28 20:21:38
>>244
数行だとか、処理速度とか処理効率を考えなくていいなら便利。
あくまでコマンドレベルの用途ね。

ただ不明なのが、
>サブルーチンで書いたりする
ってとこ。

関係が不明なんだけど。

251:デフォルトの名無しさん
08/05/28 20:50:01
むっか~しは、sortは外部コマンドでやってたりしたもんだ。

環境やバージョンが変わったら、こまめにベンチマーク取って
最適の方法を探らないとね。

252:デフォルトの名無しさん
08/05/28 21:09:03
「cat を使う」
…ねえ。知ってると思うけど
$ cat > foo.pl
#!/usr/bin/env perl -n
print ;
}
{
print "foo\n" ;
# control + D をタイプ
$ perl foo.pl foo.pl foo.pl
$ perl -lne '}{ print $. ;' foo.pl



253:デフォルトの名無しさん
08/05/28 21:25:17
そいつは初耳だ
解説よろしく

254:デフォルトの名無しさん
08/05/28 21:46:36
>>253
optionに関しては perl -h するなりで
-n assume "while (<>) { ... }" loop around program
-p assume loop like -n but print line also, like sed
で実際の挙動を見るには
perl -MO=Deparse -ne 'print;'
この結果を見ると while ループで単純にかこってあるだけだから
ループの終りの「}」と無名ブロックの始まりの「{」を入れて
好きな様に処理させる。
応用すれば、「tsvの第二カラムの積算」なんてのは
perl -lane '$t += $F[1] ; }{ print $t ;' FILE

スクリプトファイルにしたときも同じ事。B::Deparse にて確認して。
perl -MO=Deparse foo.pl
あとはお好みに。これで手に負えない時とかstrict適用したい時は
普通に書きゃいいだけだし。


255:244
08/05/28 22:41:30
>>250
それは、>>247>>248に対するレスで、例えばopen();while(){うんたらかんたら・・・}close();を
一まとめにしたサブルーチンなんかに投げるってこと。

いや、スマン。244で速度のこととか言い出したんだけど、
自分が言いたかったことは、>>240-243までの流れで、ちょっとした処理(>>240とかw)を
わざわざCで書いたんなら、かなり損した気分になるのは大いに理解できるけど、
それをperlでやるのは、そんなに損した気にはならない、
ってゆうか、perlだからこそ、$nakami = `cat file.txt`;や@files = `find ・・・`;
みたいな事が手軽に出来る、ってのが、perlの大きな魅力の1つではないかと自分は思ってる。
ってことを言いたかった。

>>252
それはオレも初耳。
完全に理解しきれてないけど、色々応用が効きそうだ。

256:デフォルトの名無しさん
08/05/28 23:31:00
>>246
>>248
「かなり」 とか 「圧倒的に」 とか、ずいぶんアバウトだな。
そんなんじゃ全然説得力が無い。

たとえば、$a = `cat unko.txt` すると 0.1秒かかるとしよう。
open・read・close すると0.01秒しかかからないとしよう。
で?それが何なの?どうなのよ、って事だ。
えっ?10倍早いだって?
おいおい、0.1-0.01=0.09秒しか違わないんだよ。
たったの0.09秒の差を人間が感じ取れるとでも思うの?
アフォくさ。

257:デフォルトの名無しさん
08/05/28 23:34:30
>>256
whileかけるようになったらまたおいで。

258:デフォルトの名無しさん
08/05/29 00:09:41
>>256
一回だけ処理するならその程度で済むかもね。

259:デフォルトの名無しさん
08/05/29 00:29:53
svn より、cvs のほうがインストールの敷居は低いんじゃないかなぁ。
cvs のほうが依存するライブラリ少いし、FreeBSD なら最初から入ってるし。

260:デフォルトの名無しさん
08/05/29 00:42:12
俺はsubversion派だわ

って誤爆か

261:デフォルトの名無しさん
08/05/29 13:56:47
誤爆じゃないだろ。perldoc.jpの話じゃね?

262:デフォルトの名無しさん
08/05/29 15:29:41
my $message = "He is 5 years old\n";
$message =~ s/(\d+)/{ twice($1) }/e; #数字を検索して、2倍して置換
print $message;

これなのだけど
my $message = "He is 5 years old\n";
$message =~ s/(\d*)/{ twice($1) }/e; #数字を検索して、2倍して置換
print $message;

これじゃダメなのはなんで?

263:デフォルトの名無しさん
08/05/29 15:35:34
* は0回以上の繰り返しだから、先頭でマッチする。

264:デフォルトの名無しさん
08/05/29 18:45:13
(\d*)

全てが任意なので、全ての行で置換が行われることに

265:デフォルトの名無しさん
08/05/29 18:47:59
先頭つーか、全ての文字の間にマッチする。

266:265
08/05/29 18:48:46
\d\d*

でやってみ。

267:デフォルトの名無しさん
08/05/29 19:34:03
>>265
egじゃなくてeだから、この場合は先頭だけだろう。

268:デフォルトの名無しさん
08/05/29 21:48:26
お、eをgと見間違えたわ。

269:デフォルトの名無しさん
08/05/29 21:59:34
いーじーさんにつーれられーてー・・・
いや何でもない

270:デフォルトの名無しさん
08/05/29 22:23:27
逝っちゃった

271:デフォルトの名無しさん
08/05/29 23:56:31
横浜港 乙

272:デフォルトの名無しさん
08/05/30 03:29:45
港のヨ~(ry

273:デフォルトの名無しさん
08/05/31 19:56:52
cpan起動出来なくなりました。

#cpan
Unable to get Terminal Size. The TIOCGWINSZ ioctl didn't work.
The COLUMNS and LINES environment variables didn't work. The resize program didn't work.
at /usr/local/lib/perl5/site_perl/5.8.3/i386-freebsd/Term/ReadKey.pm line 362.
Compilation failed in require at /usr/local/lib/perl5/site_perl/5.8.3/Term/ReadLine/Perl.pm line 63.

とエラーが出ます。
恐らく、perlのバージョンアップした際に不具合が生じているのかと思うのですが・・・。
ネットで解決法を探すも情報がほとんどなく手がかりもつかめません。

perl v5.8.3
OS FreeBSD 4.2-R

助けて下さい。お願いします。

274:デフォルトの名無しさん
08/05/31 20:09:04
もっかいCPANインスコしなおせばいいじゃん

275:273
08/05/31 21:57:38

インストールしなおしてみましたが、ダメでした。
同じ症状です・・・。トホホ。

276:デフォルトの名無しさん
08/05/31 21:58:41
12 May 2008 20:15:40

2008/05/12 20:15:40
という風に返すモジュールないですか?



277:デフォルトの名無しさん
08/05/31 22:02:33
>>273
どこでおかしくなっているか明示されているんだから、
見てみればいいだけ。

278:デフォルトの名無しさん
08/05/31 22:19:44
>>276
use HTTP::Date qw(str2time time2iso)
print time2iso( str2time("12 May 2008 20:15:40") );

279:デフォルトの名無しさん
08/05/31 22:22:11
ああスラッシュ(/)か >>278 なし

280:デフォルトの名無しさん
08/05/31 22:27:06
>>276
Date::Manipかな。日付を扱うならDate::Calcとともに定番。

perl -MDate::Manip -e 'print UnixDate("12 May 2008 20:15:40", "%Y/%m/%d %H:%M:%S")'

281:276
08/06/01 00:57:56
>>278
>>280
280氏のDate::Manipで解決できました。ありがとうございました。


282:デフォルトの名無しさん
08/06/01 04:50:03
activeperl v5.10.0 built for MSWin32-x86-multi-thread
において

 GD v2.39
 GD::Graph v1.4308
 GD::Text v0.86





use GD;
use GD::Text;

use GD::Graph::bars;
my $graph = GD::Graph::bars->new( 800, 800 );
my $gd_text = GD::Text->new();
GD::Text->font_path( _______DIR______);
$gd_text->set_font(_______FONT______, 178) ;#or die $gd_text->error;
$graph->set_title_font(_______FONT______, 178 );


_______DIR______ = undef | '' | 何か意味のある値
_______FONT______ = undef | '' | 何か意味のある値

をWindowsXP SP2あるいはWindows2k SP1で実行したとき
どうもシステムのフォントを破壊?するようです


283:232
08/06/01 04:57:25
以下windows板に書いた物。

windows XP

起動してみると ”ようこそ”が明朝体になってて
ファイル名の全角空白までも文字化けしている状態になりました。

標準で恐らく第1水準漢字が表示できたりできなかったりするフォントが選択されているようです。
検索 -> 索 が表示できない
削除 -> 削 が表示できない
書き込む -> 込 が表示できない

またcmdで日本語が返ってくるような状態
>> c:\hoge\foo.bar (実際には存在しないファイル)
とかタイプすると ■■■■■ ■■■■と文字化けして
(ファイルが見つかりませんとかそんな感じのメッセージ)と返ってきます。

URLリンク(support.microsoft.com)
に従ってフォントキャッシュを消して再起動しても改善されませんでした。


Windows 2000 SP1では IE6の検索ウインドウに英字を入れるとイタリックに化ける
という共通してんだか共通してないんだかな現象が発生します。


232に書いたコードを実行したときに即に破壊するわけではなく、次回起動時から影響が出始めるので
何がどうなってるのかまったく分からない上に妙な分野にまたがった問題のために、
5時間戦って何にも戦果が上がらずもう疲れたのでとりあえずよし牛でも行ってからOS入れなおすことにしますた。

GD(GD::Textだと思うんだけど)使うときは気をつけてください。

284:282
08/06/01 05:17:28
すみません、 訂正 283 で s/232/282/g; で読んでください。
再現したくないのでぜんぜん検証ができないのですが
これはCPANの作者さんにも報告したほうがいいのでしょうか?

285:デフォルトの名無しさん
08/06/01 17:00:58
ヤフオクの管理をしようと思います

とりあえず出品リストを作ろうと思って、
URLリンク(openuser.auctions.yahoo.co.jp)
の内容の取得をしようと思っても、アダルト商品なので表示されません
クッキー周りだと思うのですが、うまくいきません
書いてみたのは下のようなもので、
yahoo_cookieにはadministrator@auctions.yahoo.co[2].txtの内容を
#LWP-Cookies-1.0
Set-Cookie3: YAUC_AV=.....
みたいな感じでコピーしてあります
どこが間違っているのでしょう

use LWP::UserAgent;
use HTTP::Request::Common;
use HTTP::Cookies;
use Encode;
$cookie_file = 'yahoo_cookie';
my $cookie_jar = HTTP::Cookies->new(file => $cookie_file, autosave => 1);
$ua = LWP::UserAgent->new;
$ua->cookie_jar($cookie_jar);
$req = GET "URLリンク(openuser.auctions.yahoo.co.jp)";
$res = $ua->request($req);
print $res->content;

286:デフォルトの名無しさん
08/06/01 17:12:13
どういう風にできないの?

287:デフォルトの名無しさん
08/06/01 23:15:25
要素に配列への参照か文字列を含んだ再帰的な配列を出力するプログラムを作ろうとしているのですが
ややこしくてついアイスに手を出してしまいます。
どうすれば幸せになれますか

my @a=(1,2,3);
my @b=qw(a b c);
my $c=[\@a,\@b];
my $aa=[1,2,3];
my $bb=[4,5,6];
my $cc=[\$aa,\$bb];
sub pr{
    my($depth,$ary_ref)=@_;
    if((ref $ary_ref) eq "ARRAY"){
        foreach (@$ary_ref){
            pr(($depth+1),$_)
        }
    }elsif(defined $$ary_ref){
        print $depth,":",$$ary_ref,"do something\n";
    }else{
        print "do nothing\n";
    }
}
pr $cc;
pr $c;


288:287
08/06/02 08:56:48
自己解凍しました。

289:デフォルトの名無しさん
08/06/02 11:07:13
書きたかっただけだろw

290:デフォルトの名無しさん
08/06/02 12:34:14
sendmailで受信したメールを、procmailからperlスクリプトを起動して処理しているのですが処理結果ない場合があります。
どこかでエラーが出て止まっていると思うのですが、エラー内容をファイルに出力できないでしょうか?
.procmailrcを

:0
|perl ./foo.pl 2>&1 > ~/out.txt

としてみましたがout.txtにはなにも出力されませんでした。(空ファイル)

291:デフォルトの名無しさん
08/06/02 12:44:59
Windows だとその書き方はダメで
perl ./foo.pl > ~/out.txt 2>&1
というふうに 2>&1 を後ろにもっていく必要がある。
Unix 系はどうか知らん。

292:デフォルトの名無しさん
08/06/02 12:55:40
2>&1は後ろに持っていくはず。
Unix系でも。

293:デフォルトの名無しさん
08/06/02 13:42:21
perl ./foo.pl 2> ~/out.txt

じゃだめだっけ?

294:デフォルトの名無しさん
08/06/02 14:45:45
>>290
リダイレクトは左から評価されるんで、順序に注意汁ってこったな

2>&1みたいのはイメージ的には $b = $a みたいな変数のコピー
>~/out.txtみたいなのは $a = "hoge" みたいな代入
と思っておけば、イメージ的にはほぼ間違い無い

$b = $a;
$a = "hoge";
とかやっても、$bは"hoge"にならないでしょ
逆順だと上手くいくけど

295:デフォルトの名無しさん
08/06/02 19:03:12
少しそれるが、この右からとか左からとかってのは結局のところ
対象の言語の実装がfastcallとかstdcallとかってことかね

296:290
08/06/02 19:33:01
>>291-294
ありがとうございます。解決しました。
perlじゃなくてshellの問題でしたね。すいません。
294氏のイメージは理解しやすかったです。


297:デフォルトの名無しさん
08/06/02 21:15:52
binmode(STDOUT);
と指定したものをテキストモードに戻すにはどうしたらよいでしょうか?

298:デフォルトの名無しさん
08/06/02 21:40:55
binmode(STDOUT, ":crlf");

perlfunc読めよ糞が

299:デフォルトの名無しさん
08/06/02 22:59:05
     ↑
キミ、後輩を育てられないタイプだね。

300:デフォルトの名無しさん
08/06/02 23:06:24
うん。自分でもそう思う。
でも、いまのところ自営業で後輩いないからなんとかなってる。

301:デフォルトの名無しさん
08/06/02 23:11:36
相手に糞とか言う輩は、殆どの場合己がそうだから。

302:デフォルトの名無しさん
08/06/02 23:31:02
相手をくそとか言う輩は,ほとんどの場合周囲からくそと言われてるから。

303:デフォルトの名無しさん
08/06/03 00:41:30
>>301
> 相手に糞とか言う輩は、殆どの場合己がそうだから。

調査不可能なことを断言する嘘つきの出現です。

304:デフォルトの名無しさん
08/06/03 02:06:42
断言してないような

305:デフォルトの名無しさん
08/06/03 02:30:56
質問してもいいでしょうか?
winxp sp2を使っていて、activeperlを入れています。

パソコンのボリュームの調整をするコードを書きたいのですが、
perlからでもそういうのはいじれるのでしょうか?

メイン音量・WAVE、あと、wmpなど音楽再生ソフトの音量もいじりたいです。
どこか参考になるサイトなどありますでしょうか?

306:デフォルトの名無しさん
08/06/03 03:48:25
なんでperlで?
VBでも使った方が良くね?

307:デフォルトの名無しさん
08/06/03 07:37:39
>>305
どうしてもPerlでやりたいなら、Win32APIをつかえば?
それ以上は、Perl関係ない。


308:デフォルトの名無しさん
08/06/03 17:03:21
use utf8;
binmode STDOUT, ':encoding(cp932)';

このコードを他のOS環境で使うためには
:encoding(cp932) を手作業で書き換えてもらってるんですが
自動取得することはできますか?
そのOSのデフォルトのコードページとかエンコードとかを
自動取得することは出来ますか?

309:デフォルトの名無しさん
08/06/03 17:32:59
>>308
「そのOSのデフォルトのコードページとかエンコードとか」というのが
そもそも不明。



310:デフォルトの名無しさん
08/06/03 18:18:44
>>308
OSごとにデフォで使われてる文字コードを完璧に判定することはできない。

同じ記述なら一括で置き換えればいいだけだし
共通する部分なら最初に開発した段階で
定数なり関数なり作ってそこに定義しておくべきだった。

311:デフォルトの名無しさん
08/06/03 19:03:49
>>308
OS名や環境変数で、ある程度は判別できるだろうね。


312:デフォルトの名無しさん
08/06/03 20:04:39
>>311
> OS名や環境変数で、ある程度は判別できるだろうね。

「そのOSのデフォルトのコードページとかエンコードとか」が存在するかどうか
とか、それを守っているのかとか、そもそも一貫性があるのかとか
はいちいち調べないとね。



313:デフォルトの名無しさん
08/06/03 20:21:42
出力の話なんだから環境変数LANGみて空ならCP932にするだけで
ほぼ解決しないかな?


314:デフォルトの名無しさん
08/06/03 21:48:18
中国とかフランスとかドイツの Windows って、環境変数 LANG に何て設定してあるの?

315:デフォルトの名無しさん
08/06/03 22:25:52
そもそもUNIX系OSには「OSのデフォルトのコードページとかエンコード」なんて概念自体無いわけだが。
LANGはOSのデフォじゃなくて、「その人が端末に表示したいエンコード」。
端末装置はユーザごとに異なるのが当たり前・・・というUNIXの基本を忘れてるよ。

んで、メンド臭いなら全部 UTF8 にしたら?
今時のWindowsのメモ帳ならUTF8開けるよ。

316:デフォルトの名無しさん
08/06/03 22:29:21
Unix環境なら
use open ":locale";
とかでよきに計らってくれるようだが
Win32だと良い方法はないかも

317:デフォルトの名無しさん
08/06/03 22:32:43
> use open ":locale";

これも駄目。
何故なら、プロセスの実行環境と、その出力を閲覧するユーザのlocaleが一致する保証は無いから。

318:デフォルトの名無しさん
08/06/03 22:36:41
>>317
それが「いい」か「だめ」かはケースバイケースでしょ。

それで少なくとも伝統的なUnixのI18N/L10Nプログラムと同じ動作にはなる。
Cでsetlocale(LC_CTYPE, "")するのとほぼ同じだから。

無論、設定ファイルや何かでオーバーライドできるようにすることが
望ましいけどね。

319:デフォルトの名無しさん
08/06/03 22:37:25
>>313
他国語版使ったこと無いから知らんけど、cp932が有効なのが
そもそも日本語版Windowsだけなんじゃないかな。

>>314
中国はbig5?(と思ったら、Windowsでは、GB2312(cp936)らしい??)
フランス等ラテン語件はlaten-1(ISO-8859-1)なんじゃね?(cpだと1252)

>>316
VCからなら、locale取得したり、変更したりする関数があったハズ。
Win32APIから叩けそうな気がするけど、どうなんだろ。

まあ、日本語環境のみで使用するってんなら、>>313でええかも。

320:305
08/06/03 23:32:11
>>306
CGIでPerlをかじりました。
実行ファイルにしてしまえば(自分のパソコンにはperl入ってるので不要ですが)Perlで問題ないと思いました。
Perlではwindowsを操作するようなプログラムはかけないなんてことはないと思ってたんですが。

特に簡単なのなら言語なんてほとんどなんでもいいのかと。

>>307
win32apiとやらを調べてみます。

321:デフォルトの名無しさん
08/06/04 01:36:05
>>315
UNIXのメモ帳で端末のエンコードが変更できるんですか?

エンコードの概念が無いなら、いったいどうやって漢字を表示するんでしょう?
テキストファイルをopenするのに、いったい何のコードでデコードすればいいんでしょう?

322:デフォルトの名無しさん
08/06/04 02:00:32
>>321
> UNIXのメモ帳で端末のエンコードが変更できるんですか?

「UNIXのメモ帳」という謎の概念が提示されました。



323:デフォルトの名無しさん
08/06/04 02:01:13
viとemacsの戦い

324:デフォルトの名無しさん
08/06/04 02:02:10
ああ、いるんだよ。別なOSを「別なWindows」だと思ってるやつ。

325:デフォルトの名無しさん
08/06/04 02:08:47
しばらく俺の雇用は安泰だな

326:デフォルトの名無しさん
08/06/04 04:11:02
まあ、確かにメモ帳ライクな外見&操作を意識したテキストエディタはあるけどな。
それならUNIXのメモ帳と言っても何ら差し支えは……。

327:デフォルトの名無しさん
08/06/04 05:04:24
>>322
> > UNIXのメモ帳で端末のエンコードが変更できるんですか?

これ全体が謎なんだな。

328:デフォルトの名無しさん
08/06/04 07:03:52
>>320
Perlもモジュールだなんだでいろいろ出来るようにはなったけど
基本はテキスト処理をするための言語だぜ?

ちょっとじかじったくらいなんだったら
それに適した言語をかじり直したほうがたぶん早いよ


329:デフォルトの名無しさん
08/06/04 08:25:15
>>320
win32apiをPerlから使うのは結構面倒なので、場合によるだろうけど、>>305をみると、Perlでコーディングする意味はないと思う。
やってで気ないことはないけど、適材適所ってヤツがある。
VBだと金がかかるという場合、もしVista使ってるならサイドバーガジェットという選択肢もあるかな。


330:デフォルトの名無しさん
08/06/04 10:48:24
>>319
ちょっとやってみた感じだと、ActivePerlでもPOSIXモジュールのsetlocale()は
機能する模様(実際にはMSVCRTのsetlocale()を呼んでいるのだろう)

use POSIX qw(locale_h)
$old_locale = setlocale(LC_CTYPE, "");
とかやると、Japanese_Japan.932とかいう文字列が帰ってくる。
.の後ろがコードページのはず。

cygwinみたいにロケールが完全に腐ってる環境ではどうしようもないけどな。


331:デフォルトの名無しさん
08/06/05 00:25:55
>>323
おーっと、ここで 「ed・はるみ」 が乱入w

332:デフォルトの名無しさん
08/06/05 05:42:10
帰れカス

333:デフォルトの名無しさん
08/06/05 10:17:09
Kwaliteeってなんですか?

334:デフォルトの名無しさん
08/06/05 15:09:00
$ ed
hello, world
?
help
?
quit
?
exit
?
q
?
?
?
--help
?
-help
?
fuck
?


335:デフォルトの名無しさん
08/06/05 16:18:29
ワロた

336:デフォルトの名無しさん
08/06/05 20:11:12
open FILE, '<:utf8', "unko.txt";
read FILE, my $content, (stat FILE)[7];
close FILE;

この (stat FILE)[7] の部分が、見た目が汚く感じるんですが
もっと美しい書き方はありませんか?
read FILE, my $content, 9999999999; とか、死んでもイヤです。
どっかのクソ言語の ReadAll メソッドみたいなのが欲しいです。

337:デフォルトの名無しさん
08/06/05 20:13:08
open my $file, '<:utf8', "unko.txt";
my $content = do{local $/; readline $file}
close $file;

338:デフォルトの名無しさん
08/06/05 21:12:54
-s FILE

339:デフォルトの名無しさん
08/06/05 21:16:32
>>336
っ[File::Slurp]

340:デフォルトの名無しさん
08/06/06 00:13:26
my $content = join("",<FILE>);

341:デフォルトの名無しさん
08/06/06 00:39:53
>>338
そっか、それがあったか。それ使わせてもらいます。感謝感謝。
あとの残りはクズですね。

342:デフォルトの名無しさん
08/06/06 00:46:36
全部読むなら$/をクリアするのが常套手段だろ。

343:デフォルトの名無しさん
08/06/06 00:59:50

OBJS = ${CSRC:.c=r30}

.c.r30:
${CC} $<

Makefile中の$<をPerlを使って置換してCCに渡すことは可能でしょうか?

$<に含まれているスラッシュを\\に置き換えるために
$< =~ s|/|\\\\|g
このような置換を行いたいです。
環境はCygwinPerl5.8.8です。

344:デフォルトの名無しさん
08/06/06 01:00:03
>>341
どうやって使うの?

345:デフォルトの名無しさん
08/06/06 01:11:15
sub write {
 ($fileName, $text) = @_;
 open(FH, "+>$fileName");
 print FH $text;
 close(FH);
}

こんな感じでファイルを出力するコード書いたのですが、
サブルーチン経由だとなぜか動きません
サブルーチンなしだと正しくファイルが書き出されました
なにがおかしいのでしょうか

346:デフォルトの名無しさん
08/06/06 01:21:24
writeという標準関数があるから

347:デフォルトの名無しさん
08/06/06 01:52:38
>>346
writeという標準関数の存在しりませんでしたが
今回はなぜこのコードが動かないかについてよろしくお願いします

というのも、同じ仕様(関数名,引数,戻り値)を複数の言語で記述してみてるだけなのです


348:デフォルトの名無しさん
08/06/06 02:11:42
組み込み関数を再定義するためにはお作法がある。writeが再定義可能かは知らん。
perlsub読むか、親切に解説してくれるおせっかいが通りかかるのをまて。

349:デフォルトの名無しさん
08/06/06 02:23:57
あ、なるほど そういう意味でしたか
文法自体はあってるんですね
ありがとうございます

350:デフォルトの名無しさん
08/06/06 02:35:57
&writeでもだめなのかな。

351:デフォルトの名無しさん
08/06/06 08:19:33
>>349
ほかにどういう意味だと思ったんだ?

352:デフォルトの名無しさん
08/06/06 08:22:01
>>343
makeのsubstやpatsubst関数じゃだめ?



353:デフォルトの名無しさん
08/06/06 08:33:28
perlを始めたばかりなのですが、
foreachやwhile等で、何回目のループかをカウントしているような
変数は無いでしょうか?
自前で用意すればいいだけなのですが、そのような変数が無いかと思い
質問させて頂きます。

354:デフォルトの名無しさん
08/06/06 11:20:21
あったとしても、時前で用意した方が他の人も読み易いんじゃないかな。

355:デフォルトの名無しさん
08/06/06 11:57:16
そういえば、不精なPerlのハッカーたちは、foreachを使わずに全てforを使う……だなんて
どこかに書かれてたような気がするけど、実際どう?

自分は使い分けてる。

356:デフォルトの名無しさん
08/06/06 12:02:27
自分は for かな後ろ見りゃわかるし。
foreach で (;;) とかやらなきゃどっちでも良いとは思う。



357:デフォルトの名無しさん
08/06/06 12:08:14
forもforeachも一緒じゃないの?ただのシンタックスシュガーかと思ってたけど

358:デフォルトの名無しさん
08/06/06 12:17:35
>>357 それを前提として書いたつもり。

a) for my $n (0..9) {}
b) foreach (my $n=0; $n<10; $n++) {}

a は許容できるが、b は嫌かなってこと。






359:デフォルトの名無しさん
08/06/06 12:21:56
for しか使わね。それと、C type の for は使わね。

360:デフォルトの名無しさん
08/06/06 12:29:16
俺も同じくforのみ

361:デフォルトの名無しさん
08/06/06 13:32:56
どうでもいい。
んで、暗黙のループカウンタなんてあったら言語仕様としてきもい

362:デフォルトの名無しさん
08/06/06 15:39:58
C言語の const 変数の様なのは定義できないでしょうか? perl 5.8です。

363:356
08/06/06 16:14:23
んー、やっぱforだけとかの人のほうが多いのね。
まさにPerlスタイル。

>362
use constantとかはー?


364:デフォルトの名無しさん
08/06/06 17:02:47
use Readonly ;
>>361
$. は?w


365:デフォルトの名無しさん
08/06/06 17:07:46
つまりキモイってことですよPerlはw

366:デフォルトの名無しさん
08/06/06 17:19:32
柔軟な頭を持ってない奴が負け惜しみを言ってますw

367:デフォルトの名無しさん
08/06/06 17:23:44
ゴミを美味いと思う自分の狂った味覚を「柔軟さ」と主張する人生ですかw

368:デフォルトの名無しさん
08/06/06 17:31:57
君がゴミだと思って捨てていた部分は実は高値で取引される珍味でした。


369:デフォルトの名無しさん
08/06/06 17:56:23
>>362
Cライクにやりたいなら
use constant NAME => 'hoge';

ただし Perlでベアワードはメンドくさい。
"my name is NAME"
とやっても展開されないから
"my name is ".NAME
とするしかない。

*NAME = \'hone';
これを使えば
"my name is $NAME"
で展開できる。

*C_STR = \'xxxx'; # 文字列定数。参照は $C_STR
*C_NUM = \100; # 数値定数。参照は $C_NUM
*C_ARRY = [1,2,3]; # 配列定数。参照は @C_ARRY
*C_ASSOC = {k1 => v1,k2 => v2}; # ハッシュ定数。参照は %C_ASSOC

370:デフォルトの名無しさん
08/06/06 18:04:39
>>368
まぁ、珍の字はニュアンスぴったりだと思うよ。
Perlの仕様を漢字一字で表せといったら、珍・奇・醜・糞あたりが有力だろうし。

371:デフォルトの名無しさん
08/06/06 18:44:43
forは数値カウンタのときやCライクな使い方のとき。
配列から読み取るってときはforeachにしてるな。こっちはPHPぽい方で

372:デフォルトの名無しさん
08/06/06 18:45:22
>>370
あれ?なんでわざわざこのスレに?

373:デフォルトの名無しさん
08/06/06 18:50:29
・上にあがってるから
・Perlを盲目的に全肯定するキチガイだけが住人ではないから

374:デフォルトの名無しさん
08/06/06 19:03:32
誰も全肯定なんてしとらんがな・・・

375:デフォルトの名無しさん
08/06/06 19:41:58
それを言ったら、誰も負け惜しみなんて言ってないよな。

376:デフォルトの名無しさん
08/06/06 20:34:35
>>373
ゲテモノだってのは認識しとる。

377:デフォルトの名無しさん
08/06/06 21:41:28
>>352
レスありがとうございます。
substを使ってうまくいきました。
ありがとうございました。

378:デフォルトの名無しさん
08/06/06 22:15:29 BE:477576296-DIA(100004)
まず匿名の臆病者は自分の (好きな|メインの) Lightweight Language を言えよ

379:デフォルトの名無しさん
08/06/06 22:52:56
BER圧縮された数値(オフセット値、ID)のビット列に対し、
二分探索法を行なっている実装例ってありませんかね?

380:デフォルトの名無しさん
08/06/07 01:02:59
そういうのはCでやった方が

381:デフォルトの名無しさん
08/06/07 14:17:18
>>378
できるよ。
以上。
↓次どうぞ

382:デフォルトの名無しさん
08/06/08 00:21:35
↑おつかれさまでした

383:デフォルトの名無しさん
08/06/08 19:02:55
他のファイルに変数を設定したファイルを用意し、
そのファイルを読み込み設定された変数を利用したいのですが、
どのようにすれば実現できますか?

384:デフォルトの名無しさん
08/06/08 19:05:01
そのようにすれば

385:デフォルトの名無しさん
08/06/08 19:13:01
そういうふうにプログラムすりゃいいでしょ

386:383
08/06/08 19:14:47
すみません。
サンプルコードなど頂けませんでしょうか?

387:デフォルトの名無しさん
08/06/08 19:16:05
do "configs";

388:デフォルトの名無しさん
08/06/08 19:17:30
D'OH !

389:383
08/06/08 19:19:09
reqireでできました。

阿呆しか答えてくれないので、聞く手間をかけずに調べれば良かったですね。

390:デフォルトの名無しさん
08/06/08 19:26:32
reqireなんてあったか?

391:383
08/06/08 19:26:33
>>389は私ではありません。
requireも試してみたのですが、変数の値が継承されないようで
うまくできませんでした。

>>387
ありがとうございます。
試してみたのですが、requireと同じように変数の値が継承されません。
doと言うものを調べたのですが、while文のdoしかなかなか見付からず
使い方が悪いのかも知れません。
すみませんが詳しく教えて頂けるとありがたいです。


392:デフォルトの名無しさん
08/06/08 19:28:41
まず自分で調べる手間をかけずにいきなり聞くという方法で何か学ぼうとするのもなんだかなあ…。
何かを知ろう学ぼうとするなら知る学ぶ為の正しい手段を取るべきだと思うけどなあ…。

393:デフォルトの名無しさん
08/06/08 19:42:06
>>391
perlfunc嫁

394:デフォルトの名無しさん
08/06/08 19:49:07
何ができないと言っているのかがわからない

395:デフォルトの名無しさん
08/06/08 19:59:13
1行ずつ読み込んでdoじゃだめなわけ?

396:デフォルトの名無しさん
08/06/08 20:18:32
doはファイル名を引数に取るわけだが

397:デフォルトの名無しさん
08/06/08 22:03:27
open FILE, "unko.pl";
read FILE, my $unko, -s FILE;
close FILE;
eval $unko;

398:デフォルトの名無しさん
08/06/08 22:04:06
それならdoでいいだろ。

399:デフォルトの名無しさん
08/06/08 22:32:17
関係ないけど do-dai っていい曲だよね

400:デフォルトの名無しさん
08/06/09 01:10:43
WinXP、perl5.8.8、でPerl/Tkからボタンを押した時にthreadsを使ってバックグラウンド処理をしようと考えています。
バックグラウンド処理そのものは最後まで実行されますが、終了同期を取ろうとjoinを呼び出した時に、クラッシュして更に、Free from wrong pool during global…
となります。

これを回避出来た猛者はいますか?



401:有吉 ◆01z1p9gzeo
08/06/09 01:43:25
子プロセスから親プロセスのTkウィジェットにアクセスするとactiveperlが落ちてしまいます。
$top = MainWindow->new();
$frame1=$top->Frame(-height=>25)->pack(-side=>top,-fill=>'x',-expand=>'no');
$listbox1 = $frame1->Scrolled('Listbox',-scrollbars=>'osoe')->pack(-fill=>'both',-expand=>'yes');
$listbox1_ref = \$listbox1;
if ($pid = fork()) { MainLoop; }
else { &refresh($listbox1_ref); }
sub refresh {
my $listbox1_ref = shift;
$$listbox1_ref->delete(0,'end');
opendir(DIR,'mail/');
@file = sort readdir(DIR);
@file = grep(!/^\.\.|^\./,@file);
foreach(@file) {
my $time = localtime((stat "mail/$_")[9]);
$$listbox1_ref->insert('end',$time);
}
}
ログには
Free to wrong pool 1ec5020 not 274dc8 at C:/Perl/site/lib/Tk.pm line 250.
と出て終わってるようです。refreshの処理中に落ちてるみたいです。
ググったところ、同じ症状の方もいるようですがこの場合の解決策が見つかりませんでした。
子プロセスから親プロセスのウィジェットにはアクセスできないのでしょうか?ご教授ください。OSはWinXP SP2です。

402:デフォルトの名無しさん
08/06/09 01:44:44
改行が多すぎると怒られたので
色々はしょったら読みづらくなりました。
大変申し訳ないです。。

403:デフォルトの名無しさん
08/06/09 11:00:13
>>398
キミ、シロウトだね。

404: ̄ ̄ ̄ ̄ ̄V ̄ ̄ ̄ ̄ ̄ ̄ ̄
08/06/09 11:09:09
        ,. -ー冖'⌒'ー-、
       ,ノ         \
       / ,r‐へへく⌒'¬、  ヽ
       {ノ へ.._、 ,,/~`  〉  }    ,r=-、
      /ク ̄`y'¨Y´ ̄ヽ―}j=く    /,ミ=/
    ノ /ル'>-〈_ュ`ー‐'  リ,イ}    〃 /
   / _勺 ミ;;∵r;==、、∴'∵; シ    〃 /
  ,/ └' ノ \   こ¨`    ノ{ー--、〃__/
  人__/ー┬ 个-、__,,.. ‐'´ 〃`ァーァー\
. /   |/ |::::::|、       〃 /:::::/    ヽ
/   |   |::::::|\、_________/'   /:::::/〃

405:383
08/06/09 11:24:22
すみません。私の書き込みが悪いとおもうので、再度書き込ませていただきます。

-- define.pl ------
my $hoge = "hoge";

-- body.pl ------
do "define.pl";
print $hoge;

というファイルがあったとしても、body.plでdefine.plの変数が使えません。
どのようにすれば、他のファイルの変数を使えるようになりますか?

406:デフォルトの名無しさん
08/06/09 11:33:56
myしてやがる……

407:デフォルトの名無しさん
08/06/09 11:39:48
>>405
なんというオチ

408:デフォルトの名無しさん
08/06/09 12:31:41
いぢわるしねいで、ちゃんと教えてやれよ。
my じゃなく、 our で宣言しろって事だよ。

409:383
08/06/09 13:03:46
そんなのがあったのですね・・。
簡単に本を読んだのですが、myとlocalがあってmyを普通使う。localはあまり使わない。
という説明でした・・。

リャマ本というのを簡単に確認したのですが。ourって載ってます?
見つけられなかったのですが。

410:383
08/06/09 13:04:12
お礼を言い忘れました。

お手数をおかけしてすみませんでした。
ありがとうございました。

411:デフォルトの名無しさん
08/06/09 13:22:51
最初から405かいときゃ無駄なレスしなくていいのに
jこれだから小出しするやつはうぜぇ

412:デフォルトの名無しさん
08/06/09 13:38:55
>>409
アルパカ本に載ってる。

413:273
08/06/09 13:41:12
>>273

自己レス
いろいろと遠回りしたけど、ReadKey.pm入れ直しで
スンナリ解決しました。

ハァ・・・、なんですぐにやらなかったのか。
自己嫌悪だわ。
何時間費やしとんねん!


414:デフォルトの名無しさん
08/06/09 13:43:11
>>410
こんな感じ↓
URLリンク(blog.livedoor.jp)

415:デフォルトの名無しさん
08/06/09 13:46:16
思うんだけど,この業界の人って,自分で調べたことに対して疑問を抱いた!みたいな
感じでブログとかに書いておくと,すげえ補足を書いてくれたりするよね。

俺はそういうところが好きだ。

416:デフォルトの名無しさん
08/06/09 13:48:00
質問です。Perlでクラスを使ってみたいのですが
どのように書けばいいのでしょうか?
知らない用語ばかり出てきて、さっぱり答えにたどり着きません。。

例としてPHP版で書きます。これと同等の機能をPerlで書いてください。
お願いします。

class Hoge {
 private $var1 = 'A';

 function var1() {
  return $this->var1;
 }

 function getValue() {
  return 1;
 }
}

class Hage extends Hoge {
 function getValue() {
  return 2;
 }
}

$hogehoge = new Hoge();
print $hogehoge->getValue();
$hagehage = new Hage();
print $hagehage->getValue();


417:デフォルトの名無しさん
08/06/09 14:10:53
#!/usr/bin/perl
use strict;
use warnings;
{   package Hoge;
    sub new {
        my $class = shift;
        my $self = {var1 => "A"};
        bless $self, $class;
        return $self;
    }
    sub var1 {
        my $self = shift;
        return $self->{var1};
    }
    sub getValue {
        my $self = shift;
        return 1;
    }
}
{   package Hage;
    use base qw(Hoge);
    sub getValue {
        my $self = shift;
        return 2;
    }
}
my $hogehoge = Hoge->new();
print $hogehoge->getValue(), "\n";
my $hagehage = Hage->new();
print $hagehage->getValue(), "\n";

418:デフォルトの名無しさん
08/06/09 14:41:00
>>416
一度perltootをキチンと読んでみては?
和訳↓
URLリンク(perldoc.jp)

419:デフォルトの名無しさん
08/06/09 15:35:06
./にローカルインストールしたモジュールを使うことができません。
使おうとしているものはCurses.pm
URLリンク(search.cpan.org)
です。もしよろしければご教授ください。

$ ls
Curses.pm* test.pl*
$ cat test.pl
#!perl
unshift @INC, ".";
use Curses;
exit;
$ perl -w test.pl
Can't locate loadable object for module Curses in @INC (@INC contains: 略 .) at test.pl line 4
Compilation failed in require at test.pl line 4.
BEGIN failed--compilation aborted at test.pl line 4.
$



420:デフォルトの名無しさん
08/06/09 15:48:35
use lib '.';

421:デフォルトの名無しさん
08/06/09 15:54:07
ba5.txtには以下になってます。
4131048
4131053
x
x
4850328
x
x
x
x
3870357
3870369
x
x
4131038
4131045
x
x
x
この場合にxの行を一番最後の行の数値に置き換えたい場合
perlだとどのようにすればいいんでしょうか。
シェルでやろうとしたんですけどシェルだとちょっと難しいみたいなので
perlでやりたいと思ってます。誰かいいスクリプトを教えて下さい。
宜しくお願いします。

422:デフォルトの名無しさん
08/06/09 16:07:39
>>420
use lib '.'やuse lib qw(.)を試してはいるんですが、>>419と同じエラーが出てしまいます。
また、use Curses;をuse ::Curses;として実行すると、>>419のCompilation failed in require at test.pl line 4.が消え、
Can't locate loadable object for module CursesもCan't locate /Curses.pmと表記が変わります。

423:デフォルトの名無しさん
08/06/09 16:51:43
>>419
本当にCurcesモジュールをインストールしたのか?
Curses.pmをコピーしただけじゃないのか?




424:デフォルトの名無しさん
08/06/09 16:52:54
>>417
ありがとうございます。

継承するときは、
use base qw(Hoge);
なんて書くんですね。

sub newってなんなんでしょう?
なんでそんな関数が必要なのですか?

425:デフォルトの名無しさん
08/06/09 16:55:17
>>423
>コピーしただけ
はい。アクセス権の関係でインストールが出来ないので、
test.plと同じディレクトリにCurses.pmを配置し利用したいと思っています。

426:デフォルトの名無しさん
08/06/09 16:59:36
>>425
だから、Cursesモジュールは、C言語で書かれたバイナリがメインで、
Curses.pmはそのインターフェイスでしかない。
ちゃんとコンパイルしてインストールしないとだめ。
エラーメッセージにある "loadable object" っていうのがそれ。

アクセス権の関係ってどういうこと? インストール過程で、
インストール先を指定できるぞ。
コンパイラも使えないのか?


427:デフォルトの名無しさん
08/06/09 17:00:37
>>424
コンストラクタ

不精しないできちんとperltootを読め。
>>418

428:デフォルトの名無しさん
08/06/09 17:03:00
>>421
聊かエスパーぎみにレス。↓こういう事がしたいのか?
$ perl -pe '$_=$t if/^x/; $t=$_' ba5.txt
4131048
4131053
4131053
4131053
4850328
4850328
4850328
4850328
4850328
3870357
3870369
3870369
3870369
4131038
4131045
4131045
4131045
4131045


429:421
08/06/09 17:16:09
>>428さん
そのとおりです!
ありがとうございます!

430:デフォルトの名無しさん
08/06/09 17:17:17
>>426
ありがとうございます。何か大きな勘違いをしていたようです。
Cの方でcurses/ncursesを使っていたので、システム上にcurses環境があると救いようの無いいい加減な誤認があり、
また、@INCサーチパス上にCurses.pmを置くことが出来ないのでアクセス権という的外れも甚だしい話をしてしまいました。
現在make中です。今のところエラーは吐いていません。

wget URLリンク(search.cpan.org)
tar xvf Curses-1.23.tgz
cd Curses-1.23
#Makefileの生成
perl Makefile.PL GEN PANELS MENUS FORMS
#コンパイル
make

431:デフォルトの名無しさん
08/06/09 17:28:19
>>427
コンストラクタなんですか?

普通、コンストラクタは必要がある場合を除いて
書かないと思うのですが?

書かないとまずいですか?

432:デフォルトの名無しさん
08/06/09 18:16:16
釣れますか?

433:デフォルトの名無しさん
08/06/09 18:24:44
>>427
初心者には perltoot を読むのを薦めるよりも
perlboot を読むのを薦めた方が良いと思うよ
なんとなく読む気が無さそうな気配ではあるけども
5.8 なら以前どこかで perlboot の邦訳も見掛けたた気がするけど

434:デフォルトの名無しさん
08/06/09 19:43:23
>>428
すげー。そういう意味だったのか。
そこまで読めなかったよ。

435:デフォルトの名無しさん
08/06/10 01:30:01
5.005の頃、よくXS書いてたんだけど
その後、Perlはワンライナーでしか使わなくなってしまった。
その頃のXSの知識ってまだ使えるのかな。

436:デフォルトの名無しさん
08/06/10 03:06:37
URLリンク(oshiete1.goo.ne.jp)

437:デフォルトの名無しさん
08/06/10 04:02:57
おや、なんだかどこかで見たような……。

438:デフォルトの名無しさん
08/06/10 11:24:14
マルチ死ねよwwwwwwwwww

439:デフォルトの名無しさん
08/06/10 12:02:49
HTML::FillInForm を使用しているのですが、出力されるhtmlから
DOCTYPE 宣言が消えてしまいます。
対処法がありましたら教えて下さい。


440:439
08/06/10 13:58:23
ここ(↓)を参考にして自己解決しました。
URLリンク(www.geocities.co.jp)

use HTML::FillInForm;
use base qw(HTML::FillInForm);

sub comment {
my($self, $text) = @_;
$self->{output} .= "<!--$text-->";
}

sub declation {
my($self, $text) = @_;
$self->{output} .= "<!$text>";
}

441:439
08/06/10 14:05:33
>>440
× sub declation {
○ sub declaration {

442:デフォルトの名無しさん
08/06/11 15:39:31
ロード済みのサブルーチンと同じpackageかつ同じ名前のサブルーチンを含む外部plファイルを
requireすると、後の内容で上書きされてしまいますが、元のサブルーチンを壊さないですむ
方法はないでしょうか。

443:デフォルトの名無しさん
08/06/11 18:07:18

皆さん、エスパーでよろ。

意図した挙動にならず、どこが問題かのきっかけも掴めずにかなり時間をかけてしまったが、
ようやくやりたいこと出来た。が、どうにも腑に落ちない。
DB(mysql)からデータとってきて、Scraperに渡して・・・と、こんな感じで組んでいたんだけど、

レコード数は3とします。


パターン1------------------------------------

$rows = $sth->rows;
print "hajimari";

while(my $ref=$sth->fetchrow_hashref()){
$scraper->scrape($ref->{url});
print "roop dayo";
}

print "owari";

このような感じでやっていたんだが、ループが1回しか回らない!?なんで?
てなことで、webで情報あさったり、モジュールのソース眺めてもわからんし。



444:デフォルトの名無しさん
08/06/11 18:07:56

パターン2------------------------------------

$rows = $sth->rows;
print "hajimari";

while(my $ref=$sth->fetchrow_hashref()){
print "roop dayo";
}

print "owari";

と、Scraperになげなかったら、ちゃんと3回ループするんだよね。
でScraperでこけてんのかと思いきや、これも特に見当たんない。
問題なさそうだ・・・。


445:デフォルトの名無しさん
08/06/11 18:08:25

パターン3------------------------------------

$rows = $sth->rows;
print "hajimari";
$i = 0;

while(my $ref=$sth->fetchrow_hashref()){
$url[$z] = $ref->{url};
$i++;
}

for($z = 0;$z < $rows;$z++){
$scraper->scrape($url[$z]);
}

print "owari";

ちょいと思うところがあり、一旦配列にほりこんでみる・・・。
キター!!!3回まわったじゃんか!


ふむ、思うところというのは、Scraperでこけないでループ1週目は
ちゃんとループしているということ。
で、結局ちゃんとした原因が解ってないんだけど、メモリ制限とか
あるのかな?

アドバイス下さい。
(もしかしたら、CGIまわりの問題?)
OS:FreeBSD
Perl:5.8.3

446:デフォルトの名無しさん
08/06/11 18:44:14
デバッグしろよ

447:デフォルトの名無しさん
08/06/11 18:47:02
またきたのか

448:デフォルトの名無しさん
08/06/11 18:48:59
Dump吐いてみたら?

449:デフォルトの名無しさん
08/06/11 18:52:18
内部状態をインスペクトしたら

450:デフォルトの名無しさん
08/06/11 18:56:50
printf だ! printf を挟め!

451:デフォルトの名無しさん
08/06/11 18:59:07
if(!$hoge->{'hoged'}){
    $hoge->{'hoged'} = [];
}

push(@{$hoge->{'hoged'}}, $hoging);

これをスマートに書く方法ありませんか?
ちなみに$hogingは2箇所以上に書くなら一時変数必要です。

452:デフォルトの名無しさん
08/06/11 19:04:06
少し説明がヘタだとは思いますが以下の処理をしたいです。お願いします。
★処理の方法
行の先頭が [ の場合には、行の先頭が 20 の行の先頭にそれを加える
行の先頭が 空白の場合には一旦処理を終えて再度行の先頭の [ を読む
行の先頭に < がきた場合にはその処理を終えて再度行の先頭の [ を読む
結合した場合、その文字列の最後に必ず区切り文字としてタブを挟む
●処理前のabc.txt
<100100>
[1044]あいうえお
20321 1137 4850328 60
20321 1137 4850328 60
20321 1137 4850328 60
   【合計1044】
[1047]かきくけこ
20319 1090 3870357
20319 1101 3870369
   【合計1047】
[1051]さしすせそ
20328 1206 4131038 52
20328 1206 4131045 52
20328 1206 4131045 52
    【合計1047】    
    【累計】
<100200>
[1057]たちつてと
20328 1206 4131045 52
20328 1206 4131045 52 

453:デフォルトの名無しさん
08/06/11 19:04:54
●処理後のabc.txt
<100100>
[1044]あいうえお 20321 1137 4850328 60
[1044]あいうえお 20321 1137 4850328 60
[1044]あいうえお 20321 1137 4850328 60
   【合計1044】
[1047]かきくけこ 20319 1090 3870357
[1047]かきくけこ 20319 1101 3870369
   【合計1047】
[1051]さしすせそ 20328 1206 4131038 52
[1051]さしすせそ 20328 1206 4131045 52
[1051]さしすせそ 20328 1206 4131045 52
    【合計1047】    
    【累計】
<100200>
[1057]たちつてと 20328 1206 4131045 52
[1057]たちつてと 20328 1206 4131045 52

どうかよろしくお願いします。

454:デフォルトの名無しさん
08/06/11 19:15:23
>>452
宿題を肩代わりするスレじゃないんだけど。
少しはperl文を書いてから出なおせ。

455:デフォルトの名無しさん
08/06/11 19:33:31
たしかに最近どうみても入門者向けの課題を回答させようとする連中が多いような?


456:デフォルトの名無しさん
08/06/11 19:39:49
>>451
push(@{$hoge->{'hoged'}}, $hoging);


457:デフォルトの名無しさん
08/06/11 19:55:00
宿題を人に頼む奴は大学やめればいい

学部生いわく。

458:443
08/06/11 19:59:01
>>446-450

おしかりありがとう御座います。
デバックの仕方を勉強します。
Data::Dumper
で一目瞭然でした。

猛省します。

原因はなんだったのかって?恥ずかしすぎて・・・。
言いたくないんですけど。

ループ内で。。。、DBハンドルが・・・。
ごめんなさいごめんなさいごめんなさい

猛省します。
大事なことなので2回言いました。


459:デフォルトの名無しさん
08/06/11 20:17:52
>>456
ありがとう。解決した。

460:454
08/06/12 01:05:52
>>454
すみません。bashで書いていたんですけどbashだとうまくいきそうにないので
perlでお願いしてみました。すみません。bashのコードとしては以下のような感じです。
無茶苦茶なコードですみません。

#!/bin/bash
for iii in `cat abc.txt`
jjj=`sed -n '2p'`
do
if test [ $jjj = "^20" ]
then
paste "$jjj" "\t" "$iii" > ccc.txt

else
fi
done

bashでは無理っぽいのでスクリプトも途中までの処理しかしてないです。
perlで処理すればと思ってお願いにきました。perlはあまりよくわからないのでお願いします


461:452
08/06/12 01:08:15
寝ぼけてて名前間違えました。すみません。

462:デフォルトの名無しさん
08/06/12 01:36:40
正直いうと、>>452に書いてある処理の一覧が全然論理的じゃないので俺には理解できない。

つまり、「一旦処理を終えて」と「その処理を終えて」がどう違うのかとか、
そもそも「その処理」や「その文字列」とは何なのかとか、
行の先頭が空白なのに行の先頭の[を読めとはどういうことなのかとか分からない。

463:デフォルトの名無しさん
08/06/12 02:15:05
処理前と処理後を見ればやりたいことはわかるが、
この程度、forと正規表現使えばどうにでもできるだろ

あと、処理の方法はひどすぎる
自分でもう一回読んでみろ

464:デフォルトの名無しさん
08/06/12 06:43:04
>>460
俺は、「perl文を書いてから出なおせ」と書いた。bashなんか求めてねえ
お前さんがperlで書く気0なのに答えてやる義理なんざねえよ
「perlの知識0です。エスパーしてください。」
って質問には>>428で答えてしまって反省してんだよ
>>436のリンク先でも読んでちったー自分で考えろ

465:デフォルトの名無しさん
08/06/12 09:42:25
>>442

require するときに退避しといて戻せばいいんじゃない?

{
local *hoge::f;

require ...
}

これだと$hoge::fも影響受けるのがやりすぎだというなら、

{
local *hoge::f = sub{};

require ...
}


466:デフォルトの名無しさん
08/06/12 11:03:25
>>442
オブジェクト指向に設計すれば問題なす

467:デフォルトの名無しさん
08/06/12 11:08:45
オブジェクト指向までやらなくてもせめてモジュールにして
Exporter使う方が楽だろうと思う。

読みたいファイルが他人が作ったもので中身も見たくない
のならしょうがないけどな。

468:デフォルトの名無しさん
08/06/12 11:20:59
5.10にしたらsvkが動かなったんだけどsvk使ってる人はどうしてんの?

469:デフォルトの名無しさん
08/06/13 01:15:19
require や do でベタの perl を呼ぶ時に引数与えたい場合どうするのが普通なんでしょか?

% ./hanage.pl -help

を do とかを通してやりたい時、というです。


@ARGV=("-help");  # とかしておいて、
do "hanage.pl";    # とすると、実現できているようですけど、これが普通でしょか?

また、ほかに方法があれば。

470:デフォルトの名無しさん
08/06/13 02:07:04
それで動いてるならいいじゃないの?何が不満なの?

471:469
08/06/13 02:46:35
ひとつは、自信がないから。
ひとつは、ほかのやり方を知りたいから。"There's more than one way to do it"

目から鱗、鼻から悪魔、みたいな記述が perl ならまだある筈だと。
自分の例だと面白くも何ともないのでねぇ。

472:デフォルトの名無しさん
08/06/13 06:34:01
{
local @ARGV=("-help");
do "hanage.pl";
}
とかでいいだろ。べつに@ARGVじゃなくてもいいけど。

473:デフォルトの名無しさん
08/06/13 06:55:17
…do EXPR は、goto文並みにobsoleteな感じがするんだが、皆さん使うの?
require EXPR ですら、perl4的でどうしても避けられない場合にのみ嫌々使うんだけど


474:デフォルトの名無しさん
08/06/13 08:10:51
すみません。ものすごい基本的なこともか知れませんが質問させて下さい。
@listに複数行に,で区切られた5つのデータがあるとします。

my $cnt = 0;
foreach( @list){
@list2[$cnt] = split( /,/, $_);
$cnt++;
}

というのを考えたのですが、
Use of implicit split to @_ is deprecated
どのようにすればいいのでしょうか?

475:デフォルトの名無しさん
08/06/13 08:21:53
>>474
@list2[$cnt] = @_ = split( /,/, $_);

476:デフォルトの名無しさん
08/06/13 08:22:41
475は無し。何も考えずに書き込んだ。


477:デフォルトの名無しさん
08/06/13 08:54:07
>>474
@{list2->[$cnt]}



478:デフォルトの名無しさん
08/06/13 08:58:33
>>474
@{$list2[$cnt]}

479:デフォルトの名無しさん
08/06/13 09:27:49
>>473

#--- config.file ---
my $dir = '/path/to/base/dir';
{
  foo => 1,
  bar => [ 2..5 ],
  baz => "$dir/extra.file",
};
#---

なんて設定ファイルを作って

$conf = do '/path/to/config.file';

で読むという手抜き実装はよくする。
設定ファイルを Perl で書けるのが柔軟で楽。

480:デフォルトの名無しさん
08/06/13 12:06:38
>>473
useだとコンパイル時に読み込まれちゃうから
動的に読み込むファイル決める場合は
"use $file;"するかdo "$file"するくらいしかないじゃん
前者よりはdoのほうが素直じゃね?

481:デフォルトの名無しさん
08/06/13 12:21:25
>>480
動的に use したいだけなら require の方がもっと素直だね。

482:デフォルトの名無しさん
08/06/13 12:34:19
>>479,>>480
レスthx.

config file だったらYAMLとかそっち使っちゃってるw
480の方は状況があまり想像出来ん。Storable知る前だったら
Data::Dumperの出力云々で使ったかもしれんが…。

俺に機会が無いだけなのねw

483:デフォルトの名無しさん
08/06/13 12:38:20
あ。ちなみにData::Dumperの動的処理の時も(しぶしぶ)require使ってた。
481氏の意見と同じ感覚。

484:デフォルトの名無しさん
08/06/13 13:34:15
CSVファイルがありこれをソートしたいのですが、
3番目の要素でソートしたりできませんか?

485:デフォルトの名無しさん
08/06/13 13:38:49
>>484
perlを使うよりsortコマンドのほうが早そうだけど?

486:デフォルトの名無しさん
08/06/13 13:41:01
CSVの扱いはPerl向きじゃない気がする。

487:デフォルトの名無しさん
08/06/13 13:42:39
>>486 CSV 何で処理してる?



488:デフォルトの名無しさん
08/06/13 14:09:47
>>482 delegateパターン実装とか


489:デフォルトの名無しさん
08/06/13 14:27:27
エクセルでやれば?w

490:デフォルトの名無しさん
08/06/13 14:29:25
Pythonだとこんな感じ

import sys, csv
from itertools import imap
from operator import itemgetter

writer = csv.writer(sys.stdout)
for row in sorted(csv.reader(sys.stdin), key=itemgetter(2)):
    writer.writerow(row)


491:デフォルトの名無しさん
08/06/13 14:31:09
ああimapとかimportする必要ねえな
無視して

492:デフォルトの名無しさん
08/06/13 14:31:49
なんでもデリミタをコロンにしてたらUNIX病だと怒られた

493:デフォルトの名無しさん
08/06/13 15:02:19
あれ?PerlにもCVS用のモジュールがあったような?

494:デフォルトの名無しさん
08/06/13 15:10:11
そしてSJISでハマるに一票。pythonも同じと思うが。

495:デフォルトの名無しさん
08/06/13 15:31:56
基本すぎてわらけるかもしれないけど、教えてください。

関数の引数の扱いがよくわかりません。
たとえば、
sub test{
# $_[0] == "test";
# $_[1] == "test2";
}
&test( "test", "test2");
となるとおもうのですが、
@test = ( "test", "test2");
&test( "test", @test);
としたばあい、引数はどうなるのでしょうか?

色々と試してみたのですが、
&test( @test);
としたばあいは、
@_ == @test;
だということはわかったのですが・・。
(もし違っていたら指摘していただけるとありがたいです。

496:デフォルトの名無しさん
08/06/13 15:35:18
>>495 やって美奈代




497:デフォルトの名無しさん
08/06/13 17:04:22
perl -F',' -lane 'push @dat, [ @F, $_] ;}{ print $_->[-1] for sort {$a->[2] <=> $b->[2]} @dat; ' FILE
sort -k3 -t, -n < FILE

498:デフォルトの名無しさん
08/06/13 18:04:30
require がうまくできません。
上記の質問を参考に、
test.cgi ---
require './hoge.pl';
とかいて、
hoge.pl ---
our $test = "hogee";
1;
とかいているのですが、
perl test.cgi
すると、$testは読めていないようです。

ながに悪いでしょうか?

499:デフォルトの名無しさん
08/06/13 18:29:00
>>495
マニュアルを見ずに仕様を突き止めるゲームでも開催されてるの?

500:デフォルトの名無しさん
08/06/13 18:36:22
>>498
「$testは読めていないようです。」の「ようです」に隠された何か。

501:デフォルトの名無しさん
08/06/13 18:40:32
>>492
そうなのか。不治の病にかかってしまった。


502:デフォルトの名無しさん
08/06/13 21:09:26
myにすればいいんだよ

503:デフォルトの名無しさん
08/06/14 00:01:01
>>474
splitをスカラコンテクストで使ってはいけない。

504:デフォルトの名無しさん
08/06/14 08:59:12
$input = <>;
というコードをwindows上で実行し入力待ちの状態でウィンドウ右上の×印を
押すと「すぐに終了」のダイアログが出てきてしまいます。
入力待ちの状態では$SIG{'QUIT'}をキャッチすることが出来ません。
Term::ReadLine等も試しましたが挙動は同じでした。
入力待ちの状態でも正常終了するようにすることは出来ないでしょうか。

505:デフォルトの名無しさん
08/06/14 18:33:05
Ctrl + C ??

506:デフォルトの名無しさん
08/06/15 00:06:19
>>504
自前でwindow開かないと無理と思われ。

507:デフォルトの名無しさん
08/06/15 15:27:14
多次元配列があるのですが、2次元目のある要素を元に1次元目をソートさせることはできませんか?

508:デフォルトの名無しさん
08/06/15 15:50:42
>>507
出来るよ。

509:デフォルトの名無しさん
08/06/15 16:06:21
すみません。
簡単なサンプルでいいんでコードを書いて頂けませんか?

510:デフォルトの名無しさん
08/06/15 16:17:38
>>509
ググれば例などいくらでも出てくるんだが?
perl -MData::Dumper -le 'print Dumper sort { $a->[1] <=> $b->[1] } ( [2,3],[3,2] ) ;'
$VAR1 = [ 3, 2 ];
$VAR2 = [ 2, 3 ];




511:デフォルトの名無しさん
08/06/16 08:14:00
Perlでファイルの中の指定した文字列(正規表現".*hoge$"等)にマッチする行を
削除したいのですが、どうすれば良いでしょうか?

512:デフォルトの名無しさん
08/06/16 09:38:40
>>511
URLリンク(perldoc.jp)
を、「ファイルのある行を削除する」で検索。

513:デフォルトの名無しさん
08/06/16 09:39:22
>>511

#!C:/perl/bin/perl

open(IN,"example.log");
while(<IN>){
if($_ =~ /hoge/){ $line .= "\n"; }
else{ $line .= "$_\n"; }
}
close(IN);

open(OUT,">exmple.cgi");
print OUT $line;
close(OUT);

print"Content-type:text/html\n\n";

print "消去完了";

みたいな感じですか?

Perlコーディング初心者質問スレ Part 57
スレリンク(php板)l50

514:デフォルトの名無しさん
08/06/16 10:18:02
111
222
333
444
555
666
というようなファイルがあったとして(数字は仮定です)3行目の行の
先頭にtabを2つ入れたい場合、どのようにすればいいのでしょうか。

515:デフォルトの名無しさん
08/06/16 10:24:45
くだすれ池

516:デフォルトの名無しさん
08/06/16 10:28:50
>>514
……
行数を数えながら一行ずつ読み込むループにして

if 3行目 then
先頭にtabを2つ入れる
読み込んだ行を出力する

という中身を回せばいいよ。

517:デフォルトの名無しさん
08/06/16 10:33:18
>>514

質問先は「くだすれPerl(超初心者用)2」
スレリンク(php板)l50
が良いらしいです。


518:デフォルトの名無しさん
08/06/16 10:50:21
>>511
>>513

すいません、間違ってました。
スレリンク(tech板:511番)

519:デフォルトの名無しさん
08/06/16 15:50:09
変数の中の文字列の頭のスペースを取り除きたいのですが、
どのようなほうほうがありますか?

520:デフォルトの名無しさん
08/06/16 15:55:16
>519
正規表現使う典型ケースです

521:デフォルトの名無しさん
08/06/16 16:00:36
>>519
URLリンク(perldoc.jp)
を、「文字列の先頭や末尾にある空白を剥ぎ取るには?」で検索。

522:デフォルトの名無しさん
08/06/16 16:01:41
>>519
スレリンク(php板:292番)


523:デフォルトの名無しさん
08/06/16 16:08:16
>>519
>>522

連投すいません。修正です。
スレリンク(php板:293番)

初歩質問はこちらが良いらしいです。
スレリンク(php板)l50


524:デフォルトの名無しさん
08/06/18 01:11:06
質問です。
HTML数値エンティティを文字に変換する際にはどうすればよいでしょうか。
下記の通りに実行したのですがうまくいきません
(�-ÿしか対応していない?)

#!/usr/bin/perl
use HTML::Entities::Numbered;
$str='あいうえお';
print hex2name($str); #「あいうえお」を期待するが変換前と同じ$strが出力される

525:524
08/06/18 01:12:01
$str='&#x3042;&#x3044;&#x3046;&#x3048;&#x304A;';

ですorz

526:デフォルトの名無しさん
08/06/18 04:57:49
>>524
> print hex2name($str); #「あいうえお」を期待するが変換前と同じ$strが出力される

いや、期待するなよ。

527:デフォルトの名無しさん
08/06/18 06:29:13
そのあたりに踏み入ったことはないのだが、マニュアルを見る限り

HTML::Entities::decode

を使うのではないか?

528:デフォルトの名無しさん
08/06/18 12:04:39
すんごい初歩的な質問で申し訳ないのですが、
Perlやってる友達がお前こんなのもできないだろと自慢してくるので、明日までにこれをやらないとまたバカにされるのですが、
プログラム自体やったことがなく意味不明すぎてよくわかりません。。誰かもしよかったら教えてください。

キーボードから整数値$aの値を入力してEnterを押し、
続けて$bの値を入力してEnterを押すと、
$aを 3 倍した値と、$bを 8 倍した値の和 を計算して$cに代入し,
$cの値を画面に出力するプログラム

結果は
print "$c€n";
の形で出力する
この結果の出力以外の画面出力はしないこと.

529:デフォルトの名無しさん
08/06/18 12:10:09
>>528
その友達に教えてもらいなさい

530:デフォルトの名無しさん
08/06/18 12:14:12
>529

というか、その友達から出された問題なんです。

531:デフォルトの名無しさん
08/06/18 12:23:42
宿題だろ・・・

532:デフォルトの名無しさん
08/06/18 12:37:23
それが出来たところで他の事聞かれてあぼんだな

533:デフォルトの名無しさん
08/06/18 12:40:17
「1/10の確率」

を表現するのに、これ↓はありなのか?

return 0 if rand(1000) > 100;

534:デフォルトの名無しさん
08/06/18 12:51:55
あり得ないという根拠は?

535:デフォルトの名無しさん
08/06/18 12:52:56
>>533
randが正規乱数だと仮定するならありだろ。

536:デフォルトの名無しさん
08/06/18 13:05:29
正規乱数だと仮定するならなしだろ
randが一様乱数を吐くのならありかもしれんが

537:デフォルトの名無しさん
08/06/18 13:50:36
>>528
お前こんなのもできないのか

538:デフォルトの名無しさん
08/06/18 14:25:04
綺麗な記述を勉強したいです。
どっかで配布されてる非常に綺麗で整理された記述を教えてください。
あまりにいっぱい配布されすぎててチェックできません。


539:デフォルトの名無しさん
08/06/18 14:39:00
>>538
man perlstyle
つーか、好きにしろ

540:デフォルトの名無しさん
08/06/18 16:10:12
>>538
perl medicとかは偏ってはいるけど
ポリシーとしてはまあ参考になるかもしれん
買うまでの事は無い本なので図書館で探せ


541:524
08/06/18 21:54:54
>>527
HTML::Entities::decode で無事に出来ました
今後はマニュアルをしっかり読みますm(_ _)m
ありがとうございました

542:デフォルトの名無しさん
08/06/18 22:32:54
>>538
ここはPerlのスレですよ?

543:デフォルトの名無しさん
08/06/18 22:37:24
>538
Plagger読んどけ

544:デフォルトの名無しさん
08/06/18 23:17:04
こっそり書いてみる。意味は教えないよ
perl -e 'print <STDIN>*3+<STDIN>*8,"\n"'

545:デフォルトの名無しさん
08/06/18 23:37:40
$cに代入してないじゃん

546:デフォルトの名無しさん
08/06/18 23:54:10
>>528

544とは別人だけど。

perl -e '$c=<>*8+<>*3;print"$c\n";'

また、次の問題を出されるだろうから、がんばって。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch