Perlについての質問箱 35箱目 at TECH
[2ch|▼Menu]
1:デフォルトの名無しさん
08/04/20 16:01:21 BE:176880454-DIA(100004)

"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、
Perlの奥深さについて皆で語り合い、追求してまいりましょう。

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
( WEBプログラミング板 URLリンク(pc11.2ch.net) )

CGIの質問は答えが Perlと全然関係ない話に帰着する場合が
多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。

URLリンク(www.perl.org)
● 2008/04/20 現在の最新版: 5.10.0
● 2008/04/20 現在の開発版: 5.9.5

▼ 前スレ
Perlについての質問箱 34箱目
スレリンク(tech板)


2:デフォルトの名無しさん
08/04/20 16:06:37 BE:238787993-DIA(100004)

[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: URLリンク(www.site-cooler.com)

[本]
リャマ: URLリンク(www.oreilly.co.jp)
駱駝: URLリンク(www.oreilly.co.jp)
Effective Perl: URLリンク(www.ascii.co.jp) (修正)
クックブック: URLリンク(www.oreilly.co.jp)
Perl ベストプラクティス: URLリンク(www.oreilly.co.jp)
Perl Hacks: URLリンク(www.oreilly.co.jp)

[オンラインマニュアル]
最新のドキュメント: URLリンク(search.cpan.org)
perl5.8.xのドキュメント(一部): URLリンク(www.kt.rim.or.jp)
perl5.005_03 のドキュメント: URLリンク(www.kt.rim.or.jp)
日本語ドキュメント検索: URLリンク(www.cpan.jp) (停止中)
perldoc.jp: URLリンク(www.perldoc.jp)
perldoc.com: URLリンク(www.perldoc.com)


3:デフォルトの名無しさん
08/04/20 16:09:13 BE:123817027-DIA(100004)

[モジュール]
CPAN.com: URLリンク(search.cpan.org)
河馬屋二千年堂: URLリンク(homepage3.nifty.com)

[テクニック]
Perlメモ: URLリンク(www.din.or.jp)
Perlのページ: URLリンク(homepage1.nifty.com)
Perlの小技: URLリンク(homepage3.nifty.com)

[Perl 5.8 Unicodeメモ]
URLリンク(www.rwds.net) (修正)
URLリンク(www.namazu.org)
URLリンク(www.lr.pi.titech.ac.jp)


4:デフォルトの名無しさん
08/04/20 16:12:33 BE:636768689-DIA(100004)

[過去スレ1]
1 URLリンク(pc.2ch.net)
2 URLリンク(pc3.2ch.net)
3 URLリンク(pc2.2ch.net)
4 URLリンク(pc2.2ch.net)
5 URLリンク(pc5.2ch.net)
6 URLリンク(pc5.2ch.net)
7 スレリンク(tech板) (事故により消滅)
8 スレリンク(tech板) (事故により消滅)
9 スレリンク(tech板)
10 スレリンク(tech板)
11 スレリンク(tech板)
12 スレリンク(tech板)
13 スレリンク(tech板)
14 スレリンク(tech板)
15 スレリンク(tech板)
16 スレリンク(tech板)
17 スレリンク(tech板)
18 スレリンク(tech板)
19 スレリンク(tech板)
20 スレリンク(tech板)


5:デフォルトの名無しさん
08/04/20 16:13:54 BE:265320656-DIA(100004)

[過去スレ2]
21 スレリンク(tech板)
22 スレリンク(tech板)
23 スレリンク(tech板)
24 スレリンク(tech板)
25 スレリンク(tech板)
26 スレリンク(tech板)
27 スレリンク(tech板)
28 スレリンク(tech板)
29 スレリンク(tech板)
30 スレリンク(tech板)
31 スレリンク(tech板)
32 スレリンク(tech板)
33 スレリンク(tech板)
34 スレリンク(tech板)


6:デフォルトの名無しさん
08/04/20 16:17:33 BE:636768689-DIA(100004)
少しミスりました、すみません。
テンプレは以上だと思います。

7:デフォルトの名無しさん
08/04/20 17:37:30
>>1おつ

8:デフォルトの名無しさん
08/04/20 21:59:21
柚縁故とかの説明は無しにしたのね

9:デフォルトの名無しさん
08/04/20 22:05:44
だいぶまえからないよ

10:デフォルトの名無しさん
08/04/20 23:21:25
エロ画像収集言語 perl

11:デフォルトの名無しさん
08/04/21 00:34:06
sedとawkさえあれば何も困らないことに気が付いた

12:デフォルトの名無しさん
08/04/21 01:04:51
perlでクライアントの2chブラウザ作ったけど見たい人いますか?
4時間ほどで作りました

13: ◆TWARamEjuA
08/04/21 01:35:41 BE:3049474-2BP(7082)
(´-`).。oO(前スレが埋まる前に次ぎスレを立てて案内を入れて欲しいよなぁ。。。)

14:デフォルトの名無しさん
08/04/21 07:15:16
お前がやれ

15:デフォルトの名無しさん
08/04/21 18:03:48
perlの-MO=オプションってなんなんですか?
perlrunやperlcompile見ても
-MO そのものの説明は全然のってないんですが

16:デフォルトの名無しさん
08/04/21 18:08:05 BE:212257038-DIA(100004)
"O" と言うモジュールがあるんだよ

17:デフォルトの名無しさん
08/04/21 18:30:53
perldoc O だけで説明が出ますよ。探し回ってしまうのはなんとなくわかる。

18:デフォルトの名無しさん
08/04/21 18:35:21
ところが、perl -MO=Deparse とかの場合
perldoc B::Deparse
なんだなこれが。

19:17
08/04/21 18:45:42
そこは perldoc O すれば
「-MO=Hoge すると B::Hoge が、だな」とか書かれてたはずだからいいか、と
思い込んでみました。

20:l15
08/04/21 18:48:58
ありがとうございました

perlccで使えるモジュールみたいなもの(B::x)をperlコマンドから参照するアダプタモジュールが
Oっていう名前でそれを-Mオプションでuseしていると理解しました
=...はOモジュールのオプションですね

道理で-MOで幾ら探してもでてこないわけだ…orz

21:18
08/04/21 18:51:16
確かにCONVENTIONSとかに書かれてるね。
きちんと読みゃ問題ないんだが、オレはハマったw

22:デフォルトの名無しさん
08/04/21 18:52:54
リロードしてから投げりゃよかった。
>>21>>19へのレス。


23:デフォルトの名無しさん
08/04/22 16:32:51 BE:238789139-DIA(100004)
#!/usr/bin/perl

use utf8;

sub スイーツ {
my $argument = shift; utf8::encode($argument);
my($package, $routine) = (caller 0)[0, 3];
{
no utf8;
$routine =~ s/\Q$package\E:://;
printf("%s(%s)", $routine, $argument);
}
}

スイーツ(笑)

__END__

URLリンク(codepad.org)
スイーツ関数出来たよー

24:デフォルトの名無しさん
08/04/25 10:46:58
cat a.txt b.txt c.txt > d.txt

と同等のことをする Perl モジュールはあるでしょうか?

なるべく、
while (<FH>){print;}
の繰り返しを避けたいのですが。

それとも
(open FH, "cat a.txt b.txt c.txt |");

のようにするのでしょうか。



25:デフォルトの名無しさん
08/04/25 12:35:24
>>24
perl -ne print a.txt b.txt c.txt > d.txt

26:デフォルトの名無しさん
08/04/25 12:38:26
これ使えば
URLリンク(search.cpan.org)

print slurp $_ for @files;

とかでできるんじゃね?

ってか何がやりたいの? なんで繰り返しを避けたいの?
質問するときはそれを書くようにしましょう。


27:デフォルトの名無しさん
08/04/25 12:39:13
>>25
どうもありがとうございます。
言葉が足りなくて申し訳ありません。
実はコマンドラインでなく、スクリプトの中で実行したいのです。

28:24
08/04/25 12:47:18
>>26
どうもありがとうございます。
ご紹介の Slurp.pm を使用してみます。

while (<FH>){print;} の繰り返しを避けたいのは、何度も同じ作業をする予定なので、
while (<FH>){print;} をファイルの数だけループさせる以外にもっといい方法があればと思いまして。

シェルスクリプトでやっていたことを Perl スクリプトで実行したいところなので
発想がシェルからなのです。
他には、 comm や sort に対応するモジュールを使ってみようかと。


29:デフォルトの名無しさん
08/04/25 12:50:08
いや、だから

cat.pl
---- ここから---
#!/usr/bin/perl -n
print;
---- ここまで---

コマンド行:
cat.pl a.txt b.txt c.txt > d.txt

要するに
while(<>)

while(<STDIN>)
は違いますよって事だな

30:24
08/04/25 13:16:10
>>29
たびたびありがとうございます。
本当に言葉が足りなくて、ごめんなさい。

コマンドラインで a.txt b.txt c.txt を指定するのでなく、
スクリプト内で File:Find を駆使して、a.txt 他を探すつもりでした。

31:デフォルトの名無しさん
08/04/25 21:43:46
@ARGV = <*.txt>;
print while <ARGV>;

32:デフォルトの名無しさん
08/04/26 04:06:08
萌え萌えじゃんけんに絶対勝つモジュールはありますか?

33:デフォルトの名無しさん
08/04/26 23:14:27
お世話になります。お力添えください。

テキストファイル内の特定の文字列を検索して、
1.検索結果の『前』『後』の行に、任意の文字列を『追加』する、
2.検索結果の行を、任意に編集する
ということを行いたいのですが、
openしたファイルを直接書き換えることはできるのでしょうか?

一度、別のファイルを作成して、
元を削除して、
作成したファイルをリネームするのではなく、
直接編集できないのかなと思いました。

あと、上記の『1』について、
ファイル内の先頭から検索して、
はじめにマッチする場所へポインタを移動する関数って標準にはないでしょうか?
今は先頭からゴリ押しで探しているので、格好悪いです…。

34:デフォルトの名無しさん
08/04/27 01:04:42
>>33
書き換えは普通にできる。
だが危険だぞ。


35:デフォルトの名無しさん
08/04/27 12:55:49
perl ド素人です。
perl の FillInForm というモジュールを使いたいのだけど
利用しているレンタル鯖(さくら)には入ってないようです。
同じ処理が出来るモジュールなどを教えてもらえないでしょうか。

やりたい事は、
「入力画面からの入力値をチェックし、
不足があれば、入力値を保ったまま入力画面を再表示する」
というものです。この「入力値を保ったまま」というのに
FillInForm を使いたいと考えています。
select や radio の値復帰を
FillInForm で出来るという記事を見かけたので
使おうと思いましたが、
別にこれにこだわっているわけではないので、出来ればなんでもいいです。

管理者権限がなく、インストールなどは出来ないので
.pm の 1 ファイルだけ置いて、require して使えるようなモジュールだとより助かります。
(FillInForm も試してみたのですが上手くいかず……)

36:デフォルトの名無しさん
08/04/27 12:58:23
依存してるモジュール全部突っ込んで、
use lib '.';
とかでいいだろう。

37:デフォルトの名無しさん
08/04/27 13:01:29
CGI::Ex::Fill

38:デフォルトの名無しさん
08/04/27 13:11:49
即レスありがとうございます。

>>36
そういう書き方が出来るんですね、なるほど。
今回は残念ながら、FillInFomr のソースを見たところ、
  require 5.005;
なんて記述があり、自分では依存先ファイルの全貌がつかめませんでした…。

>>37
試してみます。

39:デフォルトの名無しさん
08/04/27 16:03:15
>>38
そのrequireは単なるバージョン制限だ。5.005未満の環境だと、そこで強制終了。

40:デフォルトの名無しさん
08/04/27 16:34:19
すいません今日はじめるんですが、perl5.8.8.822インストールして
環境変数設定するんですが、パスこれであってますでしょうか?

c:\ActivePerl-5.8.8.822-MSWIN32-x64-280952\perl\bin\perl.exe

41:デフォルトの名無しさん
08/04/27 16:56:43
エクスプローラのアドレスバーに
C:\ActivePerl-5.8.8.822-MSWIN32-x64-280952\perl\bin
と打ってみてその中に perl.exe さんがいるのなら、↑こう。
環境変数 PATH の設定なんだから最後の \perl.exe 要らない。

でも、Windows環境だと C:\Perl\bin 辺りに perl.exe さんがいる
状態にする人のほうが多いので、どこに perl.exe さんがいるのか
きちんと確認してください。

42:デフォルトの名無しさん
08/04/27 17:11:18
ほんとにインストールしたのか?!

43:デフォルトの名無しさん
08/04/27 21:01:48
>>35です。
すみません、CGI::Ex::Fill を入れようとしたのですが
うまくソースを読み込めていないようで、
関数を呼び出すと
  Undefined subroutine &main::form_fill
となります。

やったことは、サイトから落としたソースを Fill.pm として ./lib にアップ、
  use lib qw(./lib);
でその読み込み、
  form_fill($html, $query);
の呼び出し、の 3 点です。
form_fill の1行をコメントアウトすると、もちろん値は復帰しませんが正常に動きます。
(なので、use lib qw(./lib); も少なくともエラーにはなっていないようです)
問題点の心当たりのある方がいたら教えてください。

44:デフォルトの名無しさん
08/04/27 21:17:37
今、パールの勉強始めてます
変数がクソだと思いました

Cをやりたいです
配属先でぱーるなんてやらせるのがイヤです
こんなクソ言語
先の無い言語

rubyやPythonやPHPやSQLみたいなオサレなのをやらせてください
COBOLとかFortlanみたいなもんと同じじゃないんですか?ぱーるって

45:デフォルトの名無しさん
08/04/27 21:23:45
>>43 補足
公式サイトの説明での読み込み方が、
  use CGI::Ex::Fill qw(form_fill fill);
となっているので、ひょっとしたら use の読み込みの際、
読み込む関数を指定する必要があるのか考えています。
ただ、use lib qw(./lib) で、読み込み方を指定する方法がわからず試せていません。

全く的外れかもしれませんが、自分で思いつく問題点はそれぐらいです。

46:デフォルトの名無しさん
08/04/27 21:42:33
>>43
インストールしてない
読み込んでない

47:デフォルトの名無しさん
08/04/27 21:57:54
>>43
CGI::Ex::Fill::form_fill($html, $query);
じゃダメなのか?

48:デフォルトの名無しさん
08/04/27 22:05:40
>>46
上にも書いている通り、ファイルを置いて use しているだけなので
インストールしてないというのは、その通りだと思います。
>>43に書いた通りには読み込み処理を書いているので
まさにそれで読み込めない理由が知りたいです。

>>47
ダメでした。同様に
  Undefined subroutine &CGI::Ex::Fill::form_fill
となりました。

49:デフォルトの名無しさん
08/04/27 22:13:44
use libはインクルードパスを変えるだけだぞ…

50:デフォルトの名無しさん
08/04/27 22:21:09
置いたファイルを use していない、のだ。

51:デフォルトの名無しさん
08/04/27 22:42:16
>>49-50
なるほど! わかりました。
use lib でパスを通した後で、
改めて use CGI::Ex::Fill qw(form_fill fill); を行う必要があったんですね。
Fill.pm の置き場所を ./lib/CGI/Ex/Fill.pm に変更し、use したところ
まだ値は復帰しませんが、とにかく form_fill は通るようになりました。
ありがとうございました。

52:デフォルトの名無しさん
08/04/27 23:52:55
インストールすりゃいいだろ!!

53:デフォルトの名無しさん
08/04/28 03:02:57
    ∩___∩   /)
    | ノ      ヽ  ( i )))
   /  ●   ● | / /
   |    ( _●_)  |ノ / コイツ最高のアホ!
  彡、   |∪|    ,/
  /__  ヽノ   /´
 (___)     /

54:デフォルトの名無しさん
08/05/01 00:19:43
    ∩___∩   /)
    | ノ      ヽ  ( i )))
   /  ● ●   | / /
   |    ( _●_)  |ノ / コイツ最高のアホ!
  彡、   |∪|    ,/
  /__  ヽノ   /´
 (___)     /

55:デフォルトの名無しさん
08/05/01 02:11:38
Template Toolkit の質問でも良いですか?

Template Toolkit でファイルの存在判定ってできるんでしょうか?
例えばあるテンプレート内で
[% INCLUDE hoge.tt %]
を使って異なるディレクトリにあるファイルを include させたいのですが、
実際に hoge.tt が存在しない時は、"file not found"にて処理が失敗しています。

今作ってる仕組み上、hoge.tt は時と場合に応じて有ったり無かったりするので、
ファイルが無いときは、include させない制御をテンプレートのみで実装したいのです。

お願いします。

56:デフォルトの名無しさん
08/05/01 07:35:17
>>55
ここの「例外処理、フロー制御」の項読めば?
URLリンク(www.hakoniwa.net)

57:デフォルトの名無しさん
08/05/01 13:12:30
>56
ありがとうございます。
まさにそのままでしたね。

どんだけ視野狭いんだ俺。

58:デフォルトの名無しさん
08/05/02 03:25:33
perlからvb.net で作成したクラスライブラリにアクセスはできないのでしょうか?
例えばperlから、
URLリンク(homepage1.nifty.com)
のサンプルで作成したMyLibrary.dllの関数の"Add","Total"等を
使用する場合、次のような書き方では、Died となってしまいます。
どなたかご教授お願いします。

use Win32::API;
$Add = new Win32::API( "MyLibrary.dll", "Add", [N], "N") || die;
$Total = new Win32::API( "MyLibrary.dll", "Total", [], "N") || die;

<結果>
Died at D:\work\DLL_Access.pl line 27, <DATA> line 164.



59:デフォルトの名無しさん
08/05/02 14:16:23
Perl で LWPを使用したとき(activePerl) HTTP/1.1 を使用しちゃうんですが
HTTP/1.0 で通信したい場合どう指定すればいいか分かりますか?

60:デフォルトの名無しさん
08/05/02 19:07:41
>>59
環境変数PERL_LWP_USE_HTTP_10をセットする。

61:デフォルトの名無しさん
08/05/05 12:28:42
CGI掲示板を自作していますが、書き込み送信メールのSendmailによる送信処理でつまづきました。

以下のように記述すると、管理人である自分には登録メールが送られますが、
管理人以外に、書き込みした人にも登録確認メールが送られるようにしたいんです。

#Sendmailによる送信処理
if (open(MAIL,"| $sendmail -t")){
print MAIL "X-Mailer:legend2\n";
print MAIL "To: $administrator\n";
print MAIL "Errors-To: $administrator\n";
print MAIL "From: $administrator\n";
print MAIL "Subject: $subject\n";
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
print MAIL "Content-Transfer-Encoding: 7bit\n";
print MAIL "$mail_comment\n";
print MAIL "\n";
close(MAIL);
}
}

以下のどれかを使うのでしょうか?

print SENDMAIL "From: $sender <$from>\n";
print SENDMAIL "To: $to\n";
print SENDMAIL "Cc: $cc\n";
print SENDMAIL "Bcc: $bcc\n";


どうすれば良いか御教授下さい。宜しくお願いします。


62:デフォルトの名無しさん
08/05/05 13:30:13
>>61
>>1

63:デフォルトの名無しさん
08/05/06 12:23:32
>>62
知らないなら出しゃばるなよ

64:デフォルトの名無しさん
08/05/06 13:31:21
>>63
>>1

65:デフォルトの名無しさん
08/05/06 13:36:14 BE:212257038-DIA(100004)
sendmail のスレ行けよ
純粋な Perl の質問なら
標準モジュールの
Net::SMTP 使って質問しろ

66:デフォルトの名無しさん
08/05/06 13:49:56
既にwebprogに移動したようですよ。

67:デフォルトの名無しさん
08/05/06 14:41:58
こういう赤ん坊のムニャムニャみたいな質問に良く答えられるなあ。
webprogはエスパーが多いのか。

68:デフォルトの名無しさん
08/05/06 15:51:47
あっちは隔離施設なので訓練をつんだ回答官が配備されてます

69:デフォルトの名無しさん
08/05/06 16:00:05
こっちのスレは素人なので、答えられない質問が来ると他所へ追いやります。

70:デフォルトの名無しさん
08/05/06 16:01:24
>>69
> こっちのスレは素人なので、答えられない質問が来ると他所へ追いやります。

その通りなので、最初からあちらへ行ってください。

71:デフォルトの名無しさん
08/05/06 16:29:08
訓練を積んだ回答官が配備されてるんじゃなくて

「&jcode'convert(*value, 'sjis', 'euc') の *value って何ですか?」
「&ReadParse(*in) の *in って何ですか?」
「open() or &error("読み込みエラー") で読み込みエラーが表示されて困っています」
「エラーメッセージは 500 Internal Server Error です」

任務が厳しくて鍛えられてしまうんです。

72:デフォルトの名無しさん
08/05/06 18:18:54
激務だな。

それはそうと、未だにjcode.plつかってるのが出回ってるのかね。

73:デフォルトの名無しさん
08/05/06 18:28:12
use Jcode や use utf8 がクソだから jcode.pl から乗り換える気にもなれない。
わざわざ労力をかけてコードを書き直す価値が無いんだよ。
過去の古い資産をそのまま使うのでじゅうぶん。

74:デフォルトの名無しさん
08/05/06 19:26:17
最近グロブ使って書かれてるスクリプトに触ってないから
グロブはあまり使わなくなっちまったなあ。

75:デフォルトの名無しさん
08/05/06 22:59:14
しょこたんブログも飽きたな

76:デフォルトの名無しさん
08/05/07 11:44:34
Perl/tkで書いたものをWin32exe形式にするにはどうしたらいいんでしょうか?


77:デフォルトの名無しさん
08/05/07 20:09:07
perl2exe

78:デフォルトの名無しさん
08/05/08 06:57:50
UNIX環境でコマンドラインからスクリプト動かしたとき、
動かしたユーザーのidを取得するにはどうしたらいい?
スクリプトの使用制限をはかりたい。

79:デフォルトの名無しさん
08/05/08 08:26:58
>>78
$<
manくらい嫁。

80:デフォルトの名無しさん
08/05/08 13:05:01
>>78
コピーされて無効化されるぞ。


81:デフォルトの名無しさん
08/05/08 20:53:48
教えてください。

テキストファイルの中から、
hoge
を含む行を検索して、
その行をprintしたいのですけど、
一行一行読み込んで、パターンマッチして、真であれば、printする、
という方法以外に、何か方法ありますか?
(perlはテキスト処理が得意と訊いたのですが、『一行一行読み込んで』のステップがプログラムで必要か気になりました。)

ところで、cygwinでperlをはじめたのですが、何か気をつけることはありますか?

82:デフォルトの名無しさん
08/05/08 20:54:34
hogeを見つけたら前後の改行を探し出すとか。
全く意味ないけど。

83:デフォルトの名無しさん
08/05/08 21:51:51
>>81
perl -ne '/パターン/ && print' <file

84:81
08/05/08 22:37:56
レスありがとうございます。
さっぱりわからないので、教わったことをキーワードに調べてみます。

また、御願いします。

85:デフォルトの名無しさん
08/05/09 16:18:45
>>81
そういう事のためにあるのが、grep

86:デフォルトの名無しさん
08/05/09 18:25:10
まあ正規表現なんだけどな !

87:デフォルトの名無しさん
08/05/09 18:32:04
grepやsedを素っ飛ばしてperlから始めたのかな。一行野郎
なんて知らないんじゃないのかな。

88:デフォルトの名無しさん
08/05/10 14:33:02
目的:perlTk で GUI のテキスト検索ツールを作成しています。

状況:ユーザから入力された検索文字列の正規表現が不正であると、プログラムが
終了してします。 (invalid regular expression at * )

$search_string に格納された文字列が正規表現として有効であるかを、
eval を使って事前に評価したいのですが、どうしたら良いのでしょう?

if (eval (m/$search_string/)) ?  これだと常に true が帰ってしまいます。
エロい人、教えてください。

89:デフォルトの名無しさん
08/05/10 14:49:04
困ったときのクックブック
6.11 パターンが有効かどうか検証する

90:デフォルトの名無しさん
08/05/10 15:12:19
qx

91:デフォルトの名無しさん
08/05/10 15:52:18
>>88
エロイ人への質問はURLリンク(venus.bbspink.com)でしなさい。

92:88
08/05/10 16:16:44
>>89
ありがとう。正規表現の箇所は全部呼んだつもりだったのに。。。

解法(p.254):

eval { ""=~ /$search_string/ };
warn "パターンが無効 $@" if $@;

>>91
性器表現に困ったときはそうします。ありがとうございました。

93:デフォルトの名無しさん
08/05/10 19:00:21
Win32::OLEを使って wordドキュメントの編集をしようとしています。
読み出しはできるのですが、テキスト編集を受け付けてくれません。

下記のようなソースで、「ABC」→「abc」としたいのですが、元の「abc」のまま出力されてしまいます。
どのようにしたらよいでしょうか?
WindowsXP SP2上で、ActivePerl 5.10と、5.8.8で試してみました。

-------------------
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Word';

$word = Win32::OLE->GetActiveObject('Word.Application') || Win32::OLE->new('Word.Application', 'Quit') || die;
$doc = $word->Documents->Open( 'test.doc' ) || die;
$paras = $doc->Paragraphs;

foreach (in $paras){
 $_->Range->{'Text'} =~ tr/A-Z/a-z/;
 print $_->Range->{'Text'}."\n";
}

$doc->Close( 0 );
-------------------


94:デフォルトの名無しさん
08/05/10 22:36:57
URL転送なんだけど今こうしてます↓

#!/usr/bin/perl
print "Location: URLリンク(*****\n\n)";

これに転送するまでHTMLの<meta content="x">みたいに
一定時間ウェイトかける事って出来るのでしょうか?







95:デフォルトの名無しさん
08/05/10 22:55:03
いいえ

96:デフォルトの名無しさん
08/05/10 23:04:42
>>94
>>1

97:デフォルトの名無しさん
08/05/11 02:50:29
>>94
できなくはないがやるな。
それと>>1

98:デフォルトの名無しさん
08/05/11 12:59:18
教えて先生!
01 や 11 などの文字列を数値に変換するにはどうすればいいの?

99:98
08/05/11 13:26:41
自己解決っす
他のスクリプト同様 -0 でよかったのかw

100:デフォルトの名無しさん
08/05/11 14:17:20
intでいいよ

101:デフォルトの名無しさん
08/05/12 21:23:54
モジュールでモジュールのファイル位置を知るにはどうしたらいいでしょうか?
|-foo.pm
|-data/data1
こんな感じのフォルダ構造になってて、foo.pmの中からdata1を相対参照したいのです。


102:デフォルトの名無しさん
08/05/12 21:31:33
あとcgiとして使う場合。cgiが呼ばれる度毎回dataファイルを読み込むのは処理が重くなると思うんですよ。
最初の一回だけ読み込む方法とかありませんか?

103:デフォルトの名無しさん
08/05/12 22:57:05
mod_perl

104:デフォルトの名無しさん
08/05/12 23:35:05
fastcgi

105:デフォルトの名無しさん
08/05/13 00:00:09
>>103 >>104
有難うございました。fastcgiを調べてみます。

106:デフォルトの名無しさん
08/05/13 00:14:04
>>105
Speedy-CGI

107:デフォルトの名無しさん
08/05/13 00:18:38
perlはインタプリタだから、見下すべき言語なんだろ?

108:デフォルトの名無しさん
08/05/13 00:36:37
perlはコンパイラつんでます。

109:デフォルトの名無しさん
08/05/13 00:37:57
所詮JIT

110:デフォルトの名無しさん
08/05/13 13:52:10
質問です。

package number;
sub get_codeNumber(){
my $number = 1;
if ($number > 0){
print "0より大です。";
}else{
print "0以下です。";
}
}
このplをローカルで実行しても何もコンソールに表示されません。
これをコンソールに表示するには、どうしたらよいのでしょうか。教えて下さい。

111:デフォルトの名無しさん
08/05/13 13:56:45
>>110
そんな断片だけ書かれていては釣りだとしか思えない

112:デフォルトの名無しさん
08/05/13 14:03:43
>>111
サブルーチンの中身をデバッグしたいのです。

113:デフォルトの名無しさん
08/05/13 14:13:19
>>112
問題がサブルーチン内にあるとわかっているのですか?

114:デフォルトの名無しさん
08/05/13 14:20:44
>>113
いいえ。perlの仕事がはじめてなのですが、
渡されたサブルーチンが仕様通りに動いているかを自分で確認したくて書き込みました。

Javaでいうと、
public class hoge1{
System.out.println("0より大です。");
}
public class hoge2{
System.out.println("0以下です。");
}
のような確認をしたかったのですが、おかしいでしょうか。


115:デフォルトの名無しさん
08/05/13 14:24:25
呼べ

116:デフォルトの名無しさん
08/05/13 14:30:44
>>114
ごめん,俺に理解力がないせいか何をしたいのかがよくわからない.
もうちょっと詳しく説明してくれたら助かるんだが.

117:デフォルトの名無しさん
08/05/13 14:42:28
もうちょっと実際のplに近いものを書いてみます。
お待ち下さい。

118:デフォルトの名無しさん
08/05/13 14:42:50
package number;
#sub get_codeNumber(){
my $number = 1;
if ($number > 0){
print "0より大です。";
}else{
print "0以下です。";
}
#}

119:デフォルトの名無しさん
08/05/13 14:55:04
>>118
単純に改行が入ってないからとか
stdout が flush されてないからとか
じゃないよね?


120:デフォルトの名無しさん
08/05/13 14:58:48
ちゃんと実行されてるかどうかがあやしいような

121:デフォルトの名無しさん
08/05/13 15:05:45
#torikomi.pl

package torikomi;

#戻り値:String(分類コード)

sub get_code(){
    ($organizationcode,$sectioncode,$itemcode) = @_;
    
    $itemcode = "999999";
    
    my $i1cd       ="";
    my $i2cd       ="";
    my $i4cd       ="";
    
    $i1cd=substr($itemcode,0,1);
    $i2cd=substr($itemcode,0,2);
    $i4cd=substr($itemcode,0,4);
    
    
    if($itemcode eq "000000"){ 
        return "A00";
    }
    if( $itemcode eq "999999" ){
        return "Z00";
    }
}

このperlが、きちんとA00やZ00を返しているかを確認したいのです。

122:デフォルトの名無しさん
08/05/13 15:11:54
「サブルーチンの中」を詳細に書けっていうんじゃなくて、
それを呼び出す側とか、実行している環境とかの詳細を書けって話だと思うよ。

123:デフォルトの名無しさん
08/05/13 15:37:02
あー、呼び出す側や実行環境のソースはもらっていません。

124:デフォルトの名無しさん
08/05/13 17:03:19
質問です。
1つのデータを複数に分割して、それぞれをgnuplotで
表示しようとしているのですが、実行すると

gnuplot> 'plot './X1.txt' using 1:2 w l 1'
      ^
line 0: invalid command

という風なエラーが分割したデータ全てに対して出ます。
(X1.txtというのが分割したデータの1つです。)
分割まではうまくいっているので、gnuplotの部分で問題があると思うのですが、
わかる方がいましたらよろしくお願いします。
gnuplotの部分のプログラムは以下のような感じです。

for( $j = 0 ; $j < 10 ; $j++ ){
open ( GP "| gnuplot -persist" )
or die "no gnuplot";
print GP "set term postscript color 20\n" ;
print GP "set output './X1.eps\n'" ;
print GP "plot './X1.txt' using 1:2 w l 1\n" ;
close GP;
}

125:デフォルトの名無しさん
08/05/13 17:08:42
>>124
スレ違いだが、、、
w l 1 の「1」って何だ? そんなのあったっけ?



126:124
08/05/13 17:14:59
>>125
スレ違いで申し訳ありません。
perlでプログラム書いてたんで、perlのスレで質問した方がいいかなと・・・

「1」はlineの色ですのであまり気にされなくても大丈夫です。


127:デフォルトの名無しさん
08/05/13 17:20:15
>>125
色だか線種だかを1に指定ってことだったはず.

>>124
gnuplotに流してるコマンドの最初と最後にいらないシングルクオートが入ってるせいじゃないかな?
このコピーでは問題なさそうだけど,ソースのprint文を確認してみたらいいと思う.

128:デフォルトの名無しさん
08/05/13 19:57:39
' なんてコマンドはねえよ、って言ってるだけじゃねえの?

129:124
08/05/13 23:28:23
124です。
124で書いたプログラムの間違いに気づきました。
プログラム中の「X1」は「X${j}」でした。
じゃないと、for文の意味ないですもんね。。。
あと、今自分で間違いに気づきました。
print GP "set output './X1.eps\n'"
じゃなくて、
print GP "set output './X1.eps'\n"
でしたorz
こんな簡単なミスに気づかないとは。。。
大変ご迷惑おかけしました。


130:デフォルトの名無しさん
08/05/14 00:54:44
>>121
>このperlが、きちんとA00やZ00を返しているかを確認したいのです。
Test::Base使えば良いじゃん。

131:デフォルトの名無しさん
08/05/14 02:52:29
asciiコードを16進数に変換するにはどうしたらいいでしょうか?
printf "%x","a"
こんなことやっても上手くいきません
61と表示させたいです

132:デフォルトの名無しさん
08/05/14 03:04:43
URLリンク(www2u.biglobe.ne.jp)
これみたら分かりました

133:デフォルトの名無しさん
08/05/14 03:21:56
grepでデータ中から目的の行を検索したいのですが
grep(/$foo/i, @ary);
・ignore caseは使いたい
・$fooは「+」などのデータが含まれており、そのままgrepすると正規表現と解釈されてエラーになる
・正規表現はつかわない
何かよい方法はないでしょうか?


134:デフォルトの名無しさん
08/05/14 03:32:47
>>133
quote (disable) pattern metacharactersの出番

135:デフォルトの名無しさん
08/05/14 03:35:23
ありゃッ、先頭が抜けた。

>>133
\Q quote (disable) pattern metacharactersの出番

136:デフォルトの名無しさん
08/05/14 04:14:43
>>134
grep(/\Q$foo\E/i, @ary);
でいけました。ありがとうございます

137:110
08/05/14 15:58:33
メインルーチンとの結合でうまくいきました。
相談に乗ってくれた方、ありがとうございました。

138:デフォルトの名無しさん
08/05/14 23:04:47
Windows環境で、ディレクトリ一覧を取得、正規化してリネームしたくて
いろいろやってるんだが、shift-jisの文字の扱いに苦労してる
ひょっとしてPerlでやるのあんま向いてなかったりする?

139:デフォルトの名無しさん
08/05/14 23:14:21
Unicodeであつかえばいいだろ。

140:デフォルトの名無しさん
08/05/15 19:33:10
あまりPERLの構文詳しくないので誰か教えてください
こんなのを作ってみたのですが
sub cont{print "contents\n";}
sub html{print "<html>\n"; $_[0](); print "</html>\n";}
sub body{print "<body>\n"; $_[0](); print "</body>\n";}
body(\&cont);
html(\&cont);
これを、出力が<html><body>cont</body></html>となるように
呼び出したいのですが可能でしょうか
↓動かないですが、こんな感じのことがやりたいです
1. html(\(body(\&cont));
2. sub f{html(\&&_[0]);} f(\&html);
3. sub g{$f=shift; html(\&f);} g(\&html);

141:デフォルトの名無しさん
08/05/15 19:43:23
>>140
こういうことか?

sub cont { print "contents\n"; }
sub html { print "<html>\n"; shift->(); print "</html>\n";}
sub body { print "<body>\n"; shift->(); print "</body>\n";}
html(sub { body(\&cont) } );

142:140
08/05/15 19:58:14
おお、想定通り動きました。ありがとう。

143:デフォルトの名無しさん
08/05/15 20:19:38
use strict;
use warnings;
sub binding{ my($F,@P)=@_;sub{$F->(@P)} }
sub cont {print "contents\n";}
sub html {print "<html>\n"; shift->(); print "</html>\n";}
sub body {print "<body>\n"; shift->(); print "</body>\n";}
sub cont2 {return "contents\n";}
sub html2 {return "<html>\n",shift->(),"</html>\n";}
sub body2 {return "<body>\n",shift->(),"</body>\n";}


html( binding( \&body => \&cont ) );
print html2( binding( \&body2 => \&cont2 ) );


144:デフォルトの名無しさん
08/05/15 20:21:07
windows上のperlのGDモジュールで、
日本語フォントをjpg画像で出すサンプルってありませんか。
下のサンプルをmsgothic.ttcに変えて実行したら、
どうやっても・という文字になってしまいます。
URLリンク(x68000.q-e-d.net)


145:140
08/05/15 20:41:48
>>143
このbindingってやつナイスですね
これ参考に、1タグ多要素に拡張してみます


146:デフォルトの名無しさん
08/05/15 21:51:34
>>144
PerlMagickでできるかも。
まー、内部はGDかもしれないから、同じ結果かも知れない。


147:デフォルトの名無しさん
08/05/15 22:05:34
>>144
よくわからんが、文字コードの問題とか?

148:デフォルトの名無しさん
08/05/15 22:32:06
>>144
utf8か、フォントファイルを絶対パスで指定かな。
Imagerも良いよ。

149:プヨー
08/05/16 18:03:07
Perl で Lisp のマクロのようなものを使うことはできないの?
遅延評価する仕組みがほしい。

Func1( ...exp1..., ...exp2....);
という呼び出しがある場合、状況に応じて exp1, exp2 の
いずれか一方だけを評価したい。

Func1( sub { ...exp1...}, sub {...exp2...} );
のように無名関数を渡す方法は思いついたが、
記法が簡単でないので、もっと簡単に記述できる方法がいい。

150:デフォルトの名無しさん
08/05/16 19:09:34
>>149
Lispは名前しか知らないけど、「状況に応じて」の部分を条件文にすればいいんじゃない?
関数を呼んだ時点では、引数の値が決定してないってこと?
そうだとしても、値が決定するまで待つとかすればいいような気がする。
Lispがわからない人でもわかる説明で。


151:プヨー
08/05/16 19:31:07

> Lispは名前しか知らないけど、「状況に応じて」の部分を条件文にすればいいんじゃない?

そうなんだけど、
if (,,,) { ... } else {...}
のような定型化した条件文が大量にあるから、きれいじゃないんだよね。
それよりも、単に
Func1( ...exp1..., ...exp2....);
のように書けば一行ですむから、保守性が高くてクールだよね。

> 関数を呼んだ時点では、引数の値が決定してないってこと?
そう。Lisp のマクロというのは、必要に応じて引数を eval するみたいなものだよ。

Lisp のマクロはコードを簡単化するために使われることが多い。

152:デフォルトの名無しさん
08/05/16 20:02:14
>>151
sub exp1{ .... }
sub exp2{ .... }

Func1(\&exp1, \&exp2)

でいいんでないの?

153:デフォルトの名無しさん
08/05/16 20:02:34
>>151
質問が漠然すぎるんだが、、、
my %hash = (
 foo => sub { print "foo\n" ; },
 bar => sub { print "bar\n" ; },
);
$hash{foo}->() ;

こう言うこととかしたいのか?
それともif文を三項演算子?

154:デフォルトの名無しさん
08/05/16 20:04:34
常に先行評価のPerlで急に遅延評価になったら保守性が著しく低下するだろ
sub { } で我慢しろ。どうしても黒魔術を発明したいならソースフィルタを使って何とかすればいい

155:デフォルトの名無しさん
08/05/16 20:30:18
exp1,exp2が長い場合、保守性がいいとは思えないし
>>149が考えたコードも改行位置ちょっと変えてあげれば複雑にはみえないし
関数を読んだ時点で引数の値が決まってないのは
コードがタコなだけな気がしてならないので
せめて、もう少し具体的に書いてもらえないかな

とりあえずFunc1の中でevalしたいならそうすればいいんじゃ?
Func1(
 q(...exp1...),
 q(...exp2...)
);
sub Func1 {
my($exp1,$exp2) = @_;
#なんかいろいろ
my $exp = $COND ? $exp1 : $exp2;
eval "$exp";
}



156:デフォルトの名無しさん
08/05/16 21:45:27
初歩的な質問で申し訳ないのですが

クッキーにデータを入れるときエスケープなどの処理をしてから入れたほうがいいのでしょうか?
よろしくお願いします。

157:デフォルトの名無しさん
08/05/16 23:13:35
>>156
URLエンコードと同じエスケープがいるよ。
日本語化されたRFCもあるから、読んでみれば?
もっと簡単にやるなら、CGIモジュールに全部任せる。


158:デフォルトの名無しさん
08/05/16 23:57:48
>>157
なるほど。クッキーはURLエンコードですか。勉強になりました。

159:デフォルトの名無しさん
08/05/17 01:38:05
最終的に決められた文字だけになるなら、任意のエスケープ方式でいい

160:デフォルトの名無しさん
08/05/17 13:25:57
要素数が同じlistとvalueがあるときに、同じ添え字の処理ってどうやって書きますか?
#こんなのがほしい・・
for $i $j(@list @value){print "$i=$j";}

タプルみたいなのがあれば使いたいんですが
やっぱり添え字をインデックスにしてループするしかないんですかね

161:デフォルトの名無しさん
08/05/17 13:35:43
どういうときに便利になる?
その例でもwhile shiftで事足りるし。


162:デフォルトの名無しさん
08/05/17 13:40:01
use List::MoreUtils qw(each_array);

163:デフォルトの名無しさん
08/05/17 13:54:11
zipWithを書けばおk

164:デフォルトの名無しさん
08/05/17 13:55:32
単に短く書きたかっただけなんですが、あまりPERL使いこなせてはないので・・
shiftだとこんな感じでしょうか。
while(@list){print shift @list;print "=";print shift @value;}
これはこれで、短くていいですね。


165:デフォルトの名無しさん
08/05/17 13:57:38
while($i=shift@list and $j=shift@value){print "$i=$j";}

166:デフォルトの名無しさん
08/05/17 14:04:10
>>162
 オブジェクト指向部分はあまりわかってないので後ほど調べてみます。
>>163
 sub zipwith{shift->(shift,shift);}こんな感じですかねw
 ちゃんと動くかはこれから試してみますが・・
>>164
 こっちのが全体的にいいですね、トン






167:デフォルトの名無しさん
08/05/17 14:38:21
練習がてら作ってみました
@a=qw(a b c);
sub zipwith{($f,$l,$r)=@_;while($i=shift @$l and $j=shift @$r){$f->($i,$j)}}
zipwith(sub{($a,$b)=@_;print "$a=$b\n";},\@a,[1,2,3]);

関数へ複数の配列を渡す際にはリファレンスにしないとだめってのは少し不便ですね

168:デフォルトの名無しさん
08/05/17 17:31:48
perlの勉強中で
カメラ 785円
お菓子 98円

という文字列がファイルであるのですが

if(円という文字を含んでいたら)
$temp = "円より前の数字";

という風に文字の抽出を行いたいのですが
正規表現の部分と、抽出の部分がわかりません
ファイルの読み込みから1行だけを取り込むのは出来たのですが

ご指導お願いいたします。

169:デフォルトの名無しさん
08/05/17 17:55:32
/円/ and $temp = $`;

170:デフォルトの名無しさん
08/05/17 18:12:27
すいません、上手く動かないみたいです

171:デフォルトの名無しさん
08/05/17 18:23:41
ちょっとかんべん

172:デフォルトの名無しさん
08/05/17 22:31:48
perlっていうかsendmailについてなんですが…
open(MAIL, "| /usr/sbin/sendmail -t env_addr") or die $!;
# 中略
close(MAIL) or die $!;
のように、パイプ渡しでopenするとき、closeに失敗するときがあるんですが、このとき
エラーメッセージを捕捉する方法どなたかご存じですか? $!には入ってこないのです。

173:デフォルトの名無しさん
08/05/17 22:34:32
>>172
エラーメッセージは何処に出るの? 標準出力ならIPC::Open2, 標準エラー出力ならIPC::Open3参照。

174:デフォルトの名無しさん
08/05/19 11:53:11
#!/usr/bin/perl

$inputfile="test.txt";
open (FILE1, ">>$inputfile") or die "$!";

for ($hoge=0;$hoge<10;$hoge++) {
print FILE1 "$hoge";
  sleep(1);
}
close (FILE1);

このプログラムを同時に2つ実行すると、私の予想ではtest.txtの中身は
00112233445566778899
となると思うのですが、なぜかファイルの中身には
01234567890123456789
と出力されます。
perlは排他制御が勝手に行われたりするんでしょうか?

175:デフォルトの名無しさん
08/05/19 11:54:52
バッファリングされてるから

176:デフォルトの名無しさん
08/05/19 11:56:39
>>175
どういうことでしょうか?
もし正しくバッファリングされるのならflockなどの排他制御は不要な気が…。

すいませんがもう少し詳しくお願いします。

177:デフォルトの名無しさん
08/05/19 12:05:50
どのタイミングでflush()されるかわからないのに、それに依存しちゃダメでしょ
ちゃんと排他制御しなよ


178:デフォルトの名無しさん
08/05/19 12:27:50
なんとなーく分かりました。ありがとうございました

179:デフォルトの名無しさん
08/05/20 19:30:53
cryptの返り値はsaltと同じ半角英数字、半角スラッシュ、半角ピリオドの範囲で
salt2文字と残り11文字ってことでってますでしょうか。

180:デフォルトの名無しさん
08/05/20 19:31:58
あってますでしょうか、の誤字でした。あとあげます。

181:デフォルトの名無しさん
08/05/20 20:50:16
いいえ。ホストのcrypt(3)に依存です。

182:デフォルトの名無しさん
08/05/20 20:53:22
マニュアルを読むのは身分の低い下賎の民の仕事なので、
高貴な方々は、他人にマニュアルを読ませます。


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5368日前に更新/139 KB
担当:undef