in reply to Re^2: converting from string to SCALAR when using strict "refs"
in thread converting from string to SCALAR when using strict "refs"

I don't have ksh or the commands to test, but it might be a simple as predeclaring the hash %proc_id, but you may need to go a bit deeper depending on how $proc_id{} is setup prior to the command. Just a WAG,
# borrowing from [kyle]'s translation, # at program beginning my %proc_id; system("$os_cmd_table{$^O}{pbind} -b $processor $$proc_id{$_} >/dev/nu +ll 2>&1") if defined $processor;

I'm not really a human, but I play one on earth Remember How Lucky You Are

Replies are listed 'Best First'.
Re^4: converting from string to SCALAR when using strict "refs"
by usrlocal (Novice) on Jan 21, 2009 at 19:07 UTC
    I tried out kyles suggestion of putting a '\' before the $processor but got the error message
    Processor is SCALAR(0x15f1a8) and qmgr is QM_P266 In bind_cpu_solaris , Processor is SCALAR(0x15f1a8) In for loop ... In Next Loop ... /usr/sbin/pbind: must specify at least one pid usage: /usr/sbin/pbind -b processor_id pid[/lwpids] ...
    The processor variable is populated in one other location where it looks for pid's of other processes already bound to a specific processor and tries to bind to the same (i.e populate $processor with the same proocessor id). the code is like the below:
    sub get_cpu_used_by_other_processes { my $other_process = shift; my $proc_id = locate_process_id( $other_proc ); my $processor = undef; my $pid = undef; my @cmd_output = `$os_command_table{$^O}{pbind} -q 2>/dev/null +`; die "ERROR:failed to retrieve the bound processors\n" unless ( + $? == 0 ); ##### increase the weight of processors based on used or not # +#### foreach ( keys %{$proc_id} ) { $pid = $$proc_id{$_}; next unless defined $pid; foreach ( @cmd_output ) { $processor = $1, return \$processor if /proces +s\s+id\s+${pid}\s*:\s*(\d+) $/; } } }
Re: converting from string to SCALAR when using strict "refs"
by usrlocal (Novice) on Jan 21, 2009 at 19:31 UTC
    I tried out kyles suggestion of putting in the '/' before the 4processor but get the error message:
    after call to bind cpu:WARNING:failed to bind process xxxxa0 PID 3720 +to processor SCALAR(0x15f1a8)(rcode 256) /usr/sbin/pbind: must specify at least one pid usage: /usr/sbin/pbind -b processor_id pid[/lwpids] ... /usr/sbin/pbind -U [processor_id] ... /usr/sbin/pbind -Q [processor_id] ... /usr/sbin/pbind -u pid[/lwpids] ... /usr/sbin/pbind [-q] [pid[/lwpids] ...]
    The processor variable is populated in one other method too before the bind_cpu is invoked. In this case it looks for other processes and binds to the the same processor:
    sub get_cpu_used_by_other_process { my $other_mgr = shift; my $proc_id = locate__process_id( $other_mgr ); my $processor = undef; my $pid = undef; my @cmd_output = `$os_command_table{$^O}{pbind} -q 2>/dev/null +`; die "ERROR:failed to retrieve the bound processors\n" unless ( + $? == 0 ); ##### increase the weight of processors based on used or not # +#### foreach ( keys %{$proc_id} ) { $pid = $$proc_id{$_}; next unless defined $pid; foreach ( @cmd_output ) { $processor = $1, return \$processor if /proces +s\s+id\s+${pid}\s*:\s*(\d+) $/; } } } }

      OK, get_cpu_used_by_other_process really is returning a reference to a scalar. That being the case, I guess you really do need to use the backslash as I suggested in Re^3: converting from string to SCALAR when using strict "refs".

      my $processor = \`/aa/bin/get_pbind_cpus.ksh`;

      However, you might need to chomp that before doing anything with it because the backticks will give you a newline at the end of the value you're interested in.

      chomp( $$processor );

      Then your offending line 325 can be what you had originally.

      system("$os_cmd_table{$^O}{pbind} -b $$processor $$proc_id{$_} >/dev/n +ull 2>&1") if defined $$processor;

      I hope that helps.