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

このエントリーをはてなブックマークに追加
807769:04/07/14 23:51
>>800
おお、そかそか。
じゃ、とりあえず配列全部なめるmap grep だめジャン。
じゃ、これはどだ?

@array = (..);
foreach(@array[1..$#array]){
not_ok() if $array[0] != $_;
}
print "ok \n";
}

ま、あれだ、判定式サブルーチンに逃がすか、
偽でサブルーチンに逃げるか、って事だけど。
これならいい?
808769:04/07/14 23:53
>>807
閉じブレース余計ですんで、すません
>>807
そんだけごてごて書いた上に、sub not_ok {...} も作れってこと?
しかも、not_ok 内で exit するか、もう1つか2つ細工しないと
結局全部比較する上に、必ず print "ok" が実行されると思うんだが。
いじればいじるほど(ry
トリッキーじゃなくてただの遠周りにしか思えてこないな
811デフォルトの名無しさん:04/07/15 06:50
これからPerlを学ぼうと思っている者です。
よろしくお願いいたします。
Active Perlをインストールしようとすると

There is a problem with this Windows
Installer package. A program run as part of
the setup did not finish as expected. Contact
your support personnel or package vendor.

と表示され、インストールできません。
最近購入したばかりのパソコンなのですが
パソコンに原因があるのでしょうか?
分かる方いらっしゃいましたら教えてくださいm(__)m
よろしくお願いいたします。
>>811
未経験なので予想で。
1.ダウンロードしたファイルが壊れてる。→再ダウンロード
2.インストール権限がない。→administratorとかでログイン
たぶん2かな
>>809
仰るとおり。
じゃ、これは?

@array = ($a, $b, $c, $d);
LABEL:{
foreach(@array[1..$#array]){
last LABEL if $array[0] != $_;
}
print "ok \n";
}

これなら可変個要素比較し、偽で処理抜けるし
@array = ($a, $b, $c ...);
print (join('',@array) =~ /^$a+$/ ? 'OK' : 'NG');
>>815
756、763を読め。

数値限定だが、
@array = ($b, $c ...);
print join('', map "$_,", @array) =~ /^(?:$a,)+$/ ? 'OK' : 'NG';
ならOK
特定のファイルの仮想パスを絶対パスに変換する関数なんてあるんでしょうか?aspのServer.Mappathみたいな。
818811:04/07/15 17:05
>>812-813

返信ありがとうございます
再ダウンロードは何度かしてみましたが
やっぱりできません。

2のadministratorとかでログインというのは
どうやればいいのでしょうか?

何も知らなくてすいませんです。
よろしくお願いします。
use List::Any;
print "ok" if all { $a == $_ } ($b, $c, $d);

>>818
Windowsの話だからPC初心者板かな
821デフォルトの名無しさん:04/07/16 19:09
find . -name "*.[ch]"|while read l;do echo $l;mv $l $l.bak;sed -e s/^typedef */typedef /g < $l.bak > $l;rm -f $l.bak;done

シェルでよくこのような処理をするのですが、Perlでもっと簡単にやる方法はありますか?
>>821
対象ファイル名を表示しなくてもいいなら

perl -i -pe 's/(?<=^typedef) */ /g' `find . -name "*.[ch]"`
winでTkやってて、んでダブルクリックで起動してるんだけど、
キーボードのボタン認識ってどうするんだろう?
>>822
凄い!プロセス起動のコストがないので爆速ですね!!
-iオプションの威力がよく分りました。
>818
親によってWinにプログラムを組み込めない処置されているってことさ
親に頼め

もしくはダウンしたファイル本当にwin用なのか?msiなら無事入れられたぞ
Subject: ActivePerlのインストールについて
> windows98の環境にActivePerl5.6.1をインストールしようとinstmsi.exe(バージョン2.0)を入れた後、
> ActivePerlを入れると下記のようなエラーメッセージが表示されます。
> There is a problem with this Windows Installer package.A script required for this install to
> complete could not be run.Contact your support personnel or paceage vendor.

Res
> IE5.0以上が入っていないとインストール時に問題が出ると言う話は
> 聞いたことがあります。

> ご回答ありがとうございます。
> ブラウザはIE6.0 SP1 を使っています。

> DOSからインストールしたら成功しました。

> ダウンロードしたのが、msiファイルじゃなかったに違いない。(たぶん)
> MSIとAS Packegeとあったはずだけど。
> instmsi.exeを入れた意味が無いw(今後のためなら、問題無いが)

> msiファイルは
> ttp://www.activestate.com/Products/Download/Download.plex?id=ActivePerl
> の一番上のMSIをダウンロードしたので間違いではなかったと思います(たぶん)
> 2段目のAS PackegeをDOSから入れて成功しました。

一部省略済み
すいません。
@arrayに1〜100の数字が重複なしで20個くらい入ってまして、
その中にない数字80個くらいを配列の形で取り出したいんですけど、
どのようにすればいいのでしょうか??

>>827
#!/usr/bin/perl

my @array = (1,5,15,22,33,45,46,51,55,58,59,60,69,71,72,75,80,81,82,90,95,98,99);
my %Check;

@Check{ 1 .. 100 } = (1) x 100;
delete $Check{$_} foreach @array;

my @Surplus_array = sort grep exists $Check{$_}, keys %Check;

print "$_\n", foreach @Surplus_array;
my @a;
{
my %temp;
@temp{ @array } = ();
for(1..100){
push @a, $_ unless exists $temp{ $_ };
}
}
>>828
827じゃないけど、deleteって何かコスト高そうでBenchとってみた。
0 代入してtrue判断するよりも、 delete/existで判断した方が早いんだな
勉強になった。
>>828,829さん
なかなかアイディアが浮かばずできなかったのですが、
大変参考になりました。
ありがとうございます。
$a = "hello";

print "$a world";

出力: hello world

なんですが、出力をhelloworld とくっつけて表示させてい場合、

print "$aworld";

じゃ、だめじゃないですか。これってどうやって解決したらいいんですか?
{}
834833:04/07/19 10:48
記号書いただけじゃ分からんな・・・。

"${a}world"
$a."world"
print "${a}world";

で、行けました!ありがとう833
$aworld = "helloworld"
print "$aworld";
837836:04/07/20 16:28
syntax error at test.pl line 2, near "print"
Execution of test.pl aborted due to compilation errors.

orz
ダサッ
1行目にセミコロンがない〜♪
えっと

@test = ("test", "test2", "test3");

に対して、
$name = "test";
という変数があったとして、

@$name[0]

のように、変数内の文字列から配列を呼び出したいのですが、
どういった方法があるのでしょうか
>>840
eval("@" . $name ."[0..2]");
おぉ
どうもありがとうございます
PAR: Perl のスクリプトを Windows 用の実行ファイル (exe形式) に変換する
http://namazu.org/~satoru/diary/20040716.html

という記事を参考にPARを使ってみようと思ったのですが、
nmakeを使ってのPAR-0.85のコンパイルに失敗します。
PAR-0.85を公式サイトよりDLして、解凍し、プロンプトから、
perl Makefile.pl
nmake
とすると、
NMAKE : fatal error U1064: MAKEFILEが見つかりません、またターゲットが指定されていません。
Stop.
となり、うまくいきません。他のモジュールのコンパイルはうまくいくのですが、
これは何が問題なのでしょうか?
nmake -f Makefile とかすりゃイインジャネーノ
846デフォルトの名無しさん:04/07/21 16:09
いつの間に5.8.5が出たんだ。
つい先日インストールしたばかりなのに。
847デフォルトの名無しさん:04/07/21 18:37
$str = "abc";
$reg = "/a/";

print "Match!" if($str =~ $reg);

Match! と出力させたいのですがどうすればいいですか?
>>847
普通なら、
  $str = "abc";
  $reg = "a";
  print "Match!" if $str =~ /$reg/;
とするとこだが、あくまで
  $reg = "/a/";
にこだわるなら、
  print "Match!" if eval("$str =~ $reg");
とか。
849デフォルトの名無しさん:04/07/22 00:48
すみません、質問です。

Socketを使ってWeb上のリソースを取得しようと考えているのですが、
リクエストした先のURLがリダイレクションを行った場合、そのリダイレクション
を追跡してリソースを取得することは可能でしょうか?


具体的にはSocketを使ってamazon.co.jpの検索結果を読み込みたいと
思っているのですが、amazonでは検索結果をリダイレクションして出力する
ためか、Perl側で何も取得できないようです。

たとえばAという人のBというアルバムを検索すると
GET exec/obidos/external-search/?mode=music-jp&keyword=A B

該当するAという人のBというアルバムのページがあった場合、
exec/obidos/ASIN/B00005LN4Q/qid%3D109042..../250-5281286-9396....
といったURLにリダイレクションして出力される

Google等で検索してみたんですが、どうも分からなかったので、ご質問させて
頂いた次第です。何卒、ご教授を・・・。
>>849
Amazonの検索を使いたいならAWSを使えといってみる
>>850さん
ありがとうございます!

Amazon Web Serviceですか。こういうのがあったとは知りませんでした。
SOAPを使うようですね。

これならリダイレクション云々に悩む必要もなさそうです。
世間知らずで恥ずかしいばかりです・・・。
>>848
なんか、$strまで展開されそうな気もしますが。
と思ったけど、evalって都合よく解釈してくれるのね。

でも
print "Match!" if eval("$str =~ $reg");
じゃないとMatch!とは表示しないような気がする。
853852:04/07/22 02:50
そういえばこんなの

$str = "abc";
$reg = qr/a/;
print "Match!" if($str =~ $reg);

もあったね。require 5.006 っぽいけど。
>>852
展開されても問題ないじゃんじゃんー
855デフォルトの名無しさん:04/07/22 07:35
$a=4;
$b="*5";
$c=$a $b;

これで$cの値が20になってくれと言っているようなものだ。
$c = eval("$a $b");