トップページ⇒tech
1001コメント331KB

Perlについての質問箱 18箱目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/09/18(日) 02:23:25
"The duct tape of the Internet" こと、Perlについての質問箱です。
"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。

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

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

http://www.perl.org/get.html
● 2005/03/17現在の最新版: 5.8.7
● 2005/03/17現在の開発版: 5.9.2

リンク集は>>2-3
過去スレは>>4-5
0153デフォルトの名無しさん2005/09/27(火) 21:00:150
>>150
find . -type f | xargs perl -ne 'if(/<div.*?class=(.*?)[ >]/){print $1,"\n"}' | sort | uniq

厳密に"perlで"とは指定されてないからシェルスクリプトで作ってやったぜ。
perlは使ってやってるから、
お前にやる気があるなら純Perlスクリプトの参考にはなるだろ。
0154GiantLeaves ◆6fN.Sojv5w 2005/09/27(火) 21:21:040
[>>150]に関して、Perlでどうやってファイルを読み込むのか?
同じディレクトリにあるファイルを読み込むのならできる。
ディレクトリの再帰検索もできるのかな?
0155デフォルトの名無しさん2005/09/27(火) 22:12:51ID:0
>>152
らくだ本によれば、strict 'vars' は、「myで宣言されている」
「完全修飾されている」「輸入されている」のいずれにも該当しない
ような変数にアクセスすると、コンパイル時エラーを発生させる、
とある。%ABCは、その何れにも該当しない。

型グロブを使うのを止めて、リファレンスを使うのが最適であると
思われる。
0156デフォルトの名無しさん2005/09/27(火) 22:59:13
>>150
>>154
File::Find使えよ
0157GiantLeaves ◆6fN.Sojv5w 2005/09/27(火) 23:04:04
talk:>>153 [>>150]をbashなどに通して実行するのもまだ成功していないが、それより、余計な引用符が付いてきたりしないか?
0158デフォルトの名無しさん2005/09/27(火) 23:09:31
>>152
sub test {
local(*ABC) = @_;
our %ABC; # 追加
print keys(%ABC);
}

とかじゃ駄目だった?
01591532005/09/27(火) 23:33:02
御指摘の通りだが'と"がこんがらがって
エスケープがひどいことになるのでめどくなって投げた。

実用上はそんなに問題ねえだろ、という手抜き精神が重要ってことだ。
0160デフォルトの名無しさん2005/09/28(水) 00:40:04
ここにも我流記号を使うあの気違いが来た
0161デフォルトの名無しさん2005/09/28(水) 01:40:33
sub testに間違いなくハッシュが渡されるなら
sub test {
>>152
my %ABC = @_;
print keys(%ABC);
}
で、良いと思うのだが。
localで型グロブなんて何年前のソース読んで勉強してるんだ?
0162デフォルトの名無しさん2005/09/28(水) 02:42:08
>perlcc -o test.exe test.pl
active perlに標準で付いてるperlccなのですが、
ライブラリが足りないと怒られます
Note (probably harmless): No library found for oldnames.lib
Note (probably harmless): No library found for kernel32.lib
Note (probably harmless): No library found for user32.lib
Note (probably harmless): No library found for gdi32.lib
Note (probably harmless): No library found for winspool.lib
Note (probably harmless): No library found for comdlg32.lib
Note (probably harmless): No library found for advapi32.lib
Note (probably harmless): No library found for shell32.lib
Note (probably harmless): No library found for ole32.lib
Note (probably harmless): No library found for oleaut32.lib
Note (probably harmless): No library found for netapi32.lib
Note (probably harmless): No library found for uuid.lib
Note (probably harmless): No library found for ws2_32.lib
Note (probably harmless): No library found for mpr.lib
Note (probably harmless): No library found for winmm.lib
Note (probably harmless): No library found for version.lib
Note (probably harmless): No library found for odbc32.lib
Note (probably harmless): No library found for odbccp32.lib
Note (probably harmless): No library found for msvcrt.lib
これらのライブラリを入手したいのですがどうすればいいでしょうか?
0163デフォルトの名無しさん2005/09/28(水) 04:02:23
>>162
perlcc はどうせ使い物にならないから
諦めなされ。
0164デフォルトの名無しさん2005/09/28(水) 06:32:46
>>162
またお前か
0165デフォルトの名無しさん2005/09/28(水) 08:17:28
>>161
それだとhashをリストにばらしてからまた再度作るようになって
要素数が多いとオーバーヘッドが馬鹿にならんよ。お前もどういう
ソース読んで勉強してるんだ(w
0166デフォルトの名無しさん2005/09/28(水) 08:28:18
>>162
お前は自民党のタイゾーか
0167ヽ(´ー`)ノ ◆.ogCuANUcE 2005/09/28(水) 10:07:56
>>151

    $telnet->cmd('terminal-type vt100');

とかいう話ではなくて?
0168デフォルトの名無しさん2005/09/28(水) 10:59:47
>>167

$telnet = new Net::Telnet::Cisco(Host => "xxx.xxx.xxx.xxx")

もしくは

$telnet->login(loginName => "user")

の時点で設定したいのです。

一般的なtelnetコマンドはセッション開始時にヘッダ部に
Terminal Typeが入ってるみたいなのですが…
0169デフォルトの名無しさん2005/09/28(水) 11:35:02
日付連番を考えているんですが、timeで取っていらない部分を削った後、番号を
付けたいのですが

2005/09/28 → 20050928 → 2005092801(後付けで番号を入れる)

何かうまい書き方ないですかね。
ご教授お願い致します。

0170ヽ(´ー`)ノ ◆.ogCuANUcE 2005/09/28(水) 11:41:26
>>168
Net::Telnet の TELOPT_TTYPE で出来ない?
今手元に好き勝手できる Cisco ルータがないから試せないけど。

>>169
やりたいことが上手く伝わってこない。

my $date = '2005/09/28';
$date =~ s,/,,g;

my $result = $date . sprintf('%02d', $num);

こういう話じゃなさそうだが…。
0171デフォルトの名無しさん2005/09/28(水) 12:05:59
>>169
素直にtimeの戻り値を連結すれ。
0172デフォルトの名無しさん2005/09/28(水) 12:08:31
>>170
レスありがとうございます。

Net::Telnetのドキュメントなど色々みたのですが
いまいちTELOPT_TTYPE(@EXPORT_OK)の設定方法が
よくわからなくて…

こいつにvt100設定すればいいのかなぁ?
0173デフォルトの名無しさん2005/09/28(水) 12:10:53
>170>171
ありがとうございます。
素直に連結しようかと思います。
0174デフォルトの名無しさん2005/09/28(水) 12:11:32
>>169
素直に

$seq = 1; ←連番
@t = localtime(time);
$result = sprintf("%04d%02d%02d%02d", $t[5] + 1900, $t[4] + 1, $t[3], $seq);

じゃダメなの?
0175デフォルトの名無しさん2005/09/28(水) 12:23:19
>>172
http://search.cpan.org/src/AJWOOD/Term-VT102-0.82/VT102/examples/telnet-usage.pl
こんな感じじゃね
0176デフォルトの名無しさん2005/09/28(水) 13:32:49
>>175
無事Terminal Typeの設定ができました。

レス下さったみなさん、ありがとうございましたm(_ _)m
0177デフォルトの名無しさん2005/09/28(水) 13:57:56
文中に複数ある「;」を全て「\;」に変換するスクリプトを書きたいのですが
どうしたらいいでしょうか?
うまい置換式が思い浮かばなくて・・・
0178デフォルトの名無しさん2005/09/28(水) 14:04:23
s/;/\\;/g;
0179デフォルトの名無しさん2005/09/28(水) 14:35:15
>>178
どうもありがとうございます
0180デフォルトの名無しさん2005/09/28(水) 15:04:57
>うまい置換式が思い浮かばなくて・

こういう嘘つきにはレスすんなよ
0181デフォルトの名無しさん2005/09/28(水) 15:39:53
>>180
半島に帰れ!!!
0182デフォルトの名無しさん2005/09/28(水) 15:41:28
>>180の言うことはもっとも。
>>181カエレ
0183デフォルトの名無しさん2005/09/28(水) 16:36:28
http://bekkoame.okweb.ne.jp/kotaeru.php3?q=1481001
漏れもこの質問者と同じ相談なんだけど、その回答者の中で、
「クリックした時の挙動はブラウザによるので、
たとえば全てのOS、ブラウザでダウンロードをさせたいとなると
CGIで処理するしかないと思います。
CGIと言ってもPerlなら4,5行程度でできます。」
と書いてあったんだけど、このPerl4,5行を詳しい人、書いてくり。
0184デフォルトの名無しさん2005/09/28(水) 16:58:26
早く書いてくり。
01851832005/09/28(水) 17:24:47
>>184は、俺じゃないよ
酷い・。・゚(ノД`)゚・。・ウワーン
0186ヽ(´ー`)ノ ◆.ogCuANUcE 2005/09/28(水) 17:44:19
>>183
#!/usr/bin/env perl
print "Content-Type: application/octet-stream\r\n\r\n" . `cat hogehoge.pdf`;

で駄目なん?
0187GiantLeaves ◆6fN.Sojv5w 2005/09/28(水) 19:02:31
[>>150]に関して。
div要素のclass属性の属性値を書き出すのだったら、
DOM (Document Object Model) の方がやりやすい。
JavaScriptで
document.getElementsByTagName("div");
をやって、全アイテムについて、該当する属性の属性値を書き出せばいいのだから。
ディレクトリの再帰検索を誰か解説してください。
0188ヽ(´ー`)ノ ◆.ogCuANUcE 2005/09/28(水) 20:10:50
use strict;
use warnings;

use HTML::Parser;
use File::Find;


my @class = ();

my $parser = HTML::Parser->new(
'api_version' => 3,
'report_tags' => [qw/div/],
'start_h' => [ sub { push(@class, $_[0]->{'class'}) if $_[0]->{'class'} }, 'attr' ],
);

my @file = ();
find({ 'wanted' => sub { -f && m/\.html$/ && push(@file, $_) }, 'no_chdir' => 1 }, @ARGV);

foreach my $file_name (@file) {
$parser->parse_file($file_name);
}

{
my %class_history = ();

foreach my $class (grep { ! $class_history{$_}++ } @class) {
print $class, "\n";
}
}
0189ヽ(´ー`)ノ ◆.ogCuANUcE 2005/09/28(水) 20:13:05
find_class.pl とかで保存して、

$ ./find_class.pl foo/ bar/baz/

とかで。
0190デフォルトの名無しさん2005/09/29(木) 01:11:41
ActivePerlがインストールされていないパソコン(出先でインストールできない等)でperlを実行するにはどうしたらいいのでしょうか?
USBメモリに入れて持ち運ぶ方法はないですか?
0191デフォルトの名無しさん2005/09/29(木) 01:33:10
鯖にうp。
0192デフォルトの名無しさん2005/09/29(木) 01:51:23
>>190
ttp://www.google.co.jp/search?hl=ja&c2coff=1&q=PAR+Perl&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
0193GiantLeaves ◆6fN.Sojv5w 2005/09/29(木) 11:43:48
talk:>>192 素直にActivePerlなどのインタプリタをインストールした方がいいような気もする。他人に渡すのならまた話は別だが。
0194GiantLeaves ◆6fN.Sojv5w 2005/09/29(木) 11:45:24
talk:>>190 どうにかしてWSHを使う。
0195GiantLeaves ◆6fN.Sojv5w 2005/09/29(木) 11:46:08
talk:>>190 Windowsに入っているのは、JScriptとVBScriptを動かせるエンジンなので注意。
0196デフォルトの名無しさん2005/09/29(木) 13:38:53
誇大妄想は誇大妄想らしく仰々しいsignatureつけとけ
0197デフォルトの名無しさん2005/09/29(木) 14:21:16
>>193
talk talk 五月蝿いし見にくいYO。
0198デフォルトの名無しさん2005/09/29(木) 15:19:32
>>193
Re:より糞
0199デフォルトの名無しさん2005/09/29(木) 15:36:56
文字列の一括置換を行いたいのですが、
特定のタグに囲まれたものだけを対象にかけたいと考えています。

ただ、
・対象となる文字列の点数
・置換前、置換後の文字は任意

という条件があるため、下のような状況の場合、
どうやって正規表現を組むか、悩んでいます。

<tuv> A A A </tuv>
↓AをAAに一括処理
<tuv> AA AA AA </tuv>

tuvタグで挟まれた文字列を変数に抜き出し
↓
変数に対して、A→AAの一括置換
↓
元の文字列と差し替え

という方法がベストなのでしょうか?
0200デフォルトの名無しさん2005/09/29(木) 15:52:27
ぱっと見て何してるかわかりやすく書くとすれば
s/>([^><]+)</&hoge($1)/eg;
sub hoge { my $set = shift; $set =~ s/A/AA/g; return $set; }
こんな感じ?
0201デフォルトの名無しさん2005/09/29(木) 15:52:30
テキストエディタに学校でも使ってる秀丸エディタを使おうと思ったんですが有料ソフトでした
みなさんお金払って使ってるんでしょうか、それともメモ帳を?
0202デフォルトの名無しさん2005/09/29(木) 16:03:08
>>201
世の中には秀丸とメモ帳しか無いとでも思っているのか?
0203デフォルトの名無しさん2005/09/29(木) 16:09:41
>>200 sageろヴォケ
スレ違いなので学校で先生に同じ質問しろ。
02042002005/09/29(木) 16:12:00
>>202いろいろ探してみます

>>203これでいいですか?掲示板のしくみよく分からなくてすみません
0205デフォルトの名無しさん2005/09/29(木) 16:18:39
>>204
スレ違い。どこの学校だ? 情報リテラシに読み書きも怪しそうだが…
02061992005/09/29(木) 16:34:50
>>200
ありがとうございます。なんとか理解できました。

>>203
ageてるのは、>>201のようですが…
よく見てくださいね。
0207デフォルトの名無しさん2005/09/29(木) 23:20:21
俺様ルールのsage厨に構うなよ。
スレ違いよりタチ悪いよ。
0208デフォルトの名無しさん2005/09/29(木) 23:29:10
学生なら秀丸は無料だったと記憶しているが。
0209デフォルトの名無しさん2005/09/29(木) 23:54:21
>>208
ソースは? ひょっとして "フリー制度へのお申し込み" の事を
単に無料と呼ぶのなら、誤解の元で迷惑にしかならないが。
0210デフォルトの名無しさん2005/09/30(金) 03:40:54
>>209
どう違うんだ?
0211デフォルトの名無しさん2005/09/30(金) 06:43:55
結論:秀丸使うやつは金払え
0212デフォルトの名無しさん2005/09/30(金) 07:00:48
で、いつになったらPerlの話題にもどるのかね?
0213デフォルトの名無しさん2005/09/30(金) 07:29:28
知らないなら中途半端な話題振るなよ
0214デフォルトの名無しさん2005/09/30(金) 08:30:54
すいません。自分のパソコンにパールを入れたいのですが
WindowsMeでもつかえるフリーのパールってありますか??
0215デフォルトの名無しさん2005/09/30(金) 08:50:18
>>214
http://www.activestate.com/Products/ActivePerl/

#ちなみに、フリーでないPerlってあるのかな?
0216デフォルトの名無しさん2005/09/30(金) 09:05:41
>>215
あんたが貼ったリンク先
0217デフォルトの名無しさん2005/09/30(金) 09:53:03
>>216
そりゃ、サポートサービスやオマケツールに対してのライセンスだろ?
Perl本体そのものはフリーで、個人であろうと企業であろうと無償で使うのは
問題ないから、心配すんな >>214
0218デフォルトの名無しさん2005/09/30(金) 10:04:04
>>217
こういう話のときは入手するブツを単位に考えるのが自然じゃね?


0219デフォルトの名無しさん2005/09/30(金) 12:10:48
>>190
何のモジュールもuseしてなければ、perl.exeとperl5.8.x.dll?さえ
添付してれば動く。
それにバッチファイル付けて知り合いにスクリプトあげたことある。
0220デフォルトの名無しさん2005/09/30(金) 18:45:37
定期的に、ID/PWを求められるページにログインする事はperlで出来ますかっ?!
0221デフォルトの名無しさん2005/09/30(金) 18:49:25
何のパスワードだよ
0222デフォルトの名無しさん2005/09/30(金) 18:51:20
IDとPWを入力を求められる、アクセス制限のかかったページにログイン、という意味でした。
0223デフォルトの名無しさんNGNG
perlとどう関係あるのか小一時間休憩してみたい。。。
0224デフォルトの名無しさん2005/09/30(金) 21:22:57
>>220
スレ違い
0225デフォルトの名無しさん2005/10/01(土) 02:14:40
>>155>>158>>161
助言ありがとうございます。
our
のおかげでハッシュの値は表示できました。
しかし、$ABC{'xxxx'} を表示できません....
0226デフォルトの名無しさん2005/10/01(土) 11:50:29
>>220
>定期的に、ID/PWを求められるページにログインする事はperlで出来ますかっ?!

「定期的に」という意味が不明だが、多分、
LWP::UserAgentを使えばできるんじゃないかな。
http://www.hio.jp/translation/perldoc/lib/LWP/UserAgent.html

これ見て解らないときは、Webプログラム板のスレ↓で質問したほうがいいね。

Perlコーディング初心者質問スレ Part 43
http://pc8.2ch.net/test/read.cgi/php/1123777607/l50
0227デフォルトの名無しさん2005/10/01(土) 14:08:02
できそうでなかなかできません。どなたか助けてください。

>abc.3
gakjgajgeiajeiagaga
>sasa
sagageijgeigjeijaiejeiajwjojowjowewgeweeeee
>ushi.1
safakljgeijgleijelaijealijeliajelammmziej
....
のようなファイルを、abc.3という名前のファイルに
>abc.3
gakjgajgeiajeiagaga
sasaという名前のファイルに
>sasa
sagageijgeigjeijaiejeiajwjojowjowewgewe
のように、分けてそれぞれ名前をつけるにはどう書けばよいのでしょうか?
0228デフォルトの名無しさん2005/10/01(土) 14:15:34
open(F,$ARGV[0]);
while(<F>){
open(FH,">$1") if(m/^>(.+)/);
print FH $_;
}
0229デフォルトの名無しさん2005/10/01(土) 15:15:11
>>227
何がしたくてどういう法則で名前付けたいの?
0230デフォルトの名無しさん2005/10/01(土) 21:02:50
>>229
マルチファスタファイルの分解でしょうな、きっと。
02312272005/10/01(土) 23:37:18
ありがとうございました。
プログラムにするとこんな短くていいのですね。
本当に助かりました。
0232デフォルトの名無しさん2005/10/02(日) 02:24:55
かなり初心者ですが教えて下さい m(_ _)m
今タイピングゲームを作ってます。
普通に提示した文字を入力してOKかNGかを判断できるとこまではできたのですが、
一定時間以内に入力されなかった時にNGとなるようにしたい。
forkを使ってるんですが、どうもうまく行きませんorz
forkは間違ってますか?
他にいい予約語調べたのですがわかません。
入力待ち状態(時間制限)と入力した文字の判断(OK/NG)の同時進行がうまく行かないorz
すいませんが教えて頂けませんかm(_ _)m
0233デフォルトの名無しさん2005/10/02(日) 03:17:23
お前にはムリ
0234デフォルトの名無しさん2005/10/02(日) 03:38:41
>>225
どうやって引数渡してる?

test( \%foo );

とかしてるんだよね?
こっちじゃ問題なく動くよ。
0235デフォルトの名無しさん2005/10/02(日) 05:53:35
Windows上のActivePerlではalarmとかうまく働かないな。
よくわからんけど。
0236デフォルトの名無しさん2005/10/02(日) 19:03:53
ActivePerlのインストーラ起動したら
「指定されたサービスは既に存在します。」
とか言われて起動すらできないんですが・・・
OSはWindows98SEです。
解決方法を教えてください。
0237デフォルトの名無しさん2005/10/02(日) 19:32:29
>>235
Perlのバージョン依存らしい。
5.8以降だとalarmも実装されているそうな。
0238デフォルトの名無しさん2005/10/03(月) 12:00:07
初心者です。
perlで一つのプログラムを複数(大量)のファイルに対してかけるときは
どういったやり方があるのでしょうか?

どなたか教えてください。
0239デフォルトの名無しさん2005/10/03(月) 12:04:01
なんだって─────!!!!
0240デフォルトの名無しさん2005/10/03(月) 13:31:22
>>238
シェルスクリプトかバッチファイル
0241デフォルトの名無しさん2005/10/03(月) 13:45:06
>>238
複数のファイルを処理するように書くといいです。
02422382005/10/03(月) 14:05:16
シェルスクリプトがよくわかっていないのかもしれませんが、

例えば、すべて頭にSTEPという文字列がつくファイルを一度に大量に
処理するときには,シェルでperl プログラム STEP*という使い方は
できないようですが、どうすればよいのでしょうか?

プログラムは$ARGV[0]でファイルを読み込んでいます。
0243デフォルトの名無しさん2005/10/03(月) 14:09:03
UNIXのシェルスクリプトなら
for i in STEP*; do
perl プログラム $i
done
でできると思う
0244デフォルトの名無しさん2005/10/03(月) 14:40:47
>>242
> シェルスクリプトがよくわかっていないのかもしれませんが
うん、その通りだ。
STEP* というのは、Perlに渡された段階で複数のファイル名に展開されてるんだよ。
だから、Perl側で($ARGVをshiftせずに)$ARGV[0] しか見てないのなら、
最初の1つしか処理できないのは当然。
0245デフォルトの名無しさん2005/10/03(月) 15:24:06
>>242
perlを起動すると、配列 @ARGV に、引数の一覧が入っている。
で、$ARGV[0]は配列@ARGVの先頭の要素な。

だから、
今のプログラムの処理のメインループを以下の構造で囲めば、
望み通りのことができると思うぞ。

while(@ARGV){
...
shift(@ARGV);
}
0246デフォルトの名無しさん2005/10/03(月) 15:35:29
いい加減ラクダ本卒業してPerldocだけで理解できるようになりたい。
仕事場までラクダ本持っていくのめんどくさい。
0247デフォルトの名無しさん2005/10/03(月) 15:42:59
>>246
まずラクダ本を持っていくのをやめるところからはじめよ。
0248デフォルトの名無しさん2005/10/03(月) 15:48:28
1つ前のラクダ本を持ってるけど、最新のは2巻になって
百科事典みたいに分厚くなったので、買い替えをためらってる…。
0249デフォルトの名無しさん2005/10/03(月) 15:53:59
何が増えたの?
0250デフォルトの名無しさん2005/10/03(月) 17:22:45
俺は赤ラクダ本もってるけど、
本が壊れる(背の部分が割れてページが抜けてくる)まで読んだ。
青ラクダがなかなか日本で出なかったので、perldocとCPANモジュール読みまくり。
黒豹は英語で読んだ。

で、青ラクダ出たときには、読むべきところが少なくて(赤ラクダとそう大して変わらん)、
そのままになってる。perldocで十分だな。個人的には。
02512362005/10/03(月) 20:58:08
うん、まあ、無視されるだろうとは思ってたよ。
前は普通にインストールできたんだけどね。
0252デフォルトの名無しさん 2005/10/03(月) 21:02:40
検索したいパターンが行の中のランダムな位置にある場合、ある検索したい
パターンにマッチしていたら表示するというのはどうやるのでしょうか?

位置が決まっていれば、/\w+\s(\w+)/などのように、正規表現を使ってできるのですが、
この場合は何を使えばよいのでしょうか?

■ このスレッドは過去ログ倉庫に格納されています