Perlコーディング初心 ..
[2ch|▼Menu]
404:nobodyさん
07/10/20 07:47:37 x+Q9ulv4
おはようございます。
以下のスクリプトについて質問です。
outフォルダ内の.txtファイル全てに対して
ある作業をするというスクリプトなんですが、
ファイルオープンのところでそんなファイルはないから
開けないというエラーが出力されます。

例:hoge.txtがある場合
OPEN ./out/hoge.txt file: No such file or directory at check line 22.

どこが間違ってるか教えてください。お願いします。
OSはWindowsXPです。

my @directories_to_search = ('./out/'); #対象のフォルダ
find(\&wanted, @directories_to_search);
sub wanted{
my $filePath = $File::Find::name;
my $find = index( $filePath, ".txt" ); #.txtを対象
unless ($find >= 0) {
return 1;
}
open FH_READ, "<$filePath"
or die "OPEN $filePath file: $!";
#ある作業をする。
close FH_READ;
}

405:nobodyさん
07/10/20 08:21:11
>>404
22行目ってホントにopen文の所か?

406:404
07/10/20 08:33:09
>>405
え?open文のor dieのエラーメッセージが出力されているから
open文でエラーが発生していると思うんですが・・・

407:nobodyさん
07/10/20 10:42:05
読んで字の如しとしか。
まさかmod_perlじゃないよな?

408:nobodyさん
07/10/20 10:55:56
>>404
openに渡すのは「$filePath」じゃなくて「$_」
File::Findの解説ちゃんと読め

409:半角全角が混在する行が一定の文字数を超えたら折り返すようにしたい
07/10/20 14:21:49 g/E6yd0f
メールフォームを作っています。同マシン上のsendmailを使って送るものです。

送信するメールの本文において、半角全角が混在する行の文字数を数え、
一定の文字数(例えば半角72文字、全角36文字)を超えた行だけを
強制的に折り返したいと考えています。

どのようにするのがよいでしょうか?

lengthはバイト数を返す関数なので、
全角文字の真ん中で折り返されると困ることになると考えてます。

もしかすると、長い行はsendmail側が自動で折り返してくれたりするのでしょうか?
それとも、何かほかの関数で簡単に数えたりできるのでしょうか?

なお、カスタマイズの自由度を考えて自作しているので、
「どこそこのメールフォームを使え」というのは勘弁してください。

以上、よろしくお願いします。

410:nobodyさん
07/10/20 14:28:07 o1wAy6B9
eval ($hoge); の実行した値を変数に入れるにはどうしたらいいでしょうか?

$@ だと、evalでのエラーの値が入る
でも、実行値は...?

お願いします。



411:nobodyさん
07/10/20 14:37:23
>>410
$result = eval($hoge);

じゃダメなん?($resultに実行結果、$@にエラーメッセージ)

参考
URLリンク(www.tohoho-web.com)

412:nobodyさん
07/10/20 14:55:48 o1wAy6B9
>>411 その通り!ありがとう。
短い$hogeだと関数が成功した1しか返さないことがあるようでアレ違うわと思っていました。

>>409
ちょっと離れるので投げっぱなしになってしまいそうだけど
解答してくれる人が現れる間に考えていました


use utf8;
use Encode;

$str = '
eval ($hoge); の実行した値を変数に入れるにはどうしたらいいでしょうか?
$@ だと、evalでのエラーの値が入る
でも、実行値は...?

お願いします。
';

@stream = split(/\n/,$str); #最初に渡された文字列を 改行 を区切りとして @stream に配列として読み込んだ
map{ s{(.......)}{$1\n}g } @stream; #”8文字”単位で改行を入れてる
map{print encode(sjis,$_)}@stream; #各行を出力するときにsjisに変換してる

とか、なかんじでどうよ?
ただし1バイト文字の扱いがなんか変。

*たぶんutf8でけつまずいてるかんじ。


413:nobodyさん
07/10/20 16:08:12
>>409
jcode.plかJcode.pmにjfoldってなかったっけ?

414:409
07/10/20 17:45:16
>>413
これです。こういう機能がほしかったんです。

jcode.plにはありませんでしたが、Jcode.pmにはありました。

これまで使っていたのがjcode.plだったのでが、
MIMEヘッダの機能も強化されているようなので、Jcode.pmに乗り換えようと思います。

どうもありがとうございました。

415:nobodyさん
07/10/20 18:24:36
いいかげんにEncode使い方覚えろよ

416:nobodyさん
07/10/20 19:12:39
>>415
じゃ、Encode.pmを使って折り返す方法を書いてあげれば?

417:nobodyさん
07/10/20 19:44:36
Encode::decodeしてlengthでカウントしてみろよ

418:nobodyさん
07/10/20 20:12:44
文字コードわかってんなら正規表現で簡単にできることだろ

419:nobodyさん
07/10/23 05:26:38
全部正規表現でやるのは重そうだな。

420:nobodyさん
07/10/23 14:21:34
正規表現で解決するならEncode要らんがな。

421:nobodyさん
07/10/23 15:27:18
Perlのテキスト処理で質問させてください。
UTF8な日本語テキストの半角カナを全角にしたいと思ってEncode::JP::H2Zを使おうと思いました。
しかし、一部の文字(〜など)がEUCに変換する段階で?に変換されてしまい、困ってしまいました。
とりあえず、コードポイントにフォールバックできることがわかったので、
以下のように書いてその場をしのぎましたが、コードポイントを検索して文字に置換するという
作業が入ってしまい(しかも無駄に複雑)、どうもしっくりきません。
もっと簡単にする方法はありますか?

$text = encode("eucjp", $text, Encode::FB_PERLQQ); # EUCに変換
Encode::JP::H2Z::h2z(\$text); # 全角変換
$text = decode("eucjp", $text);
$text =~ s/\\x\{([0-9A-Fa-f]+)\}/pack("U*", hex($1))/eg; # コードポイントを文字に

422:nobodyさん
07/10/23 17:42:25
>>421
#!/usr/local/bin/perl -w
use strict;
use Encode qw(from_to);
use Encode::JP::H2Z;

my $text = 'このファイルはUTF-8で〜半角カナ混じりの文字列';

from_to($text, utf8 => 'cp932');
from_to($text, shiftjis => 'euc-jp');
Encode::JP::H2Z::h2z(\$text);
print $text;
__END__

別解。
use Unicode::Japanese qw(unijp);
print unijp($text)->h2zKana->euc;

423:421
07/10/23 20:32:44
>>422
ありがとうございます。その変換法で化けなくなりました。
後学のためお聞きしますが、Encodeではutf8を直接EUCにマップできないのでしょうか。
SJISを経由するのはわかるのですが、cp932をshiftjisに読み替えるなど、
トリッキーなことをやっていますね。
機種依存文字(@など)がある場合もそうですが、utf8とEUCの変換法は
どうもよくわからないです。
機種依存文字とか、どうやってEUCに変換するんでしょうか

424:nobodyさん
07/10/23 22:43:56
「よくわからない」のは、EUC-JPとCP51932の関係じゃないのかな。

URLリンク(search.cpan.org)

425:nobodyさん
07/10/24 01:04:04
暗号化関連の質問です

メールフォームを使っててブラウザとサーバの間はSSLで暗号化してます
でもサーバからsendmailで送信するメールも暗号化してないと意味ないですよね?

Perlでどうやってやってます?S/MIMEかPGPが使えるの?(´・ω・`)

426:nobodyさん
07/10/24 01:05:27
そもそもメールを飛ばさないという選択肢を検討すべきではないか

427:421
07/10/24 02:01:47
>>424
なるほど、ぐぐってみてわかりました。
EncodeーEUCJPMSでcp51932も使えるようになるんですね。
標準のEncodeになんで実装しないんだろ、これ。


428:nobodyさん
07/10/24 06:10:09
>>425
URLリンク(search.cpan.org)
URLリンク(search.cpan.org)

求められる安全度、対象ユーザのITリテラシ、かけられるコスト
等を検討すると、暗号化メールの使えるシチュエーションは
かなり限られてそうだ。金融機関やNSPだと大抵郵送だな。

429:nobodyさん
07/10/25 16:41:10
スペースは or に変換するが、クォートにかこまれたスペースは変換しない。
これの実装がうまくいきません。
例えば
tenis ball は tenis or ball に変換するけど
'tenis ball' はそのままっていうのはなんとか出来たんですが、
'tenis ball' 'base ball' のときは
'tenis ball' or 'base ball' にするのがどうしても出来ません。
orを入れたい場所もクォートに囲まれてると判断されてしまうのです。
どなたか助けてください。

430:nobodyさん
07/10/25 17:03:22
>>429
my @list = (
  q{tenis ball},
  q{'tenis ball'},
  q{'tenis ball' 'base ball'},
) ;

for my $line ( @list ){
  print join ' or ',
     map{ /'/ ? $_ : split /\s+/, $_ }
     split /\s+(?=')/, $line ;
  print qq{\n} ;
}


431:nobodyさん
07/10/26 05:03:54
foreach(@list){
my @token = m/('[\w\s]*'|\w+)(?:\s+|$)/g;
print join (' or ', @token), "\n";
}

432:429
07/10/26 15:02:18
>>430
すみません、できるだけワードは固定してない方がいいのですが・・・うまく動きませんでした。

>>431
おぉ、なんかうまく動きそうです。
でも、クォートの部分を除外して配列に納めたいのですが、どうしたらいいのでしょうか?


433:nobodyさん
07/10/26 23:17:20
>>432
430は全角文字(スペースも含め)を半角に変換してもダメか?
それと「クォートの部分を除外」って意味が分らん。単に
クォートを削除したいだけなら、そのぐらいは自力で考えてみたら?

434:nobodyさん
07/10/27 10:01:02
Encode::JP::H2Z
ってなんでeucjpの糞使用なの?
ユニコードのまま渡せて処理出来ればいいのに。

435:nobodyさん
07/10/27 11:34:06
>434
そういうことはdankogaiに直接文句つけて来い

436:nobodyさん
07/10/27 13:36:03
>434
じゃあお前さんがそういうの作れば?

437:nobodyさん
07/10/27 16:43:19
>>434
Jcode::H2Z (Jcode.pm のサブモジュール) そのままだから。

438:nobodyさん
07/10/27 18:53:28
utf8もページからフォームを入力して送信させると、
「〜」の文字だけがなぜか正常に送信されないのですが、なぜでしょうか?


439:nobodyさん
07/10/27 22:19:08 jIrqvOa/
return +{};
という記述の意味を教えて下さい
空ハッシュを返すという事でしょうか?

440:nobodyさん
07/10/27 22:50:14
>>438
何を以て「正常に送信されない」と判断したのか。
Wikipedia項目リンク
URLリンク(euc.jp)
URLリンク(www.asahi-net.or.jp)

>>439
URLリンク(perldoc.jp)
> 単項演算子の "+" は、たとえ文字列に対して用いられた場合にも、
> 何もしません。関数名に続けて括弧付きの式を書く場合に、関数の
> 引数リストと解釈されないようにするために用いることができます。

441:nobodyさん
07/10/27 23:21:31 jIrqvOa/
>>440
ありがとうございます、単項演算子についてはわかったのですが
とあるCPANモジュールのコードで
return +{} unless $data;
というコードがあったのですがこれを
return {} unless $data;
と書かずに単項演算子の+をつけるのは
何か意図があるのでしょうか
戻り値自体はどちらでも同じような気がするのですが、、


442:nobodyさん
07/10/28 00:49:00
ブロックとして解釈される場合があるんじゃね

443:nobodyさん
07/10/28 04:52:46
+{ } :無名ハッシュでコンパイル
{; } :コードブロックでコンパイル

444:nobodyさん
07/10/28 08:38:20
URLリンク(www.nicovideo.jp)
Perlで予約語プログラミング

445:nobodyさん
07/10/28 08:48:47
URLリンク(www.nicovideo.jp)
Perl Programming: Web::Scraperモジュールの利用

↑これ何やってるの?

446:nobodyさん
07/10/28 08:54:29
URLリンク(www.nicovideo.jp)
Perl Catalyst Programming (入門編)

↑これも何をやっているのか、
さっぱりわからんよ

447:nobodyさん
07/10/28 09:22:22
まぁプログラミングを動画で見てもわからんよなw

448:nobodyさん
07/10/28 09:30:40
そうか?

この動画だけは「何をやろうとしてるか」だけは伝わるぞ
URLリンク(www.youtube.com)

449:nobodyさん
07/10/28 11:24:36
>>448
Aho da...orz


450:nobodyさん
07/10/29 02:42:49
>>446 にある動画はなんかおかしいと思う。

451:nobodyさん
07/10/29 11:17:19
質問させてください。
指定した文字が何回続いたかを取得したいのですがどうしたらいいですか?

例)この場合指定した文字は1です。
$a = '1111222';
$b = '1111136';

$aは4
$bは5

よろしくお願いします。

452:nobodyさん
07/10/29 11:56:14
$a='1111222';$i='1';($r)=($a=~m/($i{2,})/);print length $r
全角はシラネ

453:nobodyさん
07/10/29 11:59:30
$a = '1111222';
$c= 1;
$n= length(($a=~/((?:\Q$c\E)+)/)[0])/length($c);

454:nobodyさん
07/10/29 12:31:05
perlは色んなやり方があって面白いね

$a = '111111222';
$n = '1';

$count = length(($a =~ /($n+)/)[0]);

455:nobodyさん
07/10/29 13:04:18
>>451
$test_str = '111234111111';
$char = '1';

こういう場合は後半気にせず、まず見つけた連続の 3 でいいの?それとも、より長い連続の 6?
「はい、6 が得られるようにしたいんです」だと上に回答を書いた皆さんが優しくキレるかも。

あと、例なんだろうけど $a や $b は地雷踏むことがあるから気をつけてね。

456:nobodyさん
07/10/29 13:25:31
use strict;
use warnings;
test('1111222' => 1 );
test('1111222' => 2 );
test('111122211' => 1 );
test('111122211' => 1 , 1);
test('1111136' => 1 );
sub test {printf "%s:%s:%s\n",$_[0],$_[1],_test(@_)}
sub _test {
local($a,$b);
(sort {$b<=>$a} map {length($_)} ($_[0] =~ m{($_[1]+)}g) )[ $_[2] ? -1 : 0 ];
}


457:nobodyさん
07/10/29 17:04:12
my $i = '1' ;
print +( length ) . qq{\n} for split /[^$i]+/ ,$a ;


458:456
07/10/29 19:24:03
見直したらgdgdだったので修正しとく
sub _test { ( sort map length,$_[0] =~ /(${_[1]}{2,})/g )[$_[2] ? 0 : -1] }



459:nobodyさん
07/10/30 23:38:44
一つのファイルで処理がたくさん書いてあって分岐させる時に、
例えば
$mode = $cgi->param('mode');
というデータを受け取って、処理の場合わけをする場合どういう書き方がエレガントなんでしょうか?

現状は
if ($mode eq 'post') { &post}
elsif ($mode eq 'edit') { &edit;}
elsif ($mode eq 'delete') { &delete}
else { &error}

こんな感じなのですが、それは初心者の書き方だって馬鹿にされました。
悔しいのでもっと効率的な方法があったら教えてください。

460:JAPU ◆lVJAPUTeX.
07/10/30 23:52:20
>>459

エレガントかは分からないけど、分岐がある程度多い場合はこんな書き方だとすっきり書けるかと。

%actions = (post => \&post,
edit => \&edit,
delete => \&delete);

if(exists $actions{$mode}) {
$actions{$mode}->();
} else {
error();
}

数個程度なら if で分岐されちゃってもいいと思いますし、実際そうしています。


461:nobodyさん
07/10/30 23:58:03
>>459
それでいいんじゃね?
各サブルーチンに戻り値があるなら「三項演算子」って手もあるし、
以下の様なやり方もあるけど、普通に書いてメンテ出来るものならば
バカにされても放置しとけば?

my %hash = (
  post => sub { 1 } , # &post の内容を書く
  edit => sub { 2 }, # &edit の内容
  delete => sub { 3 }, # &delete の内容
) ;
print $hash{'edit'}->() || q{error} ; #q{error} には&error あたりを、、、

ソース全体を見たら綺麗な書き方があるかもしれんが、
それに関しては情報不足。

462:nobodyさん
07/10/30 23:59:04
ああ、丸かぶりだorz...

463:nobodyさん
07/10/31 00:10:35
せめて、CGI::Applicationくらい使っとけって話なんじゃ。
if文分岐も分かりやすいと思うが、へたに小細工するとますますへたっぴに見える。

464:nobodyさん
07/10/31 12:11:23
三項演算子ってタマに見かけるけど読みづらいんだよな。
使いたくない書き方No1かも。

465:nobodyさん
07/10/31 13:29:29
 $expr1 ? $expr2
: $expr3 ? $expr4
: $expr5 ? $expr6
:      $expr7
;

書き方か頭が悪いんだろ

466:至急
07/10/31 15:17:23
CGIを自宅出張でサポートしてくれる方募集します。
CGIに詳しく都内に来れる方であれば可能
一日日払い即金で払います。
詳細はメール下さい。


467:nobodyさん
07/10/31 15:47:41
>>459
エレガントかしらないけどこんなパッケージ作ってる。
(不要箇所削ったのでそのまま動くか不明)
package Local::Base;
use strict;
use warnings;
our $DEBUG = 0;
sub class {ref$_[0]||$_[0]||__PACKAGE__}
sub new {(bless {} => class( shift() ))->init(@_)}
sub mode :method {shift->param('mode',@_)}
sub method_name :method {shift->{method_name}->{ shift() }}
sub default_method :method {die('不正なmodeを受け取りました')}
sub init :method {
my $self = shift;
my %param = @_;
$self->{method_name} = $param{method_name} || {};
return $self->run_method( $self->mode , @_ );
}
sub run_method :method {
my $self = shift;
my $method = $self->method_name( shift );
$method = 'default_method' unless $method && $self->can( $method );
return $self->$method(@_);
}
1;


468:nobodyさん
07/10/31 17:36:51
>>467
外部からinitとか呼ばれちゃわない?

469:nobodyさん
07/10/31 19:51:49
>>467 method_nameチェックしてるから大丈夫

使い方も書いたつもりだったんだけど書けてなかった。
#!/usr/bin/perl
use strict;
use warnings;
use base qw(Local::Base);
my $r = eval{
__PACKAGE__->new(
method_name => {
edit => 'edit',
post => 'post'
}
)
} || $@;
print CGI->header,$r,"\n" unless ref $r;
######################################################################
# editの動作を定義
sub edit :method {
my $self = shift;
print $self->header;
print "EDITモード";
return $self;
}
1;


470:nobodyさん
07/10/31 20:11:48
sub edit :method {
この :method って何の意味だっけ
perlsub見ても載ってないや
変数にも付けれた気がしたが

471:nobodyさん
07/10/31 21:09:19
perlsub に載ってるし、perldoc attributesすれば詳細分る(perl5.8.1)。
perl attributes でググれば日本語のサイトも沢山出る。
変数に付けられるのは 5.8系

472:nobodyさん
07/11/01 01:06:18
実際、CGI::Applicationとか使うと効率的になるの?
自分でゴチャゴチャ作るよりも。使ってる人いる?

473:nobodyさん
07/11/01 02:26:10
CGI.pmで書くには複雑だけど、Catalystとかのフレームワーク持ち出すまでもないときには使える

474:nobodyさん
07/11/01 10:48:57
> CGI.pmで書くには複雑だけど、Catalystとかのフレームワーク持ち出すまでもないときには使える

CGI::Application もフレームワークじゃないの?


475:nobodyさん
07/11/01 17:27:41
>>470
:methodは組み込みのattribute
Attribute::Handlers使うと自作のattributeも作れる。
…がいつ仕様が定まってなくて変更があるかもってどっかで読んだ気がする。

>>474
・自分しかいじらない
・少人数で知識の共有が容易
・マニュアルが整っている
のどれかなら自作のフレームワークの方が慣れてるだろうし開発効率いいんじゃないかな?
フレームワーク自体のメンテナンスが(出来る|しなきゃいけない)のはデメリットか?

既製のフレームワーク使うのは
・他の人と知識の共有しやすい
・ドキュメントがある/(第3者も使ってるので)ノウハウが検索しやすい
・フレームワーク自身のメンテナンスを(あまり)しなくていい
ってとこかな?


476:nobodyさん
07/11/01 18:07:59
>>475
???

477:nobodyさん
07/11/02 11:22:36
/public_html/test/log.txt を、UTF8→SJISに変換して、
別名で保存するにはどうすればいいでしょうか

Perl 5.8.8なのでuse Encode;を利用する、読み取り専用で1行ずつ変換処理する
あたりまでは勉強しました。スマートな方法よろしく御教示おねがいします

478:nobodyさん
07/11/02 13:22:56
ログをShift_JISに変換ではなく、表示する時にsjisに返還して表示するようにして、
データはutf-8のままのほうがよくないかな。

479:nobodyさん
07/11/02 13:29:46
>>477
まずは自分で書いた糞コード晒すのが先じゃね?

480:nobodyさん
07/11/02 14:01:12
>>477
おまえさんの「スマート」の基準が判らんのだが、
Encodeで何か不足でもあったのか?

481:nobodyさん
07/11/02 16:43:20
nkf -s log.txt > log.sjis.txt

482:nobodyさん
07/11/02 17:17:33
>>481
すげー!、シェルスクリプトですよね?

sshができない場合はこんな感じで利用すればいいのかな
system("nkf -s log.txt > log.sjis.txt");

1つ気になるのがjcode.plなど元の文字コードを指定するのがあると思うのですが、
&jcode::convert(\$_, 'sjis' ,'utf8');
nkfでは気にしなくても自動判別完璧なのでしょうか?

483:nobodyさん
07/11/02 17:34:58
もはやPerlに何の関係もない

484:nobodyさん
07/11/02 17:51:47
>>477
use Perl6::Slurp;
use Jcode;
$c = slurp "log.txt";
Jcode::convert(\$c, "sjis", "utf8");
open($fh, ">", "log.sjis.txt");
print $fh $c;

>>482
jcode, Jcode, nkfは、判別できる場合は判別してくれる。

485:nobodyさん
07/11/02 22:18:35
>>484
頭足りてないのは理解した。

486:nobodyさん
07/11/05 07:24:22
gethostbynameについての質問です。
コマンドプロンプトだとnslookup -> set type=***
UNIXならhost -t ***
でクエリタイプを設定できるんですけど、PERLの場合はどうやるのでしょうか。


487:nobodyさん
07/11/05 10:55:44
>>486
URLリンク(search.cpan.org)

488:nobodyさん
07/11/05 11:20:15 6nXAnQ+n
ファイルのオープンでエラーになります。
open(FILE,">".$workFname) or die "Cannot Output File: ";

あらかじめファイルを持たせておいて、書き込み権限を与えておけば
成功しますが、新規にファイルを作成できません。
どうすればいいのでしょうか。


489:nobodyさん
07/11/05 12:21:09
ディレクトリのパーミッションかな

490:nobodyさん
07/11/05 13:05:21
>>489
解決しました、ありがとうございます。

491:nobodyさん
07/11/05 13:19:35
die するときに $! も含めるべき。

492:nobodyさん
07/11/05 13:22:45
 自分の環境では、相対パスではエラーになるので、絶対パスに書き換えてます。
できれば相対パスのままで動くようにしたいです。どうすれば解決できるか分かる
方はおられませんか。まあ、あまり解決策が複雑なら、とりあえずあきらめてこの
ままにしておくつもりですが。

493:nobodyさん
07/11/05 14:36:06
>>492
まず「何を」相対パスにしようとしているのかくらい書こうぜ。
あと「自分の環境」は書かなきゃ誰にも伝わらない。

494:nobodyさん
07/11/07 09:25:24 R3XG8Srf
Perlで関数の引数に二次元配列を渡すのは無理ですか。

495:nobodyさん
07/11/07 09:32:37
>>494
ヒント:リファレンス

496:nobodyさん
07/11/07 11:46:06 R3XG8Srf
次のソースのsub kansuのforeachの行は何と書けば正しく動きますか
#!perl/bin/perl
use strict;

sub kansu{
my $ref1 = shift;
my $value1;

foreach $value1($$ref1) {
print $value1 . "\n";
}
}

sub main{
my @databox1 = (13,1,6,3,9,8);
my $ref1 = \@databox1;
usort_kansu(@databox1);
}

main();


497:nobodyさん
07/11/07 11:47:42
誤: usort_kansu(@databox1);
正: kansu(@databox1);

498:nobodyさん
07/11/07 12:36:16
>>496
「言語的意味で」正しく挙動させるには
foreach $value1($ref1) {

(多分)あなたの望んだ挙動にするには
ソースの殆どに手を入れる必要がある。

∴ 本読んでからどうしても分らんかったら
 質問し直せ

499:nobodyさん
07/11/07 14:24:36
>>496-498
#!perl/bin/perl -w
use strict;

sub kansu {
  my $ref1 = shift;
  # my $value1;

  foreach my $value1 (@$ref1) {
    print $value1 . "\n";
  }
}

sub main {
  my @databox1 = (13,1,6,3,9,8);
  my $ref1 = \@databox1;
  kansu($ref1);
}

main();

500:nobodyさん
07/11/07 15:22:14 vLJSXT0R
コーディングじゃないのですが該当スレが見当たらず、新規スレにするような質問でもないと思いこちらに質問します。

.qmailからperlスクリプトを呼び出しているのですが、その場合エラーログを取るにはどうしたらよいのでしょうか?
不正終了しているようなのですが、原因がつかめません。



501:nobodyさん
07/11/07 15:43:21
eval { require スクリプト; };
if ($@) {
open(LOG, ">>/path/to/ログファイル名") or die;
print LOG "WARNING: $@";
close(LOG);
}

こういうスクリプトをqmailから呼び出せばどーよ

>499
forearch行を書き換える条件だからforearch my $value (@_){ って書いて欲しかったのかと・・

502:501
07/11/07 15:59:10
foreach $value1($ref1,@_) {

こうか

503:500
07/11/07 16:13:30
>>501
ありがとうございます。
試してみます

504:nobodyさん
07/11/07 18:20:14
STDERRに吐いた文字はqmailのログにのこるでしょ?
ログが見えないならプログラムを置くべきではないと思う。

505:nobodyさん
07/11/07 18:46:18
>>504に同意だけど、
とりあえず、STDERRをファイルにでもリダイレクトすればどうなん?

506:500
07/11/07 19:59:45
>>504
qmailのログとはmaillogでしょうか?
スクリプトからは何もログを吐いていないんです。

sudoでapache権限で実行してるからログ吐かないのかな。

507:nobodyさん
07/11/07 20:05:11
|/path/to/script.pl >> /path/to/error.log 2>&1

508:500
07/11/07 20:13:46
>>507
ありがとうございます。
.qmailでもログ指定しないといけないんですね。



509:nobodyさん
07/11/07 21:32:38
>>500
何かとんでもない設定でqmail動かして無いか?

510:500
07/11/07 22:29:30
>>509
いえ。
.qmail内でperlのみsudoしてapache権限で動かしてます。
qmailはvpopmail権限で動かしてますよ。

>>507さんでログ取れました。m(__)m

511:nobodyさん
07/11/09 15:33:58
UTF-8でperlを書きたいのですが、文字コードをperlにどのように知らせればよいのでしょうか?

512:nobodyさん
07/11/09 15:47:46
>>511
plagger のソース読むといいよ!

513:nobodyさん
07/11/09 17:28:52
>>512
それ無理に流行らそうとしなくていいよ

514:nobodyさん
07/11/09 17:49:37
tokuhirom自重

515:nobodyさん
07/11/09 18:08:33
Perl死んじゃうん?

516:nobodyさん
07/11/09 18:57:53
(・∀・)ニヤニヤ

517:JAPU ◆lVJAPUTeX.
07/11/09 18:59:46
>>511

use utf8;


518:nobodyさん
07/11/09 19:09:09 8S2oyKnm
>511
use dan;
で解決するよ。

519:nobodyさん
07/11/09 19:26:50
tokuhirom の直近の発言をコピペすることによりスレを荒らす tokuhacks.

520:nobodyさん
07/11/09 21:31:54
plaggerのソース読めって言ってるやつのほとんどはplaggerのソースが読めない

521:nobodyさん
07/11/09 22:28:46
コード解説読めってならともかくコード読ませたってしょうがないだろ。Perlなんだから

522:nobodyさん
07/11/09 23:35:40 8S2oyKnm
tokuhiromのソース読めって言ってるやつのほとんどはtokuhiromのソースが読めない


523:nobodyさん
07/11/09 23:39:07
プラガー(笑)

524:nobodyさん
07/11/10 10:49:28 Z9OcedPC
web上の圧縮ファイル(.lzh)をダウンロードして保存、
さらにその圧縮ファイルを解凍するスクリプトを作りたいです。

例えば、LWP::Simpleを使った場合
my $dat = get('URLリンク(hoge.com)');
の後はどう処理していけばいいでしょうか?


525:nobodyさん
07/11/10 11:02:39
> の後はどう処理していけばいいでしょうか?

lha 書庫を解凍する処理を行えばよい。

526:nobodyさん
07/11/10 11:03:28
>>524
はい。
URLリンク(www.google.co.jp)

527:nobodyさん
07/11/11 02:16:45
2chみたいに携帯から固有のIDを作りたいんですが
どうすればいいんでしょうか。

528:nobodyさん
07/11/11 07:14:50
>>527
i-mode:UTN
EZweb:HTTP_X_UP_SUBNO
Y!:UA

529:nobodyさん
07/11/11 14:32:10 4iiY3aOI
正規表現について質問です。
urlからファイル名だけを取り出したいです。
例えば、$urlという変数に下の3つのurlがあった場合は
hoge1.html, hoge2.html, hoge3.htmlを取り出したいです。

URLリンク(localhost)
URLリンク(localhost)
URLリンク(localhost)

下のように自分でやってみたのですが、localhostの前の/から取得してしまいます。
if( $url =~ /\/(.*\.html)$/ ){
print $1 . "\n";
}

どうすればやりたい事ができますか?
教えてください、お願いします。

530:nobodyさん
07/11/11 14:35:11
ワイルドカードにすべき部分は「全ての文字」じゃない、「/を除いた全ての文字」だ。

あ、とりあえず ?xxx=hoge とかの引数は考えなくていいよね?


531:529
07/11/11 14:47:19
>>530
レス有難うございます。

>ワイルドカードにすべき部分は「全ての文字」じゃない、「/を除いた全ての文字」だ。
なるほど。でも頭では理解できてもそれをコーディングするとなると・・・
.*の部分を弄ればいいのかなぁ。

>あ、とりあえず ?xxx=hoge とかの引数は考えなくていいよね?
はい、このパターンは今回ありえないっす。

532:529
07/11/11 14:58:10
条件文を下のコーディングに変更したらできました。
if( $url =~ /\/([^\/]*\.lzh)$/ ){

正規表現すげー
>>530さんアドバイスありがとうございました。

533:nobodyさん
07/11/12 08:03:25
.*?も覚えたらいいとおも

534:nobodyさん
07/11/12 16:33:29 XNEEDQVz
そのファイルがバイナリなのかテキスト(shift-jis,euc,utf8)なのかを判断するにはどのようにしたら良いのでしょうか?

最初、linuxの fileコマンドを使用していたのですが誤認識がよくあり使えません。
バイナリなのかテキストなのかだけ分かればいいのですがperlでそれを行うにはどのようにしたら良いのでしょうか?

535:nobodyさん
07/11/12 16:42:39
ファイルテスト演算子

536:nobodyさん
07/11/12 18:17:28 XNEEDQVz
>>535
有難う御座います。
試してみましたが、EUCだったり10文字程度のcp932などの場合に誤認識するようです。

537:nobodyさん
07/11/12 18:33:52
\0が含まれてればバイナリでいいんでないの
それ以外だと各文字コードの仕様を調べて
全データがそれに矛盾してないか判断するしかないと思

538:nobodyさん
07/11/12 18:39:12
正規表現使えばいいじゃない

539:nobody
07/11/13 03:52:36 fKqfq45H
URLリンク(www.jpopfan.co.jp)
上のサイトのようなゲームをperlで作りたいと思っています。
htmlのみでも十分なゲームだとは思いますが、あえてCGIゲームとして作りたいです。
(学校の授業の自由課題であるので・・・)

一応以下のようにhtmlは作ってみました。

<html>
 省略
<body>
<h1>オーケストラ楽器別診断</h1>
<p>次の質問にお答えください♪</p>
<form action="/nussknac/cgi-bin/kadai.cgi" method="post">
<dl><dt>お名前</dt>
<dd><input type="text" name="name" value=""></dd><br>
<dt>Q1. あなたはプライドが高いほうですか?</dt>
<dd><ul>
<li><input type="radio" name="answer1" value="Yes" checked>Yes</li>
<li><input type="radio" name="answer1" value="No">No</li>
</ul></dd></dl>
<p><input type="submit" name="send1" value="送信"><br></p>
</form></body></html>

540:nobody
07/11/13 03:57:04 fKqfq45H
539の続きです。
HTMLのフォームから情報をCGIに送り、最初の質問に対してYesならAの質問、NoならBの質問・・・というように
答えによって質問を分岐させるように作りたいです。
if文でひたすら分岐するというイメージはありますが、どうすれば、送信ボタンを押した時に次の質問ページにリンクさせる事ができるかが分かりません。
質問ページは一つ一つ作りたいです。
よろしくお願いします。

541:nobodyさん
07/11/13 04:18:50
そういうアルゴリズムも含めて課題になってるんじゃねーのか・・・まぁいいけどさ。
で、htmlはともかくどこまでperl書いたのよ。まさか1行も書かずに相談しにきてるわけじゃあるまい?

542:nobodyさん
07/11/13 06:54:14
何日か前に別のスレでも見たけど、ここで聞いてて課題間に合うの?

543:nobodyさん
07/11/13 08:58:39
あみだくじでいいのか、選択によってポイントがたまってその結果で振り分けられるのか。
色々ロジックはあると思うけど、そこら辺はどうするのかな

544:nobodyさん
07/11/13 09:17:32
>542
提出日まで1〜2週間とかなら大丈夫じゃない?

その昔、C言語の授業があって、その授業終了直後に提出したら怒られたことがあったなあ(笑)
ごめん、確かに授業聞いてませんでした。

545:nobodyさん
07/11/13 09:19:51
あみだくじでいいなら、
<li><input type="radio" name="answer" value="Aの質問のURL" checked>Yes</li>
<li><input type="radio" name="answer" value="Bの質問のURL">No</li>
ってして、
print "Location: answerの値\n\n";
でリダイレクトさせていけばいいだけでは?

546:nobodyさん
07/11/13 10:36:02
HTMLでおk

547:nobodyさん
07/11/13 11:10:10
リンク元のURLに%??%??〜が含まれてる場合に、その文字をデコードしてUTF-8として表示しようとしています。
元の文字コードがUTF-8のときは問題なく表示できるのですが、
文字コードの判別を含めてやる場合どうやったらいいのでしょうか?
Perlのバージョンは5ですが、プロバイダ(@nifty)のサーバーのため標準モジュールを使用できません。
いきなり変換が難しいならUTF-8か否かを判別できれば、
UTF-8の場合→直デコード
UTF-8でない場合→直デコード→jcode.plで変換
でいいのかもと考えているのですが、UTF-8か否かの判別法がわかりません。
よろしくお願いします。


548:nobodyさん
07/11/13 15:19:48 lcS1D/Cp
539です。
一応perlでは以下のように作りました。
#!/usr/local/bin/perl

use CGI;
$query = new CGI;

$q1 = $query->param('answer1');
if ($q1 eq Yes) {
open(F, ">>q2.html");
} else {
open(F, ">>q3.html");
}

でもこれだとエラーが出てしまいます。
どのように直せばいいでしょうか。
リンクのさせ方など教えて下さい。
課題提出は12月までです。
違うスレには書いていないので私ではないです。

549:nobodyさん
07/11/13 15:34:47
use constant Yes => 'Yes';


550:nobodyさん
07/11/13 15:56:31
課題は自分でやれwww

551:nobodyさん
07/11/13 16:29:42
>>54
こんな感じはどうよ。適当に書いたからちゃんと動くかどうか知らんけど。
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use FileHandle;
use File::Spec;

my $cgi = CGI->new;
my $fh = FileHandle->new;
my $html_dir = '/path/to/html/dir';
my $output = $cgi->header( -type => 'text/html' );
my $fn = q{};

if ( $cgi->param('answer1') eq 'Yes' ) {
    $fn = 'q2.html';
}
else {
    $fn = 'q3.html';
}

$fh->open( File::Spec->catfile( $html_dir, 'q2.html' ) '<');
my $data = do { local $/; <$fh> };
$fh->close;
$output .= $data;

print $output;


552:nobodyさん
07/11/13 16:30:23
レス番ミスった。
>>54
>>548

553:nobodyさん
07/11/13 16:31:27
さらに訂正。
誤 $fh->open( File::Spec->catfile( $html_dir, 'q2.html' ) '<');
正 $fh->open( File::Spec->catfile( $html_dir, $fn ) '<');

554:nobodyさん
07/11/17 14:33:33 GlJQ98hk
URLリンク(oshiete.new-akiba.com)
ここを見ながらコマンドプロンプトを操作しているのですが
ダウンロードされる段階まで行っても
Can't locate strict.pm in @INC (@INC contents: .) at C:\Program Files \warrick\warrick.pl line8.
BEGIN failed--compilairion aborted at C:\Program Files \warrick\warrick.pl line8.
と出ます。

意味もそもそも分からないのですが、解決方法教えてください

555:nobodyさん
07/11/17 15:24:40
>>554
エラーの原因は@INCが空になってるから。なんでそうなってるのかは知らん。
ActivePerlを入れ直してみたら?

あとここはコーディングスレだからスレ違いだと思わなくもない。

556:nobodyさん
07/11/17 20:14:46
>>555
最新版入れてみたけど同じでした
質問スレいってきます

557:nobodyさん
07/11/17 20:58:37
>>にアンカを3つだけつけたいんだけど、これだと同じとこにリンクをかけてしまいます。
どうすればいいんでしょうか。
for($i=0;$i<3;$i++)
{
$str=~s/>>[0-9]{0,10}[-]{0,1}[0-9]{0,10}/<a href="$_[1]p=$&">$&<\/a>/;
$str=~s/p=>>/p=/;
}

558:nobodyさん
07/11/17 22:00:49
$i = 0; $buf =~ s/(>>\d+)/$i++ < 3 ? "LINK:$+" : $+/egs;

559:556
07/11/17 22:23:56
>>558
ありがとうございます。
そんな書き方知りませんでした。

560:557
07/11/17 22:26:54
>>559
556じゃなくて557でした

561:nobodyさん
07/11/18 19:50:49
自作モジュールをロードするときに、BEGINブロックで@INCに追加してからBEGINの外でuseするのは外道


562:561
07/11/18 19:51:25

「ですか?」が抜けた。
すまぬ

563:nobodyさん
07/11/18 20:25:36
>>561-562
外道かどうか知らんが、普通は use lib でしょ。

564:nobodyさん
07/11/19 06:13:08 s0DcKkZM
これからプログラムをやりたいと思ってます。
いまからやるならperlは覚えたほうがいいですか?

565:nobodyさん
07/11/19 06:19:02
PHPでいいよ

566:561
07/11/19 08:54:57
>>563
ありがt

567:nobodyさん
07/11/20 11:38:30 PLctc9ni
多重起動の禁止はできたが、解放がうまくいかない。
どこが悪いか教えてください。

#登録&多重起動禁止
use Win32::API;
use Win32::Mutex;
my $mutex = Win32::API->new("kernel32","CreateMutex",["N", "N", "P"], "N");
die "二重起動" if(Win32::Mutex->open('TestProgram123'));
$mutex=Win32::Mutex->new(1, 'TestProgram123');


#解放
my $releacemutex = Win32::API->new("kernel32","ReleaseMutex",["N"], "N");
$releacemutex->call($mutex);


568:576
07/11/20 14:43:38 PLctc9ni
自己解決

Win32-API使わなくてもできるのねぇ

569:nobodyさん
07/11/21 03:27:48
むしろ何の為のラッパーだよ

570:nobodyさん
07/11/23 21:52:32 BH2PwYj+
質問失礼します。

AとBの文字があるとき、文字列の中のBAを全てABにしたいときはどのような置換をすればいいのでしょうか?

例えば、
$s = "AABABABBBA";
と文字列があったら、
$s = "AAAAABBBBB";
にしたいのです。

$s =~ s/BA/AB/g;とすると、置換後を判定してくれないので、困ってます……

571:nobodyさん
07/11/23 21:58:25
>>570
たとえば。
$ perl -e '$s = "AABABABBBA";while($s=~s/BA/AB/g){}print $s;'

572:nobodyさん
07/11/23 22:00:18
>>570
その場合、これ以上置換できなくなるまで「$s =~ s/BA/AB/g;」の処理を行わなければならない。すなわち、ループである。
s/BA/AB/g;は、置換を行った回数を返す。つまり、0を返すまで処理を継続したいのだから、while文が使える。
したがって、次のようになる。
while($s =~ s/BA/AB/g;){}

whileのあとの{}の中に何も入っていないが、これでお望みどおり動くようである。

573: ◆TWARamEjuA
07/11/23 22:31:04 BE:6970188-2BP(6825)
sortって云う手もあるよなぁ♪
print join "", sort split "", "AABBABABBBABAABBAABABABABA";

574:570
07/11/23 22:36:47
>>571-573
返信ありがとうございます。
無事whileを使う方法で出来ました。

575:nobodyさん
07/11/24 07:56:01
>>574
遅レス。
他の文字が存在しないと云う条件下なら、素直に文字数カウントするって手もある
perl -le 'my $s = "atataaattttatatat" ; print "a" x ( $s =~ s/a/a/g ) . "t" x ( $s =~ s/t/t/g ) ;'
ま、他の文字が存在してても外側ループ一個つけるだけだけどね。

蛇足だと思ったんだが、、、、

576:nobodyさん
07/11/25 15:53:28
ちょっと分からないので質問させてもらいます。
手作りで掲示板みたいなのを作ってるんですけど
Location:で二重投稿を禁止したくて書いたんですが投稿したあとにLocation:って文字が表示されて飛ばないんですけど
なんでしょうか?
普通なら飛ぶのに飛びません・・・。

誰か分かる方が居れば教えてください。

577:nobodyさん
07/11/25 16:07:12
>>576
content-typeの前に書いてみ

578:nobodyさん
07/11/25 16:35:27
>>577
出来ました。
ですが書き込みがされなくなりました・・・。

579:nobodyさん
07/11/25 17:55:01
そもそもがどんな仕組み何だかわかんねーと答えようがねーよw
こっちはエスパーじゃないんだからさw

580:nobodyさん
07/11/25 18:30:55
>>579
URLリンク(www.uploda.org)
これなんですが上手く動作しなくて・・・。

581:nobodyさん
07/11/25 18:47:07
一番最初に

print "Content-type: text/html\n\n"; # データ形式

を書いてるのが不味いような気がするのは気のせいかな。

582:nobodyさん
07/11/25 18:47:57
>>581
他のところに置いたりすると上手く動作しないんです・・・。

583:nobodyさん
07/11/25 18:50:17
あと、$locationって変数、どこで使ってるんだろ。

584:nobodyさん
07/11/25 18:55:24
勉強し直しておいで。

585:nobodyさん
07/11/25 18:55:39
あ、それは書き忘れましたがKENTWEBさんのところのをちょっと借りたやつです。
# リロード
if ($location) {
if ($ENV{'PERLXS'} eq "PerlIS") {
print "HTTP/1.0 302 Temporary Redirection\r\n";
print "Content-type: text/html\n";
}
print "Location: $location?\n\n";
exit;
}
これがサブルーチンのwriteの最後に置いてました。

586:nobodyさん
07/11/25 18:56:09
とりあえずヒントは、
・Location: はHTTPヘッダに出力する
・ヘッダとボディの区切りは空行で示す

587:nobodyさん
07/11/25 19:08:15
前も書いたけど、kentwebのってデリミタに<>使うの好きだねえ。データがでかくなってくると、
2バイトも勿体無いと思う。

588:nobodyさん
07/11/25 19:10:08
>586
難しそうですが頑張ってみます。

589:nobodyさん
07/11/25 21:12:48
2バイトさえ気になるような人はデミリタに何使うんだろ。

590:nobodyさん
07/11/25 21:13:37
デリミタねw

591:nobodyさん
07/11/25 21:51:10
タブ?

592:nobodyさん
07/11/25 21:57:24
俺はタブ。excelにも貼るだけで、データやりとりできるし。

593:nobodyさん
07/11/26 01:21:50
俺は適当に,にしてた

594:nobodyさん
07/11/26 09:34:29
>>593
CGIでHTMLを吐く前提なら、 , を入力されると面倒なことになるんだよな。
< > なら < > ってできてしまうからいいんだけど。

595:nobodyさん
07/11/26 09:35:03
↑失礼
< > なら &lt; &gt; ってできてしまうからいいんだけど。

596:nobodyさん
07/11/26 17:00:07
, は&#44;でいいんじゃね?俺もタブ使うけど

597:nobodyさん
07/11/26 19:49:54
ちょいと質問を。

今ソフトバンククリエイティブのCGI/perl ハンドブック第3版
のCGIサンプルで掲示板を作ったのですが掲示板にメッセージが書き込まれなかったらエラーを出そうと
思って四苦八苦しているんですがperl6はよく分からなく苦戦しています。
誰かこの本を持っていて、分かる方がいればご教授お願いします。

598:nobodyさん
07/11/26 20:23:48
>>597
その本持ってないから知らないけど、本当にperl6ですか?

#このスレはご教授ってOKなんだっけ?



599:nobodyさん
07/11/26 21:19:36
こんばんは。
LWPで、現在取得しているURLの情報を参照する方法ってあるでしょうか。

URLリンク(www.xxx.ne.jp)<)

こんな感じのURLになってるのですが、この ? 以降の情報を取得したいのです。
$responoser->base
では、 ? より前のURLしか返してくれません。
教えてください。

600:nobodyさん
07/11/26 23:26:29
>>598
その使い方も間違ってない以上、突っ込む方が野暮or空気が読めないでおk

601:nobodyさん
07/11/27 03:23:29
質問します

他のサーバー上のテキストファイルを読み込ませたいのですがopen関数ではできないんでしょうか?

602:nobodyさん
07/11/27 03:33:26
できない

603:nobodyさん
07/11/27 03:49:49
>>601
あんたすげーな

604:nobodyさん
07/11/27 06:16:45
童貞で40歳まで行ったら妖精になれるよりすごい発想

605:nobodyさん
07/11/27 07:36:33
ただ、PHPでは同じような方法でできるこの不思議。

606:nobodyさん
07/11/27 08:12:36
だれか599についての回答を・・・


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

4894日前に更新/271 KB
担当:undef